PDO报告执行失败,但错误代码表示不然

时间:2013-07-30 08:59:41

标签: 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. 我的桌子处于早期的初级阶段。我有理由为手机/电话号码选择varchars。

3 个答案:

答案 0 :(得分:1)

总结一下,你有这个:

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

所以你打电话给PDO::errorCode()而不是PDOStatement::errorCode()。正如手册解释:

  

PDO :: errorCode()仅检索所执行操作的错误代码   直接在数据库句柄上。如果您创建PDOStatement对象   通过PDO :: prepare()或PDO :: query()并在上面调用错误   语句句柄,PDO :: errorCode()不会反映该错误。您   必须调用PDOStatement :: errorCode()来返回错误代码   对特定语句句柄执行的操作。

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

答案 1 :(得分:1)

试试这个并告诉我你找到了什么:

try{
   $database->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)

   $insertUser = $database->perepare("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->execute(array(':surname'=>$_POST['surname'], ':forename'=>$_POST['forename'], ':addressrow1'=>$_POST['addressrow1'], ':addressrow2'=>$_POST['addressrow2'], ':addressrow3'=>$_POST['addressrow3'], ':addressrow4'=>$_POST['addressrow4'], ':postcode'=>$_POST['postcode'], ':telephone'=>$_POST['telephone'], ':mobilenumber'=>$_POST['mobilenumber'], ':email'=>$_POST['email'], ':assignedgarage'=>$_SESSION['garageId']));

    if ($insertUser->rowCount() == 1) {
    $id =  $database->lastInsertId();
    echo "<script type=\"text/javascript\">
<!--
window.location = \"updateUser.php?id=$id\"
//-->
</script>";} else{
   //sum'n sum'n
}catch(PDOException $e){
  echo 'Error occured'.$e-getMessage();
}

答案 2 :(得分:0)

这是因为$database->errorCode();对于不直接在数据库句柄上执行的操作不适用于您的情况(使用PDO->prepare())。在您的情况下,此错误代码是为了上次成功查询而不是您尝试执行的查询,因此是0000错误代码。

你的params数组中很可能有一个错误(从$_POST传递的值)。此外,在使用bindParams方法时,您应指定数据库所需的变量类型。