使用PHP无法正常将CSV文件导入SQL

时间:2014-08-11 13:52:39

标签: php mysql sql csv

我正在尝试将CSV文件导入我的SQL数据库。这就是我所拥有的:

if ($_FILES[csvFile][size] > 0)
{ 
$file = $_FILES[csvFile][tmp_name]; 
$handle = fopen($file,"r"); 

do { 
    if ($data[0]) 
    { 

    $insert_query = "REPLACE INTO `teacherNames` SET 
    `schoolName` = '".addslashes($schoolname)."',
    `teacherName` = '".addslashes($data[0])."'
    ;";  

        $result = mysql_query($insert_query);
        echo $insert_query; -- SEE RESULTING QUERY BELOW
        echo $data[0]." added\n<br />";
    } 
} 
while ($data = fgetcsv($handle,1000,",","'"));

CSV文件有3条记录,看起来是正确的。该过程在一定程度上起作用,但由于某种原因,它没有正确读取CSV文件,结果查询是这样的:

REPLACE INTO `teacherNames` SET `schoolName` = 'Brooks', `teacherName` = 'RMG JMC PMC';

当我希望得到3个单独的查询时 - 每个记录一个。它似乎没有将CSV文件作为3个单独的记录读取,而是作为1.任何人都可以看到原因吗?

更新:

CSV内容为:

RMG
JMC
PMC

3 个答案:

答案 0 :(得分:2)

如果你的文件与MySQL服务器在同一台计算机上,那么Julio Martins的修补程序会更好。

但是如果你需要从PHP内部读取文件,PHP.NET会在http://php.net/manual/en/function.fgetcsv.php上提供一条说明:

  

注意:如果PHP在阅读时没有正确识别行结尾   Macintosh计算机上或由Macintosh计算机创建的文件,启用   auto_detect_line_endings运行时配置选项可能会有所帮助   解决问题。

你的文件中的行结尾怎么样?由于所有的行都被读作一个,我猜你可能就是这样。

要启用auto_detect_line_endings,请在http://php.net/manual/en/filesystem.configuration.php#107333

使用ini_set("auto_detect_line_endings", true);作为所述开心果

答案 1 :(得分:1)

使用while而不是do-while:

while ($data = fgetcsv($handle,1000,",","'")) {
    //...
}

答案 2 :(得分:1)

尝试加载数据:

LOAD DATA INFILE '{$filepath}'
INTO TABLE '{$table}'
FIELDS TERMINATED BY ','

更干净