为什么PDOException无法捕获错误?

时间:2018-12-31 04:03:52

标签: php mysql pdo error-handling try-catch

获取通过POST方法传递的信息,并修剪字符串中的所有空间,然后启动一个新的pdo实例,连接mysql,并将POST传递的信息插入表中。

$title = trim($_POST["title"]);
$content = trim($_POST["content"]);

$dsn = "mysql:host=localhost;dbname=blog";
$con = new PDO($dsn,"root","xxxx");

$title = $con->quote($title);
$content = $con->quote($content);

try
{
    $sql = "insert into tmp (`title`,`content`) values('$title','$content')";
    $stmt = $con->prepare($sql);
    $stmt->execute();
}
catch(PDOException  $e)
{
    echo $e->getMessage();
}

上面是我完成工作的PHP代码,最导入的命令是

insert into tmp (`title`,`content`) values('$title','$content')";

运行上述PHP代码不会显示任何错误信息,并且/var/log/mysql/error.log中没有错误,但是该信息尚未插入数据库。

我更改了

insert into tmp (`title`,`content`) values('$title','$content')";

进入

insert into tmp (`title`,`content`) values($title,$content)";

POST传递的信息现在可以插入到mysql中,令我困惑的问题是:

  1. echo $e->getMessage();完全无效。
  2. /var/log/mysql/error.log中没有错误信息

如何捕获这些错误?

1 个答案:

答案 0 :(得分:0)

您要捕获的异常将永远不会抛出,因为您需要to tell PDO how you want it to handle errors

$con = new PDO($dsn,"root","xxxx");
$con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

否则,将使用默认的PDO::ERRMODE_SILENT

  

这是默认模式。 PDO只需使用语句和数据库对象上的PDO :: errorCode()和PDO :: errorInfo()方法,即可设置错误代码供您检查。如果错误是由对语句对象的调用导致的,则可以在该对象上调用PDOStatement :: errorCode()或PDOStatement :: errorInfo()方法。如果错误是由于对数据库对象的调用导致的,则应改为在数据库对象上调用这些方法。

根据切线,您应该使用prepared statements。您正在使用prepare()调用,但是没有参数化查询并按需绑定变量。使用quote()不够安全。