MySQLi подготовил сообщение об ошибке операторов [дубликат]

Этот вопрос уже имеет ответ здесь:

Я пытаюсь получить голову вокруг MySQli, и я смущен сообщением об ошибке. Я использую возвращаемое значение MySQLi, 'готовят' оператор для обнаружения ошибок при выполнении SQL, как это:

$stmt_test =  $mysqliDatabaseConnection->stmt_init();
if($stmt_test->prepare("INSERT INTO testtable VALUES (23,44,56)"))
{
 $stmt_test->execute();
 $stmt_test->close();
}
else echo("Statement failed: ". $stmt_test->error . "
");

Но, возвращаемое значение подготовить оператора только обнаруживающий, если существует ошибка в подготовке SQL-оператора и не обнаружении ошибок выполнения? Раз так должен я поэтому изменять мой выполнять строку для установки флага ошибок также как это:

if($stmt_test->execute()) $errorflag=true;

И затем только быть безопасным должно я также делать следующее после того, как оператор выполнился:

if($stmt_test->errno) {$errorflag=true;}

... Или я был OK для запуска с, и возвращаемое значение на MySQLi готовят' оператор, фиксирует все ошибки, связанные с полным выполнением запроса, который это определяет?

Спасибо C

58
задан MPelletier 5 May 2012 в 15:24
поделиться

2 ответа

Я писал это дважды за последние два дня (поэтому для меня это дубликат, хотя вопросы начинались немного по-другому).

Каждый метод mysqli может дать сбой. Вы должны проверить каждое возвращаемое значение. Если один из них не работает, подумайте, имеет ли смысл продолжать работу с объектом, который находится не в том состоянии, в котором вы ожидаете его увидеть. (Потенциально не в "безопасном" состоянии, но я думаю, что это не проблема).

Поскольку для каждого соединения/статьи сохраняется только сообщение об ошибке последней операции, вы можете потерять информацию о том, что вызвало ошибку, если вы продолжите работу после того, как что-то пошло не так. Вы можете захотеть использовать эту информацию, чтобы позволить скрипту решить, стоит ли повторить попытку (только временная проблема), изменить что-то или полностью отказаться от выполнения (и сообщить об ошибке). И это значительно облегчает отладку.

$stmt = $mysqli->prepare("INSERT INTO testtable VALUES (?,?,?)");
// prepare() can fail because of syntax errors, missing privileges, ....
if ( false===$stmt ) {
  // and since all the following operations need a valid/ready statement object
  // it doesn't make sense to go on
  // you might want to use a more sophisticated mechanism than die()
  // but's it's only an example
  die('prepare() failed: ' . htmlspecialchars($mysqli->error));
}

$rc = $stmt->bind_param('iii', $x, $y, $z);
// bind_param() can fail because the number of parameter doesn't match the placeholders in the statement
// or there's a type conflict(?), or ....
if ( false===$rc ) {
  // again execute() is useless if you can't bind the parameters. Bail out somehow.
  die('bind_param() failed: ' . htmlspecialchars($stmt->error));
}

$rc = $stmt->execute();
// execute() can fail for various reasons. And may it be as stupid as someone tripping over the network cable
// 2006 "server gone away" is always an option
if ( false===$rc ) {
  die('execute() failed: ' . htmlspecialchars($stmt->error));
}

$stmt->close();

edit: just a few notes six years later....
Расширение mysqli вполне способно сообщать об операциях, которые приводят к коду ошибки (mysqli), отличному от 0, через исключения, см. mysqli_driver::$report_mode.
die() очень, очень груб, и я бы больше не использовал его даже для примеров, подобных этому.
Так что, пожалуйста, заберите только тот факт, что каждая и каждая (mysql) операция может потерпеть неудачу по ряду причин; даже если точно такая же вещь прошла хорошо тысячу раз до этого....

121
ответ дан 24 November 2019 в 18:46
поделиться

Не уверен, отвечает ли это на ваш вопрос или нет. Извините, если нет

Чтобы получить сообщение об ошибке из базы данных mysql по вашему запросу, вам необходимо использовать объект подключения в качестве фокуса.

итак:

echo $mysqliDatabaseConnection->error

отобразит ошибку, отправленную из mysql в отношении вашего запроса.

Надеюсь, что это поможет

4
ответ дан 24 November 2019 в 18:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: