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

问题描述 投票:0回答:1

我有这样的代码,故意使查询错误: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";打印在该行的行错误处?

php mysqli prepared-statement
1个回答
0
投票

您无法使用if语句捕获异常!

即使您要关闭mysqli错误报告,也绝对没有理由将每个mysqli函数调用包装在if语句中。 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块中,并使用自定义记录程序处理所有异常和错误。不要将每个mysqli调用都包装在try-catch中!

© www.soinside.com 2019 - 2024. All rights reserved.