为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 mysqli_stmt::prepare 返回 false 时无法捕获?

为什么 mysqli_stmt::prepare 返回 false 时无法捕获?

PHP
精慕HU 2022-12-23 13:18:07
我有这样的代码,故意使查询错误:delete_test.php。<?php.....$id = 1;$sql = "xSELECT * FROM tbl_1 WHERE 1 AND id =?"; // Adding and an x to make this error$stmt = $mysqli->stmt_init();if(!$stmt->prepare($sql)){ // Line 56    echo "There is something wrong #1";    exit();}else{   $stmt->bind_param("i", $id);   if(!$stmt->execute()){       echo "There is something wrong #2";       exit();   }  .....}.....?>当我运行 delete_test.php 时出现此错误:Fatal error: Uncaught mysqli_sql_exception: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'xSELECT * FROM tbl_1 WHERE 1 AND id =?' at line 1 in C:\xampp\htdocs\delete_test.php:56 Stack trace: #0 C:\xampp\htdocs\delete_test.php(56): mysqli_stmt->prepare('xSELECT * FROM ...') #1 {main} thrown in C:\xampp\htdocs\delete_test.php on line 56而不是打印这个:There is something wrong #1为什么 php 忽略echo "There is something wrong #1";了该行的行错误?以及如何echo "There is something wrong #1";在该行的行错误处打印?
查看完整描述

1 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

你不能用 if 语句捕获异常!


绝对没有理由将每个 mysqli 函数调用包装在一条if语句中,即使您要关闭 mysqli 错误报告。Mysqli 可以触发异常,就像您收到的异常一样,它告诉您的不仅仅是“有问题#1”。


你有 3 行代码,你把它变成了 12 行代码,但你仍然没有包装stmt_init()或bind_param()在if声明中。只需坚持简单的三行准备好的语句。


$stmt = $mysqli->prepare("xSELECT * FROM tbl_1 WHERE 1 AND id =?");

$stmt->bind_param('s', $id);

$stmt->execute();

PHP 具有内置的错误处理程序,因此如果发生错误,它可以将错误显示给最终用户或将错误记录在服务器上的文件中。后者是优选的。如果您想使用自己的错误处理程序,那么您可以将所有 PHP 代码包装在一个 try-catch 块中,并使用自定义记录器处理所有异常和错误。不要在 try-catch 中包装每个 mysqli 调用!


查看完整回答
反对 回复 2022-12-23
  • 1 回答
  • 0 关注
  • 142 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号