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

时间:2016-10-16 16:59:05

标签: php mysql insert

我有一个将数据导入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++;

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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

TLDR:使用像mysqli_real_escape_string()

这样的特定于数据库的转义函数,而不是使用addslashes()

addslashes()的作用是在需要转义的字符之前返回带反斜杠的字符串。

我打算写下整个解释,但我认为php.net可以更好地解释:

  

在需要的字符之前返回带反斜杠的字符串   逃过一劫。这些字符是单引号('),双引号("),   反斜杠()和NUL(NULL字节)。

     

使用addslashes()的一个示例就是当您输入数据时   由PHP评估的字符串。例如,O' Reilly存储在   $ str,你需要逃避$ str。 (例如eval(" echo   #&39;" .addslashes($ STR)"&#39 ;;&#34); )

     

要转义数据库参数,DBMS特定的转义函数(例如,   mysqli_real_escape_string()用于MySQL或pg_escape_literal(),   应该使用pg_escape_string()for PostgreSQL)来保证安全性   原因。 DBMS具有标识符的差异转义规范   (例如表名,字段名)而不是参数。有些DBMS如   PostgreSQL提供标识符转义功能,   pg_escape_identifier(),但并非所有DBMS都提供标识符转义   API。如果是这种情况,请参阅数据库系统手册   适当的逃避方法。

     

如果您的DBMS没有转义功能且DBMS使用\来   逃避特殊字符,你可能只能在使用此功能时   这种转义方法适用于您的数据库。请注意使用   数据库参数转义的addslashes()可能是导致的   大多数数据库的安全问题。

答案 2 :(得分:0)

看起来你有一个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