2013-07-30 33 views
1

我只是使用PDO將客戶插入到我的表中,但它已被我自己或其他研究無法解釋的事情過度複雜化。 它給出的錯誤代碼:00000(這意味着這是一個成功,顯然),但沒有數據實際插入到數據庫中,並且只有在查詢失敗時纔會輸出錯誤,但錯誤是......成功?PDO報告執行失敗,但錯誤代碼暗示否則

$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.
我的桌子處於早期的初級階段。我有我的理由選擇手機/電話號碼變種。

+1

嘗試'$ insertUser->的errorCode()' –

+0

檢查錯誤,從'$數據庫 - >準備()'。 – Barmar

+0

With $ insertUser-> errroCoder()我得到:HY000,是一個連接錯誤?由於所有其他查詢都運行相同的函數來初始化數據庫連接,並且格式類似。 – PwnageAtPwn

回答

1

總之,你有這樣的:

$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拋出異常並擺脫手動錯誤檢查。

+1

我已經移動我的代碼來嘗試,發現錯誤,它的信息更豐富,事實證明我的id沒有默認值,它給了我「一般錯誤:1364 Field'id'沒有默認值「比錯誤代碼好多了!非常感謝每個人的投入。 – PwnageAtPwn

0

這是因爲$database->errorCode();不適用於您的情況下不直接在DB句柄上執行的操作(您使用的是PDO->prepare())。在你的情況下,這個錯誤代碼被認爲是最後一次成功的查詢,而不是你試圖執行的查詢,因此0000錯誤代碼。

您很可能在您的params數組中有錯誤(從$_POST傳遞的值)。另外,當使用bindParams方法時,您應該指定數據庫預期的變量類型。

+0

'$ data_type'參數是可選的,默認爲'PDO :: PARAM_STR',這在MySQL上下文中是非常安全的。 –

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(); 
} 
相關問題