1

我只是使用 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/>";
        }
    }

我一开始并没有定义我想要插入的所有列,但这不起作用,所以我预定义了它们。
一个基本的客户表设计,我有理由将电话/手机号码作为 varchars。
我的桌子处于早期初级阶段。我有理由为手机/电话号码选择 varchars。

4

3 回答 3

1

总结一下,你有这个:

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

因此,您调用的是PDO::errorCode()而不是PDOStatement::errorCode()。正如手册所解释的:

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

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

于 2013-07-30T09:08:01.440 回答
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();
}
于 2013-07-30T09:22:04.050 回答
0

这是因为在您的情况下(您使用)$database->errorCode();,对于未直接在 DB 句柄上执行的操作将不起作用。PDO->prepare()在您的情况下,此错误代码是指最后一次成功的查询,而不是您尝试执行的查询,因此是 0000 错误代码。

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

于 2013-07-30T09:16:29.487 回答