Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php try/catch用于循环SQL语句_Php_Loops_Pdo_Try Catch - Fatal编程技术网

Php try/catch用于循环SQL语句

Php try/catch用于循环SQL语句,php,loops,pdo,try-catch,Php,Loops,Pdo,Try Catch,我试图识别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]

我试图识别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语句,而只是记录失败的完整SQL语句


任何帮助都将不胜感激。

您不应在
catch
块中重复使用
$counter
变量和/或循环所有sql语句:您知道在引发异常时失败的最后一条语句是
$sql[$counter]


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

您不应该在
catch
块中重复使用
$counter
变量和/或循环遍历所有sql语句:您知道失败的最后一条语句是
$sql[$counter]
此时抛出异常


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

,因为异常是由
->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();
$conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_异常);
$conn->beginTransaction();
对于($counter=0;$counterprepare($sql[$counter]);
$conn->exec($sql[$counter]);
}捕获(例外$e){
echo“这是失败的查询($counter):.$sql[$counter];
$conn->rollBack();
返回;
}
}
$conn->commit();

由于异常是由
->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();
$conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_异常);
$conn->beginTransaction();
对于($counter=0;$counterprepare($sql[$counter]);
$conn->exec($sql[$counter]);
}捕获(例外$e){
echo“这是失败的查询($counter):.$sql[$counter];
$conn->rollBack();
返回;
}
}
$conn->commit();

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