Я пытаюсь окунуться в 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 . "<br>");
Но является ли возвращаемое значение инструкции prepare только обнаружением ошибки в выполнении инструкции SQL и не обнаружения ошибок выполнения? Если это так, я поэтому должен изменить мою строку выполнения так, чтобы это произошло:
if($stmt_test->execute()) $errorflag=true;
И тогда, чтобы быть в безопасности, я должен также сделать следующее после выполнения заявления:
if($stmt_test->errno) {$errorflag=true;}
… Или я был в порядке, и возвращаемое значение в операторе подготовки MySQLi фиксирует все ошибки, связанные с полным выполнением заданного им запроса?
Спасибо C
Я написал это дважды раньше в течение последних двух дней (так что для меня это дубликат, хотя вопросы начали немного по-другому).
Каждый метод 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();
редактирование: всего несколько нот через шесть лет ….
Расширение mysqli отлично способно передавать операции, которые приводят к ошибке (mysqli), кроме 0 через исключения, см. Mysqli_driver :: $ report_mode .
die () действительно, очень грубая, и я бы не использовал ее даже для таких примеров, как этот.
Поэтому, пожалуйста, уберите только тот факт, что каждая операция (mysql) может завершиться неудачей по ряду причин; даже если точно такая же вещь прошла тысячу раз раньше …
завершенность
Вам нужно проверить как $mysqli
и $statement
. Если они ложны, вам необходимо вывести $mysqli->error
или $statement->error
соответственно.
КПД
Для простых сценариев, которые могут завершиться, я использую простые однострочные, которые вызывают ошибку PHP с сообщением. Для более сложного приложения вместо этого следует активировать систему предупреждения об ошибках, например, путем исключения исключения.
Пример использования 1: простой скрипт
# This is in a simple command line script $mysqli = new mysqli('localhost', 'buzUser', 'buzPassword'); $q = "UPDATE foo SET bar=1"; ($statement = $mysqli->prepare($q)) or trigger_error($mysqli->error, E_USER_ERROR); $statement->execute() or trigger_error($statement->error, E_USER_ERROR);
Пример использования 2: Приложение
# This is part of an application class FuzDatabaseException extends Exception { } class Foo { public $mysqli; public function __construct(mysqli $mysqli) { $this->mysqli = $mysqli; } public function updateBar() { $q = "UPDATE foo SET bar=1"; $statement = $this->mysqli->prepare($q); if (!$statement) { throw new FuzDatabaseException($mysqli->error); } if (!$statement->execute()) { throw new FuzDatabaseException($statement->error); } } } $foo = new Foo(new mysqli('localhost','buzUser','buzPassword')); try { $foo->updateBar(); } catch (FuzDatabaseException $e) $msg = $e->getMessage(); // Now send warning emails, write log }
Не уверен, что это отвечает на ваш вопрос или нет. Извините, если нет
Чтобы получить сообщение об ошибке из базы данных mysql о вашем запросе, вам необходимо использовать объект подключения в качестве фокуса.
так:
echo $mysqliDatabaseConnection->error
будет отражать ошибку, отправляемую из mysql о вашем запросе.
надеюсь, это поможет