我正在尝试使用 INSERT INTO 和 PHP PDO 插入数据(160,000 多行),但有一个错误。
当我启动 PHP 脚本时,我看到的不仅仅是插入到数据库中的 CSV 中的确切行数。
如果我的循环不正确或其他什么问题,有人可以告诉我吗?
这是我的代码:
$bdd = new PDO('mysql:host=<myhost>;dbname=<mydb>', '<user>', '<pswd>');
// I clean the table
$req = $bdd->prepare("TRUNCATE TABLE lbppan_ticket_reglements;");
$req->execute();
// I read and import line by line the CSV file
$handle = fopen('<pathToMyCsvFile>', "r");
while (($data = fgetcsv($handle, 0, ',')) !== FALSE) {
$reqImport =
"INSERT INTO lbppan_ticket_reglements
(<my31Columns>)
VALUES
('$data[0]','$data[1]','$data[2]','$data[3]','$data[4]','$data[5]','$data[6]','$data[7]','$data[8]',
'$data[9]','$data[10]','$data[11]','$data[12]','$data[13]','$data[14]','$data[15]','$data[16]',
'$data[17]','$data[18]','$data[19]','$data[20]','$data[21]','$data[22]','$data[23]','$data[24]',
'$data[25]','$data[26]','$data[27]','$data[28]','$data[29]','$data[30]')";
$req = $bdd->prepare($reqImport);
$req->execute();
}
fclose($handle);
该脚本可以正常工作,因为数据在表中,但我不知道为什么它会出错并插入更多数据。我想也许,由于文件大小(18 Mo),脚本可能崩溃并尝试重新启动再次插入相同的行。
我无法在我正在使用的服务器上使用 LOAD DATA。
感谢您的帮助。
最佳答案
这不是一个答案,但在评论中添加这么多内容是相当棘手的。
如果这不能解决您的问题,请开始逐行处理代码并处理您能想到的每个异常。例如,您正在截断表,但您说执行后加载了更多数据,截断是否会失败?
try {
$req = $bdd->prepare("TRUNCATE TABLE lbppan_ticket_reglements;");
$req->execute();
} catch (\Exception $e) {
exit($e->getMessage()); // Die immediately for ease of reading
}
这不是最优雅的 try/catch,但它可以让你轻松发现问题。您还可以将其应用于正在进行的查询...
try {
$req = $bdd->prepare($reqImport);
$req->execute();
} catch (\Exception $e) {
exit($e->getMessage());
}
并且还进行一些诊断,您是否插入了 160k 行?您可以选择在每个循环上回显 $i 并查看是否可以发现任何中断或异常。
$i = 0;
while (($data = fgetcsv($handle, 0, ',')) !== FALSE) {
// ... your stuff
$i++;
}
echo "Rows inserted " . $i . "\n\n";
除此之外,你还可以循环打印出 SQL 内容供你手动查看,也许它正在做一些奇怪而富有成效的事情。
希望有帮助。
关于php - 使用 PHP PDO 从 CSV 错误插入循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34396770/