[英]What is wrong in my LOAD DATA INFILE Syntax?
我正在嘗試將CSV文件導入MySQL數據庫,但是沒有用。
我的數據庫中有5列:
id,userID,movieID,速率,時間戳
在我的CSV文件中,我只有4列,用兩個冒號'::'隔開。
這是示例數據:
1 :: 1193 :: 5 :: 978300760
這是我的查詢
$ query =“將數據輸入文件'$ uploadfile'裝入表rating_table字段以'::'行終止'\\ n'(用戶ID,movieID,速率,時間戳)”;
我正在使用PDO_MySQL
這是附加代碼,您可以理解。
$stmt = $dbh->prepare($query);
try{
if($stmt->execute()){
echo "Sucessful importing of CSV file into the MySQL database!";
}
}
catch (PDOException $e) {
echo "Error importing of CSV file into the MySQL database!";
echo "Error!: " . $e->getMessage() . "<br/>";
die();
}
echo "</p>";
我已經嘗試了很多次,但是當我檢入數據庫時,它仍然是空的。
我似乎無法弄清楚出什么問題了,您能幫我嗎? 謝謝!
這是我的錯誤 。
致命錯誤:消息為'SQLSTATE [HY000]的未捕獲異常'PDOException':常規錯誤:2014當其他未緩沖的查詢處於活動狀態時,無法執行查詢。 考慮使用PDOStatement :: fetchAll()。 另外,如果您的代碼只打算針對mysql運行,則可以通過設置PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY屬性來啟用查詢緩沖。 在C:\\ xampp \\ htdocs \\ movie \\ php \\ upload_file.php:57中堆棧跟蹤:#0 C:\\ xampp \\ htdocs \\ movie \\ php \\ upload_file.php(57):PDOStatement-> execute()1 {main}第57行的C:\\ xampp \\ htdocs \\ movie \\ php \\ upload_file.php中拋出
這是我的連接設置:
$ dbh = new PDO('mysql:host = localhost; dbname = movie','root','',array(PDO :: MYSQL_ATTR_INIT_COMMAND =>“ SET NAMES UTF8”,PDO :: ATTR_EMULATE_PREPARES => FALSE,PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE,PDO :: ATTR_ERRMODE => PDO :: ERRMODE_EXCEPTION,PDO :: MYSQL_ATTR_LOCAL_INFILE => TRUE)));
為了查看輸出中的錯誤消息,只需使用PDO::ERRMODE_EXCEPTION
初始化您的PDO,如下所示:
$db = new PDO('mysql:host=' . $config['db_host'] . ';dbname=' . $config['db_name'], $config['db_username'], $config['db_password'],
array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8",
PDO::ATTR_EMULATE_PREPARES => FALSE,
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
));
之后,您將能夠看到錯誤。 將其發布在更新中,我/我們將能夠為您提供幫助!
查看有關PDO_MYSQL的手冊。
您可能還需要:
PDO::MYSQL_ATTR_LOCAL_INFILE => TRUE
注意,在構造新的數據庫句柄時,只能在driver_options數組中使用此常數。
根據MySQL手冊 ,MySQL必須使用--enable-local-infile
進行編譯:
您必須使用MySQL的完整路徑來編譯PHP,否則它將使用其內部處理程序,該處理程序不適用於“新的” LOAD DATA。
--with-mysql = / usr / local / mysql(假設您的MySQL位於此處)
您必須使用選項'--local-infile = 1'啟動MySQL守護程序。
或通過添加到您的/etc/my.cnf
來啟用它:
[mysql]
local-infile=1
[mysqld]
local-infile=1
重新啟動mysqld
事后,通過運行service mysqld restart
。
引號用於字符串文字,反引號用於列和表名稱。 正確轉義變量。 將查詢更改為:
$query = "LOAD DATA INFILE ' . $uploadfile . ' INTO TABLE `rating_table` FIELDS TERMINATED BY '::' LINES TERMINATED BY '\n' ( `userID`, `movieID`, `rate`, `timestamp`)";
當您同時open
多個查詢時,通常會導致此錯誤。 例如,您調用fetch()
,但是直到完成后才調用它,然后嘗試執行第二個查詢。
通常,解決此問題的方法是調用closeCursor()
PHP:PDOStatement :: closeCursor-Manual 。 嘗試致電:
/* The following call to closeCursor() may be required by some drivers */
$stmt->closeCursor();
/* Now we can execute the second statement */
$otherStmt->execute();
看看這對您是否有任何改變。
嘗試使用其他語法來轉義變量。 使用以下內容:
$stmt = $dbh->prepare("
LOAD DATA INFILE
'" . $uploadfile . "'
INTO TABLE
`rating_table`
FIELDS TERMINATED BY
'::'
LINES TERMINATED BY
'\n' ( `userID`, `movieID`, `rate`, `timestamp`)
");
$stmt->execute();
PDO占位符只能用於值,而不能用於數據庫,表或列名! 我認為錯誤是由使用'::'
。 將文件中的數據定界符從'::'
更改為'.'
。
作為一種快速的檢查方法,您無需准備即可直接使用查詢:
$stmt = $dbh->query("
LOAD DATA INFILE
'" . $uploadfile . "'
INTO TABLE
`rating_table`
FIELDS TERMINATED BY
'::'
LINES TERMINATED BY
'\n' ( `userID`, `movieID`, `rate`, `timestamp`)
");
如果它不起作用,請嘗試更改數據定界符或嘗試以某種方式轉義現有的delemiter( ::
:)。
您可能在LOAD DATA INFILE
語句中缺少LOCAL
關鍵字。
LOCAL
表示您要從中加載的文件位於客戶端而不是服務器上。 當我剛嘗試使用表和文件進行此操作時,效果很好。
> cat infile.csv
1::1193::5::978300760
> mysql
mysql > create table ratings (
id int primary key auto_increment,
userID int,
movieID int,
rate int,
ts long);
Query OK, 0 rows affected (0.06 sec)
mysql > LOAD DATA LOCAL INFILE 'infile.csv' INTO TABLE ratings FIELDS TERMINATED BY '::' LINES TERMINATED BY '\n' ( userID, movieID, rate, ts);
Query OK, 1 row affected (0.00 sec)
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
mysql > select * from ratings;
+----+--------+---------+------+-----------+
| id | userID | movieID | rate | ts |
+----+--------+---------+------+-----------+
| 1 | 1 | 1193 | 5 | 978300760 |
+----+--------+---------+------+-----------+
1 row in set (0.00 sec)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.