【发布时间】:2015-12-10 10:08:51
【问题描述】:
导入包含单引号的 csv 文件时遇到问题。在我的 csv 文件中,一些带有单引号(撇号)的数据是这样的。
"User's answer","answer one","answer two","answer three".
我使用逗号 (,) 分隔 csv 中的列。 当我尝试将该数据导入数据库时,它显示错误。这是我的代码。
while(($data=fgetcsv($handle,1000,",")) != FALSE ){
$id = $data[0];
$name = $data[1];//User's name
$sql = "UPDATE my_table SET name='$name' WHERE id='$id'";
mysql_db_query($dbname, $sql)or die("update error".mysql_error());
}
以上代码显示 sql 语法错误。如果我从 csv 文件中删除单引号(')并导入,一切正常。但是将来某些数据可能包含单引号(')。所以,我像这样将mysql_real_escape_string 添加到$name
while(($data=fgetcsv($handle,1000,",")) != FALSE ){
$id = $data[0];
$name = mysql_real_escape_string($data[1]);//User's name
$sql = "UPDATE my_table SET name='$name' WHERE id='$id'";
mysql_db_query($dbname, $sql)or die("update error".mysql_error());
}
但是,它导入到下面我显示的数据库中。
'User''s answer'
这是错误的,因为我想像User's answer 一样保存。我不知道为什么它会节省很多单引号。请给我建议如何解决它。
【问题讨论】:
-
为什么不使用 MySQL LOAD DATA? dev.mysql.com/doc/refman/5.7/en/load-data.html 这会有点棘手,因为您不必只导入 csv 文件而且还需要更新,但它比通过代码解析文件要好 - 另外,使用准备好的语句
-
当我使用 addslashes 而不是 mysql_real_escape_string 时,它会显示类似
'User''s answer'的相同错误。谢谢。 -
mysql_real_escape_string 在 PHP 5.5.0 中被弃用,在 PHP 7.0.0 中被移除。 php.net/manual/en/function.mysql-real-escape-string.php