使用PHP将制表符分隔文本文件读入MySQL表

时间:2010-04-30 15:24:58

标签: php mysql import

我试图将一系列制表符分隔的文本文件读入现有的MySQL表中。我的代码非常简单:

$lines = file("import/file_to_import.txt");

foreach ($lines as $line_num => $line) {
    if($line_num > 1) {
        $arr = explode("\t", $line);
        $sql = sprintf("INSERT INTO my_table VALUES('%s', '%s', '%s', %s, %s);", trim((string)$arr[0]), trim((string)$arr[1]), trim((string)$arr[2]), trim((string)$arr[3]), trim((string)$arr[4]));
        mysql_query($sql, $database) or die(mysql_error());
    }
}

但无论我做什么(因此在sprintf语句中每个变量之前的转换)我得到“你的SQL语法中有错误;检查与你的MySQL服务器版本对应的手册,以便使用正确的语法靠近''第1行“错误。

我回应代码,将其粘贴到MySQL编辑器中,运行正常,它不会从PHP脚本执行。

我做错了什么?

的Si

更新:以下是回声的SQL:

INSERT INTO wheelbase (WheelBaseCode, LanguageCode, WheelBaseDescription) VALUES ('A1', 'GBEN', '2.50-2.99m')
INSERT INTO wheelbase (WheelBaseCode, LanguageCode, WheelBaseDescription) VALUES ('A2', 'GBEN', '3.00-3.49m')
INSERT INTO wheelbase (WheelBaseCode, LanguageCode, WheelBaseDescription) VALUES ('A3', 'GBEN', '3.50-3.99m')
INSERT INTO wheelbase (WheelBaseCode, LanguageCode, WheelBaseDescription) VALUES ('A4', 'GBEN', '4.00-4.49m')

有趣的是,我现在让它在表中创建正确的行数,但是它插入的值是空的......

这可能是源文本文件中的编码问题吗?

3 个答案:

答案 0 :(得分:2)

您不需要输入字符串,数据已经是字符串。

确保文件数据中没有引号。在运行之前回显sql字符串以查看是否存在明显错误。

将SQL更改为:

"INSERT INTO my_table (`field1Name`, `field2Name`, `field3Name`, `field4Name`, `field5Name`) VALUES('%s', '%s', '%s', '%s', '%s');"

此更改包括字段名称,并引用最后两个值。

答案 1 :(得分:0)

我一般不喜欢你的方法。也许你用失踪修复你的“第一”问题 行。关于某些特殊字符,比如“反斜杠或SQL注入? 我认为你应该使用PDO提供的预处理语句并调用它的“bindValue” 该声明。它是一个稳定的构建PHP库。或者您可以使用dbTube.org 这是一个图形导入工具。

问候语

快门

答案 2 :(得分:0)

来自PHP.net

<?php
    fputcsv($fp, $foo, "\t");
?>

你只是忘了单引号是字面的...意思是你放在那里的东西是什么,所以\t将与t相同,因为在这种情况下\将是仅用于转义,但如果你使用双引号则可以使用。