2014-08-29 47 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

相关问题