1

帮助。我正在将旧 mysql 库中的一些代码转换为使用 PDO。

在几个地方,我们尝试进行 INSERT,完全知道重复键可能存在违规行为。这很好,我们寻找它并继续处理。所有这些都没有问题。

在一个地方,我们必须循环并添加多个项目,所以我使用了带有参数绑定的准备好的语句。如果我们在 INSERT 上没有遇到任何重复,它工作正常。但是,如果存在重复的密钥违规,则以下 PDO->execute() 会静默失败,没有异常,什么都没有。

这是我目前的代码:

<?php
$db = new PDO("mysql:host=localhost;dbname=".$dbname, $mysqluser, $mysqlpwd,
                array(PDO::ATTR_EMULATE_PREPARES => false,      
                      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

$stmt = $db->prepare("insert into trials (uid,name,start_date,expire_date) values (:uid,:node,FROM_UNIXTIME(:start),FROM_UNIXTIME(:end))");
$stmt->bindValue(':uid', $uid, PDO::PARAM_STR);
$stmt->bindParam(':node', $node, PDO::PARAM_STR);
$stmt->bindValue(':start', $start);
$stmt->bindValue(':end', $end);

foreach ($nodes as $node) {
    if (isfreenode($node))
        continue;

    try {
        $stmt->execute();  // <-- This is where it fails
    } catch (exception $e) {
        $errorInfo = $stmt->errorInfo();
        if ($errorInfo[1] = 1062) {
            print "Trial already exists (" . $node . ") - skipping <br/>";
        } else {
            throw $e;
        }
        $stmt->closeCursor();
        continue;
    }
    print "Started Trial ( " . $uid . " , " . $node . " )" . "<br/>";
    removeRevocation($uid, $node);
    $stmt->closeCursor();
}

}

关于我可以尝试至少了解它为什么会死的任何建议?

4

0 回答 0