Почему mysqli_stmt :: prepare не может быть перехвачено при возврате false? - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть код, подобный этому, и намеренно сделаю ошибку запроса: 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 Ответ

0 голосов
/ 15 апреля 2020

Вы не можете перехватывать исключения с помощью оператора 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 и использовать собственный регистратор для обработки всех исключений и ошибок. Не переносите каждый вызов mysqli в try-catch!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...