2014-08-29 46 views
0

我在Google App Engine中涉及PHP(並且同時學習數據庫設計和PDO)。這裏有一個數據插入代碼位,它是不工作:PDOException在語句執行失敗時不會觸發

<html> 
<body> 
Collection Protocol 
<?php 

$db = null; 

    try{ 
    $db = new pdo('mysql:unix_socket=/cloudsql/myidhere:cloudsql;dbname=mydb-schema', 'root', ''); 
    }catch(PDOException $ex){ 
     die(json_encode(
      array('outcome' => false, 'message' => $ex->getMessage()) 
     ) 
    ); 
    } 



try { 

    $stmt = $db->prepare('INSERT INTO observations(observation_remote_id_fk, observation_dimension_id_fk, metric) VALUES (:remote_id, :dimension_id, :metric)'); 
    $stmt->execute(array(':remote_id' => htmlspecialchars('1'), ':dimension_id' => htmlspecialchars('1'), ':metric' => htmlspecialchars('1'))); 

} catch (PDOException $ex2) { 
     die(json_encode(
      array('outcome' => false, 'message' => $ex2->getMessage()) 
     ) 
    ); 


} 
$db = null; 
?> 
</body></html> 

在我嘗試調試這個我已經意識到我的錯誤報告不WAI - 如果我更改數據庫名稱,我得到一個錯誤是偉大(和預期)。但是,如果我改變表名 - 例如,組成這個不存在的東西 - 我似乎並沒有得到一個PDOException,這是我所期望的。目前的理論是數據庫連接沒問題(如果沒有,它會拋出一個錯誤),但是表格位被破壞並且沒有拋出錯誤。

如何讓PDO在無法執行語句時觸發異常?

山姆

回答

1

PDO會拋出異常,如果它不能創建對象,因爲這是面向對象的代碼,但默認情況下它靜靜地失敗對於MySQL的錯誤,而不是傳遞false的各種函數返回。

http://php.net/manual/en/pdo.error-handling.php

更改您的代碼來設置相關屬性:

$db = new pdo('mysql:unix_socket=/cloudsql/myidhere:cloudsql;dbname=mydb-schema', 'root', ''); 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
+0

完美 - 感謝。錯誤(沒有在其他表中填充我的外鍵)立即變得明顯,並且一旦稍微冗長一點就很容易解決。 感謝您的好評 - 意識到這在手冊中非常明顯,有時您剛剛起步時很難找到合適的位置。 – 2014-08-29 17:23:07

相關問題