我试图将一系列制表符分隔的文本文件读入现有的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')
有趣的是,我现在让它在表中创建正确的行数,但是它插入的值是空的......
这可能是源文本文件中的编码问题吗?
答案 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
相同,因为在这种情况下\
将是仅用于转义,但如果你使用双引号则可以使用。