【问题标题】:try/catch for looped SQL statements循环 SQL 语句的 try/catch
【发布时间】:2023-03-21 06:05:01
【问题描述】:

我正在尝试识别 try/catch 失败的完整 SQL 语句。代码如下:

try {
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $conn->beginTransaction();

    for($counter=0;$counter<sizeof($sql);$counter++) {
        $query = $conn->prepare($sql[$counter]);
        $conn->exec($sql[$counter]);
    }
    $conn->commit();
} catch (Exception $e) {
    $err_message = "Failed while saving process....";
    log_event('submit_scores.php', $err_message);
    $err_message = "The following SQL statements were in the queue:";
    log_event('submit_scores.php', $err_message);
    for($counter=0;$counter<sizeof($sql);$counter++) {
        /* \t should be a tab character to indent the sql statements */
        $err_message = "\t" . $sql[$counter];
        log_event('submit_scores.php', $err_message);
    }

    $conn->rollBack();
    $message = "Failed: " . $e->getMessage();
    echo $message;
    $err_message = "\t" . $message;
    log_event('submit_scores.php', $err_message);
    return;
}

这当前将所有 SQL 语句记录到一个日志文件中(通过 log_event 函数)。然后它会生成一个错误(不正确的 SQL 语句),但我的问题是错误消息是通用的:

2017-08-25 09:19:28 - submit_scores.php:    Failed: SQLSTATE[42000]: Syntax 
error or access violation: 1064 You have an error in your SQL syntax; check 
the manual that corresponds to your MySQL server version for the right 
syntax to use near ',210,,      ,,,     )' at line 4

我可以看到问题,但我不想记录循环中的每个 SQL 语句,而只记录失败的 FULL SQL 语句。

任何帮助将不胜感激。

【问题讨论】:

  • $sql[$counter] 里面是什么?而且你们都在准备执行一个单独的查询?

标签: php loops pdo try-catch


【解决方案1】:

由于-&gt;exec() 调用引发了异常,您可以将try/catch 移动到循环中,然后仅引用您调用的最后一次尝试查询:

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->beginTransaction();

for($counter=0;$counter<sizeof($sql);$counter++) {
    try {
        $query = $conn->prepare($sql[$counter]);
        $conn->exec($sql[$counter]);
    } catch (Exception $e) {
        echo "This is the query ($counter) that failed: " . $sql[$counter];
        $conn->rollBack();
        return;
    }
}
$conn->commit();

【讨论】:

    【解决方案2】:

    您不应在 catch 块中重复使用您的 $counter 变量和/或循环所有 sql 语句:您知道最后一条失败的语句是 $sql[$counter] 目前例外是扔了。

    因此,您应该只记录$sql[$counter],而不是循环遍历所有语句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多