2010-04-30 75 views
2

我正在尝试将一系列制表符分隔的文本文件读入现有的MySQL表中。我的代码很简单:使用PHP将制表符分隔的文本文件读入到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脚本执行。

我在做什么错?

更新:这里是echoe'd 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') 

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

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

回答

2

您不需要字符串转换,数据将已经是字符串。

确保文件数据中没有引号。在运行之前回声一点,看看是否有明显的错误。

更改SQL到:

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

这种变化包括字段名称,并注明最后两个值。

+0

我知道我并不需要弦乐演员,这是为了确保我不会生气。你的代码应该和我一样工作,但它不会。我不需要指定字段名称,因为我插入到所有五个字段中(所以我可以将INSERT INTO插入到my_table VALUES中)。另外,最后两个是DOUBLE类型,而不是VARCHAR。数据中没有引号,即使我只处理前几行,仍然会出现错误。 – 2010-04-30 15:43:02

+1

那么,在运行它们之前,请回显查询。将它们添加到您的问题。 – 2010-04-30 15:47:32

+0

使用SQL更新了帖子 – 2010-04-30 16:14:08

0

我不喜欢你一般的方法。也许你修复了缺少 行的“第一”问题。我想你应该使用PDO提供的预处理语句,并调用 的“bindValue”语句,它是一个稳定的buildin PHP库,或者你可以使用dbTube。有机代替 它是一个图形导入工具

问候

快门

0

PHP.net

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

你只是忘记了单引号是字面意思......这意味着无论你放在那里,这将是什么会出来,所以\t将与t相同,因为\在这种情况下将只用于转义,但如果你使用双引号,那么这将工作。

+0

等待,双引号内的单引号? – 2015-09-27 08:25:49

相关问题