2012-09-26 85 views
0

我想跟踪使用PDO准备并执行时执行查询时发生的错误类型。错误类型的错误mySql PDO php

例如,如果我必须插入电子邮件,名称,DOB,并且电子邮件要求是唯一的,而不是写一个特殊查询来检查电子邮件是否已被采用,我想跟踪发生的错误并知道一样。

+2

防止错误通常比修复它们更好。 – David

+0

但我宁愿做一个查询而不是两个? – geekman

+0

无论哪种方式,如果失败,最终只能执行一个查询。只有在没有电子邮件的情况下,它才会完成两个查询,并且查询不会很长。 – David

回答

1

您可以在插入查询周围使用try/catch块,并在异常处理程序中处理双重电子邮件。

$sql = "INSERT INTO `mystuff` (email, name) VALUES (:email, :name)"; 

try { 
    $sth = $dbh->prepare($sql); 
    $sth->execute(array(':email' => $email, ':name' => $name)); 
} 
catch (Exception $e) { 
    echo 'email already taken'; 
} 

当然,您必须配置PDO,它会引发错误的异常。

+0

雅:我想过这个......但是即使出现其他问题,也不会显示'收到邮件'吗?没有办法检查发生了什么错误吗? – geekman

+0

看看http://php.net/manual/en/pdo.errorinfo.php在catch块中,你可以使用SWITCH来处理不同的错误情况 – JvdBerg

+0

我想看看,谢谢。 – geekman

1

首先,你将配置你的数据库放在一个UNIQUE KEY

ALTER TABLE yourtable ADD CONSTRAINT uniqukey_for_mail UNIQUE(email); 

则可以使用PDO与ERRMODE_EXCEPTION

$bddConnect = new PDO('dsn',$user,$password); 
$bddConnect->setAttribute(PDO::ATTR_ERRMOD,PDO::ERRMOD_EXCEPTION); 

然后当你更新或插入DATAS,你就只能以try/catch包装您的查询,并检查您的错误是否违反约束条件

try{ 
    $bddConnect->exec("UPDATE yourtable SET email='already in table EMAIL' WHERE 
    id='other id than the one that has the email'"); 
}catch(PDOException $e){ 
    if(strpos('constraint violation',$e->getMessage())!==false){ 
     echo "already taken"; 
    } 
} 
+0

再次......但是,即使出现其他任何问题,也不会显示“已接收电子邮件”?没有办法检查发生了什么错误吗? – geekman

+0

我编辑了我的答案给你看 – artragis