php - 使用 PHP PDO 从 CSV 错误插入循环

标签 php mysql csv pdo while-loop

我正在尝试使用 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。

感谢您的帮助。

最佳答案

这不是一个答案,但在评论中添加这么多内容是相当棘手的。

首先提高maximum execution time

如果这不能解决您的问题,请开始逐行处理代码并处理您能想到的每个异常。例如,您正在截断表,但您说执行后加载了更多数据,截断是否会失败?

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/

相关文章:

php - 将 MySQL 导出到 CSV

ruby-on-rails - 导入 - csv 到 activerecord - Rails 中的错误处理

Python CSV writer 自动限制每个文件的行数并创建新文件

php - 读取MySQL表并回显1个div中具有不同状态的2条记录

php - Gmail 应用程序剥离等于登录 Mailto 正文

php - 具有 ManyToOne 关联的实体上的 getArrayResult

php - 我怎样才能自己加入一个表以获得每个唯一项目的第一个或最后一个?

PHP 在 imagecopyresampled 后保存图像

java - 在 hibernate 中更新数据库模型

php - 仅在 72 小时内运行的 MySQL 查询