Php 将数据插入MySQL,在字段中添加双引号

Php 将数据插入MySQL,在字段中添加双引号,php,mysql,insert,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

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

是什么导致了双引号?插入行时如何删除双引号?我还在查询的值部分尝试了
stripslashes
,但由于字段包含单引号、双引号或其他分隔符,因此会导致错误

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

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

我本来打算写完整的解释,但我认为这本书在解释方面做得更好:

返回一个字符串,该字符串在需要输入的字符之前带有反斜杠 逃脱。这些字符是单引号(')、双引号(“), 反斜杠()和NUL(空字节)

addslashes()的一个示例用法是将数据输入到 由PHP计算的字符串。例如,O'Reilly存储在 $str,您需要转义$str(例如eval(“echo”) “.addslashes($str)。”;“)”;)

为了转义数据库参数,DBMS特定的转义函数(例如。 MySQL的mysqli_real_escape_string()或pg_escape_literal(), pg_escape_string()用于PostgreSQL)应用于安全性 原因。DBMS对标识符有不同的转义规范 (例如表名、字段名)而不是参数 PostgreSQL提供了标识符转义函数, pg_escape_identifier(),但并非所有DBMS都提供标识符转义 如果是这种情况,请参阅数据库系统手册以了解更多信息 正确的逃逸方法

如果您的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

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

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

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

不要使用
addslashes
(它不是MySQL),不要使用
MySQL\u query
和friends(它们已从PHP中删除)。使用准备好的语句。使用PDO(或
mysqli
)是什么导致双引号的“-可能是您共享的代码中没有的内容。首先,我建议不要使用mysql。mysql扩展已被弃用,将来将被删除:使用mysqli或PDO代替好的,感谢关于mysql的提示。有没有关于插入不带双引号的数据的指导?