2010-04-30 110 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

相關問題