PDOException不会触发语句执行失败

时间:2014-08-29 17:00:53

标签: php pdo

我正在使用Google App Engine中的PHP(并同时学习数据库设计和PDO)。这里有一些数据插入代码,它不起作用:

<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 个答案:

答案 0 :(得分:1)

如果PDO无法创建对象,则会抛出异常,因为这是OOP代码,但默认情况下,它会因为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);