[英]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.