PHP CSV到Mysql脚本 - 处理特殊字符

时间:2014-05-30 23:11:21

标签: php mysql csv

我有以下脚本将数据从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);
?>

有人可以建议解决方案吗?

非常感谢

4 个答案:

答案 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会为你做这件事。如果您还有其他问题,请与我们联系。