簡體   English   中英

我的LOAD DATA INFILE語法有什么問題?

[英]What is wrong in my LOAD DATA INFILE Syntax?

我正在嘗試將CS​​V文件導入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
        ));

之后,您將能夠看到錯誤。 將其發布在更新中,我/我們將能夠為您提供幫助!

編輯1:

查看有關PDO_MYSQL的手冊。

您可能還需要:

PDO::MYSQL_ATTR_LOCAL_INFILE => TRUE

注意,在構造新的數據庫句柄時,只能在driver_options數組中使用此常數。

編輯2:

根據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

編輯3:

引號用於字符串文字,反引號用於列和表名稱。 正確轉義變量。 將查詢更改為:

$query = "LOAD DATA INFILE ' . $uploadfile . ' INTO TABLE `rating_table` FIELDS TERMINATED BY '::' LINES TERMINATED BY '\n' ( `userID`, `movieID`, `rate`, `timestamp`)";

編輯4:

當您同時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();

看看這對您是否有任何改變。

編輯5:

嘗試使用其他語法來轉義變量。 使用以下內容:

$stmt = $dbh->prepare("
       LOAD DATA INFILE 
          '" . $uploadfile . "' 
       INTO TABLE 
          `rating_table`
       FIELDS TERMINATED BY 
          '::' 
       LINES TERMINATED BY 
          '\n' ( `userID`, `movieID`, `rate`, `timestamp`)
");
$stmt->execute();

編輯6:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM