为什么我不能用异常捕捉错误?

cidc1ykv  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(381)

获取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了,让我困惑的是: echo $e->getMessage(); 完全没有效果。
中没有错误信息 /var/log/mysql/error.log 如何捕捉这些错误?

cgyqldqp

cgyqldqp1#

您试图捕获的异常永远不会被抛出,因为您需要告诉pdo您希望它如何处理错误。

$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()方法。如果错误是由对数据库对象的调用导致的,那么您将改为对数据库对象调用这些方法。
切题地说,您应该使用准备好的语句。您正在使用 prepare() 调用,但您没有像应该的那样参数化查询和绑定变量。使用 quote() 不够安全。

2020年更新:

有趣的是,从php8开始,pdo的默认行为将发生变化,并在默认情况下抛出异常。这一变化是在本rfc上表决的,其中提到:
pdo的当前默认错误模式为静默。这意味着,当发生sql错误时,除非开发人员实现自己的显式错误处理,否则不会发出错误或警告,也不会引发异常。
这会给新开发人员带来问题,因为他们经常从pdo代码中看到的唯一错误是敲打错误,例如“非对象上的call to fetch()”——没有迹象表明sql查询(或其他操作)失败或者为什么失败。
当PHP8在2020年11月发布时,默认的错误模式是 PDO::ERRMODE_EXCEPTION .

相关问题