![](/img/trans.png)
[英]In PDO prepare statement, for multiple insert query executing twice.why?
[英]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, ",")))
此外,你的代碼只是檢查while
這fgetcsv
不是空的。 那么,如果文件中有空行怎么辦? 它運行兩次。 那么呢:
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.