向MySQL插入数据,向字段添加双引号


Inserting Data to MySQL, Double Quotes Added to Fields

我有一个脚本,将数据导入到MySQL表中,在插入时,VARCHAR和TEXT字段的开头和结尾都有双引号。我使用addslashes,因为一些字段应该有单引号,双引号,逗号和分号。下面是我的代码:

$csvfile = fopen($csv_file, 'r');
$theData = fgets($csvfile);
$i = 0;
$imports = array();
while (!feof($csvfile))
{
   $csv_data[] = fgets($csvfile, 1024);
   $data = explode(",", $csv_data[$i]);
   $insert_csv = array();
   $insert_csv['id'] = md5($EventID.$PerformerID);
   $insert_csv['EventID'] = addslashes($data[0]);
   $insert_csv['Event'] = addslashes($data[1]);
   $insert_csv['PerformerID'] = addslashes($data[2]);
   $insert_csv['Performer'] = addslashes($data[3]);
   $insert_csv['Venue'] = addslashes($data[4]);
   $insert_csv['VenueID'] = addslashes($data[5]);
   $insert_csv['VenueStreetAddress'] = addslashes($data[6]);
   $insert_csv['DateTime'] = addslashes($data[7]);
   $insert_csv['PCatID'] = addslashes($data[8]);
   $insert_csv['PCat'] = addslashes($data[9]);
   $insert_csv['CCatID'] = addslashes($data[10]);
   $insert_csv['CCat'] = addslashes($data[11]);
   $insert_csv['GCatID'] = addslashes($data[12]);
   $insert_csv['GCat'] = addslashes($data[13]);
   $insert_csv['City'] = addslashes($data[14]);
   $insert_csv['State'] = addslashes($data[15]);
   $insert_csv['StateID'] = addslashes($data[16]);
   $insert_csv['Country'] = addslashes($data[17]);
   $insert_csv['CountryID'] = addslashes($data[18]);
   $insert_csv['Zip'] = addslashes($data[19]);
   $insert_csv['TicketsYN'] = addslashes($data[20]);
   $insert_csv['IMAGEURL'] = addslashes($data[23]);
   $query = "INSERT IGNORE INTO table_name(`id`, `EventID`, `Event`, `PerformerID`, `Performer`, `Venue`, `VenueID`, `VenueStreetAddress`, `DateTime`, `PCatID`, `PCat`, `CCatID`, `CCat`, `GCatID`, `GCat`, `City`, `State`, `StateID`, `Country`, `CountryID`, `Zip`, `TicketsYN`, `IMAGEURL`)
VALUES('{$insert_csv['id']}','{$insert_csv['EventID']}','{$insert_csv['Event']}','{$insert_csv['PerformerID']}','{$insert_csv['Performer']}','{$insert_csv['Venue']}','{$insert_csv['VenueID']}','{$insert_csv['VenueStreetAddress']}','{$insert_csv['DateTime']}','{$insert_csv['PCatID']}','{$insert_csv['PCat']}','{$insert_csv['CCatID']}','{$insert_csv['CCat']}','{$insert_csv['GCatID']}','{$insert_csv['GCat']}','{$insert_csv['City']}','{$insert_csv['State']}','{$insert_csv['StateID']}','{$insert_csv['Country']}','{$insert_csv['CountryID']}','{$insert_csv['Zip']}','{$insert_csv['TicketsYN']}','{$insert_csv['IMAGEURL']}')";
   $n = mysql_query($query);
   if(!mysql_query($query)){
     die("error: ".mysql_error());
 }
   $i++;

是什么导致双引号,我如何在插入行时删除它们?我还尝试了stripslashesVALUES部分的查询,但它会导致一个错误,由于字段有单引号,双引号,或其他分隔符。

您的csv文件可能包含由双引号分隔的字段。可以使用trim函数从字段中删除双引号。例如:

$insert_csv['EventID'] = trim(addslashes($data[0]), '"');

上面的代码将删除$data[0]字符串开头和结尾的双引号

TLDR:而不是使用addslashes()使用数据库特定的转义函数,如mysqli_real_escape_string()

addslashes()的作用是返回一个字符串,在需要转义的字符前面带有反斜杠。

我本来打算写完整的解释,但我认为php.net做了更好的解释:

返回一个字符串,在需要的字符前面有反斜杠逃脱了。这些字符是单引号('),双引号("),反斜杠()和NULL (NULL字节)。

addslashes()的一个例子是当你将数据输入到PHP计算的字符串。例如,O'Reilly存储在$str,需要转义$str。(如eval("回声".addslashes ($ str )."';"); )

要转义数据库参数,DBMS特定的转义函数(例如。mysqli_real_escape_string() for MySQL或pg_escape_literal()pg_escape_string() (PostgreSQL)应该用于安全性的原因。dbms对标识符有不同的转义规范(例如表名,字段名)而不是参数。一些DBMS,例如PostgreSQL提供标识符转义功能。pg_escape_identifier(),但不是所有DBMS都提供标识符转义API。如果是这种情况,请参阅数据库系统手册中的正确的转义方法。

如果您的DBMS没有转义函数,而DBMS使用' to转义特殊字符时,您可能只能在以下情况下使用此函数这种转义方法适合您的数据库。请注意使用用于数据库参数转义的addslashes()可能导致大多数数据库的安全问题。

看起来您有一个csv文件。我建议使用php的内置fgetcsv()来读取文件。这样,您将为每一行获得一个数组,然后可以使用该数组插入到数据库中。

也可以直接导入csv到mysql中,如果你想这样做的话:

LOAD DATA INFILE 'D:/myfile.csv' 
INTO TABLE my_table 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY ''n'
IGNORE 1 ROWS