【发布时间】:2014-05-07 12:01:59
【问题描述】:
我有以下代码
public function actualizarLogin($idusuario, $usu_login=NULL,
$usu_passwd=NULL) {
$result=false;
try {
$db=new PDO(MYSQL_CON, MYSQL_USER, MYSQL_PASSWD,
array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
try {
$db->beginTransaction();
$sql="UPDATE usuario SET usu_login=?, usu_passwd=?
WHERE idusuario=?";
$pstmt=$db->prepare($sql);
$pstmt->bindParam(1, $usu_login, PDO::PARAM_STR);
if($usu_passwd==null) {
$pstmt->bindParam(2, $usu_passwd, PDO::PARAM_NULL);
} else {
$pstmt->bindParam(2, crypt($usu_passwd, CRYPT_MD5), PDO::PARAM_STR);
}
//Accidentaly using wrong variable here
$pstmt->bindParam(3, $usu_login, PDO::PARAM_INT);
$pstmt->execute();
//But commit return true and no Exception is thrown
$result=$db->commit();
} catch (PDOException $e) {
$result=$e->getMessage();
$db->rollBack();
throw new RPC_INTERNAL_ERROR();
}
}catch (PDOException $e) {
$result=$e->getMessage();
throw new RPC_INTERNAL_ERROR();
}
return $result;
RPC_INTERNAL_ERROR 是 zoservices 的一个例外,zoservices 是我用于 JSON-RPC 服务器的库,并且此方法是从客户端调用的。
正如您可以阅读代码中的 cmets,我犯了一个错误,这是非常人性化的,我使用错误的变量来绑定最后一个参数,我告诉将它绑定为整数,而实际上是字符串(它是登录而不是 id)。但由于某种原因,即使我告诉在失败时抛出异常也没有这样的异常,但最糟糕的是提交返回 true ......为什么?我花了宝贵的时间来发现那个错误,因为 PDO 并没有告诉我任何关于它的信息。有什么办法可以处理这些错误?
【问题讨论】:
标签: php mysql pdo exception-handling