簡體   English   中英

為什么此PDO插入執行兩次?

[英]Why is this PDO Insert executing twice?

這是將來自csv的每一行插入數據庫兩次,現在已經插入了三遍。 我放入循環中的其他事件均未發生。

$file_handle = fopen("uploads/numbers.csv", "r");    
$stmt = $db->prepare("INSERT INTO database
(firstname,lastname,phonenumber) VALUES
(:field1,:field2,:field3)");

while (($line_of_data = fgetcsv($file_handle, 1000, ",")) !== FALSE) 
{
$stmt->execute(array(':field1' => $line_of_data [0], ':field2' => $line_of_data[1], ':field3' => $line_of_data[2]));
}

在數據庫上設置正確的主鍵。 (名字,姓氏)或(名字,姓氏,電話號碼)取決於使用情況。 Ta-da,不再重復。

我將假設James在列中是正確的,因為CSV包含數據庫中預先存在的數據,但是無論哪種方式,主鍵都可以防止重復。

如果您使用名字,姓氏鍵,並且希望腳本能夠更新電話號碼,則可以使用REPLACE代替INSERT。

您的支票在這里:

while (($line_of_data = fgetcsv($file_handle, 1000, ",")) !== FALSE) 

首先,您不需要!== FALSE 可能是這樣的:

while (($line_of_data = fgetcsv($file_handle, 1000, ","))) 

此外,你的代碼只是檢查whilefgetcsv不是空的。 那么,如果文件中有空行怎么辦? 它運行兩次。 那么呢:

while (($line_of_data = trim(fgetcsv($file_handle, 1000, ",")))) {
  if (!empty($line_of_data)) {
    $stmt->execute(array(':field1' => $line_of_data [0], ':field2' => $line_of_data[1], ':field3' => $line_of_data[2]));
  }
}

這個想法是,當您調用fgetcsv讓我們修剪一下行以消除多余的內容,例如行尾的換行符。 然后, if (!empty($line_of_data)) {檢查行是否不為空,並且如果行絕對不為空,則僅對查詢起作用。 如果某種方式trim(fgetcsv(…))無法正常工作,則可以這樣操作:

while (($line_of_data = fgetcsv($file_handle, 1000, ","))) {
  if (!empty(trim($line_of_data))) {
    $stmt->execute(array(':field1' => $line_of_data [0], ':field2' => $line_of_data[1], ':field3' => $line_of_data[2]));
  }
}

if (!empty(trim($line_of_data))) {所有邏輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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