php - PDO 报告执行失败但错误代码表明并非如此

标签 php mysql pdo

我只是使用 PDO 将客户插入到我的表中,但由于我自己或其他研究无法解释的原因,它变得过于复杂。 它给出了错误代码:00000(这显然意味着成功)但实际上没有数据插入数据库并且只有在查询失败时才应该输出错误,但错误是..成功?

$insertUser = $database->prepare("INSERT INTO customer (Surname, Forename, AddressRow1, AddressRow2, AddressRow3, AddressRow4, PostCode, Telephone, mobileNumber, Email, assignedGarage)
                            VALUES (:surname, :forename, :addressrow1, :addressrow2, :addressrow3, :addressrow4, :postcode, :telephone, :mobilenumber, :email, :assignedgarage)");
$insertUser->bindParam(':surname', $_POST['surname']);
$insertUser->bindParam(':forename', $_POST['forename']);
$insertUser->bindParam(':addressrow1', $_POST['addressrow1']);
$insertUser->bindParam(':addressrow2', $_POST['addressrow2']);
$insertUser->bindParam(':addressrow3', $_POST['addressrow3']);
$insertUser->bindParam(':addressrow4', $_POST['addressrow4']);
$insertUser->bindParam(':postcode', $_POST['postcode']);
$insertUser->bindParam(':telephone', $_POST['telephone']);
$insertUser->bindParam(':mobilenumber', $_POST['mobilenumber']);
$insertUser->bindParam(':email', $_POST['email']);
$insertUser->bindParam(':assignedgarage', $_SESSION['garageId']);
if(!$insertUser->execute()) {
    $err[] = $database->errorCode();
}
elseif ($insertUser->rowCount() == 1) {
    $id =  $database->lastInsertId();
    echo "<script type=\"text/javascript\">
<!--
window.location = \"updateUser.php?id=$id\"
//-->
</script>";
}
if(count($err)) {
        echo "<p style=\"color:red;\">The following errors were detected:</p><br/>";
        foreach ($err as $key => $error) {
            echo "<p style=\"color:red;\">$error</p><br/>";
        }
    }

我一开始并没有定义我想插入的所有列,但那没有用,所以我预定义了它们。
A rudimentary customer table design, I have my reasons for having the telephone/mobile numbers as varchars.
我的 table 处于早期的基本阶段。我有理由为手机/电话号码选择 varchars。

最佳答案

总结一下,你有这个:

$insertUser = $database->prepare(...);
if(!$insertUser->execute()) {
    $err[] = $database->errorCode();
             ^^^^^^^^^
}

所以你调用PDO::errorCode()而不是 PDOStatement::errorCode() .正如手册所述:

PDO::errorCode() only retrieves error codes for operations performed directly on the database handle. If you create a PDOStatement object through PDO::prepare() or PDO::query() and invoke an error on the statement handle, PDO::errorCode() will not reflect that error. You must call PDOStatement::errorCode() to return the error code for an operation performed on a particular statement handle.

根据您的需要和当前代码,您可能还对 PDOStatement::errorInfo() 感兴趣, 它以友好的格式提供错误详细信息。当然,您也可以指示 PDO 抛出异常并摆脱手动错误检查。

关于php - PDO 报告执行失败但错误代码表明并非如此,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17942564/

相关文章:

php - 在哪里可以找到错误日志?

php - 计算脚本执行的次数

php - 数据库中的图像未加载 PHP PDO

php - 在多行中将数据搜索到一个表中

php - 在 PHP 中将函数作为另一个函数的参数传递

php - 如何在不依赖 PHP 循环的情况下执行此查询?

Mysql 表关系 - 迁移 LARAVEL

使用\PDO::ATTR_EMULATE_PREPARES => true 时 Laravel 数据不匹配错误

php - PDO - 连接查询并输出正确的数据

php - 当 mysqldump 无法创建文件时 shell_exec() 不返回错误