2016-07-07 23 views
1

我一直在嘗試使用LOAD DATA INFILE將csv文件導入到mysql數據庫中。LOAD DATA INFILE - 顯示導入的行數給出錯誤的值

一切正常或多或少正常工作,但是當我使用mysqli_info()或mysqli_affected_rows()時,它們都顯示沒有任何行被導入查詢。即使我看到行正確導入。

的簡化版本的什麼,我試圖做(少列,我居然進口):

$server = 'localhost'; 
$username = 'root'; 
$password = 'password123'; 
$database = 'database_name'; 

$connect = new mysqli($server, $username, $password, $database); 

$files = scandir('imports/'); 

foreach($files as $file) { 
    $import = 
     "LOAD DATA INFILE 'imports/$file' 
     IGNORE INTO TABLE table_name 
     FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' 
     LINES TERMINATED BY '\n' 
     IGNORE 1 LINES 
     (@id, @name, @address, @product) 
     set [email protected], [email protected], [email protected], [email protected]"; 

    if(! $connect->query($import)) { 
     echo 'Failed'; 
    } 

    $connect->query($import); 

    echo mysqli_affected_rows($connect); 
} 

mysqli_affected_rows()返回0,而mysqli_info()規定的所有行被跳過。任何想法爲什麼它不能正確顯示?

希望這是足夠的信息。謝謝!

編輯:

我已經有點忙不過來,在過去幾天裏在這方面努力,但我已經決定了,雖然沒有具體回答導入到一個臨時表中的我的問題德魯的答案首先似乎是最有意義的,所以我決定採取這種做法。

+0

嘗試:回聲$連接 - > affected_rows; –

+0

並且... *是*加載的數據? –

+0

$ connect-> affected_rows;什麼都沒顯示 – Edward144

回答

2

我的評論進一步澄清:I would not be relying on $connect->affected_rows as ever a Rosetta stone for info. It is broken half the time.

這是一個建議。將您的LOAD DATA INFILE放入工作臺,而不是最終的表格。一旦執行完成,您已經成功避開了該功能的限制,並且可以享受Insert on Duplicate Key Update(IODKU)的成果。

後者,當我想知道計數,我從控制表中得到一個分配的批號。如果您需要幫助,請告訴我。

但是我現在正在重新調整工作表中的數據,並帶有批號。然後,我從工作臺執行IODKU進入決賽桌,批次號碼進入決賽桌中的列(是的,我可以調整模式來做到這一點,也許你不能)。爲了解決對現有表的任何模式更改,以及查找案例或允許多行批次標識符已經命中的行,可以使用帶有id的簡單關聯表。如果您願意,可以使用交叉表。

如果併發性是一個問題(多個用戶可能同時這樣做),那麼將採用鎖定策略(理想情況下是INNODB行級鎖定)。如果使用,使其快速。

然後我把我的計數從最終表(或相交表)中取出,其中batch id =我的批號。

參見本answer從一月

+0

雖然這並不嚴格回答問題(爲什麼affected_rows()不能準確顯示數字),絕對是我會推薦的方法。 – Shadow

+0

如何說它被打破了一半的時間。即使從小版本升級,也有大量的錯誤報告。這是一團糟。而PDO rowCount之類的人也不得不採取其他措施來保持一定的理智。 – Drew

+0

我會小心這個說法。許多bug報告都是關於mysql_affected_rows()API函數是關於不支持某些語句(例如加載數據)的投訴,在其早期版本中遇到錯誤時返回各種結果(這是一種記錄的行爲)。當與php api庫一起引發時,問題可能變得更加複雜,因爲MySQL服務器的版本可能與PHP api庫編譯的C API的版本不同。 – Shadow