我有一个将数据导入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
,但由于带有单引号,双引号或其他分隔符的字段而导致错误。
答案 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