我有以下脚本将数据从CSV文件上传到我的数据库。
如果CSV中的某个字段有撇号(')
,则会出现问题CSV中的示例数据:
"12345","John","Smith","john.smith@gmail.com","Company Name"
"12346","Joe","Blogg","joe.blogg@gmail.com","Company's Name"
代码I使用:
<?
$link = mysql_connect("localhost", "######", "######") or die("Could not connect: ".mysql_error());
$db = mysql_select_db("######") or die(mysql_error());
$row = 1;
$handle = fopen ("file.csv","r");
while ($data = fgetcsv ($handle, 1000, ",")) {
$query = "INSERT INTO suppliers(`regid`, `firstname`, `lastname`, `email`, `company`) VALUES('".$data[0]."', '".$data[1]."', '".$data[2]."', '".$data[3]."', '".$data[4]."') ON DUPLICATE KEY UPDATE REGID='".$data[0]."', firstname='".$data[1]."', lastname='".$data[2]."', email= '".$data[3]."', company= '".$data[4]."'";
$result = mysql_query($query) or die("Invalid query: " . mysql_error().__LINE__.__FILE__);
$row++;
}
fclose ($handle);
?>
有人可以建议解决方案吗?
非常感谢
答案 0 :(得分:3)
最好的解决方案是升级到PDO或mysqli,并使用它们的参数化查询。
如果你不能,你应该在将数据插入查询之前转义数据:
while ($data = fgetcsv($handle, 1000, ",")) {
$data = array_map('mysql_real_escape_string', $data);
$query = "INSERT INTO suppliers(`regid`, `firstname`, `lastname`, `email`, `company`) VALUES('".$data[0]."', '".$data[1]."', '".$data[2]."', '".$data[3]."', '".$data[4]."') ON DUPLICATE KEY UPDATE REGID='".$data[0]."', firstname='".$data[1]."', lastname='".$data[2]."', email= '".$data[3]."', company= '".$data[4]."'";
$result = mysql_query($query) or die("Invalid query: " . mysql_error().__LINE__.__FILE__);
$row++;
}
您应始终对任何用户提供的数据使用mysql_real_escape_string
,以防止SQL注入或处理此类语法问题。
答案 1 :(得分:1)
我会使用LOAD DATA。
LOAD DATA LOCAL INFILE 'file.csv' REPLACE INTO TABLE suppliers
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
(regid, firstname, lastname, email, company);
不需要fopen(),fgetcsv()或执行INSERT这么多次。无需担心撇号或其他特殊字符。
答案 2 :(得分:0)
如果你想按照描述继续使用mysql_query,我建议通过array _map运行$ data来逃避单引号。像
这样的东西$data = array_map(function($string){
return str_replace("'", "\'", $string);
}, $data);
答案 3 :(得分:0)
执行此操作的最佳方法是使用LOAD DATA INFILE语句将CSV批量加载到MySQL中:
LOAD DATA INFILE 'csvfile' into suppliers FIELDS TERMINATED BY ','
这样做的另一个好处是你根本不需要逃避你的字符串 - LOAD DATA会为你做这件事。如果您还有其他问题,请与我们联系。