获取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
如何捕捉这些错误?
1条答案
按热度按时间cgyqldqp1#
您试图捕获的异常永远不会被抛出,因为您需要告诉pdo您希望它如何处理错误。
否则,默认
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
.