Как пропустить не объектную ошибку в PHP mysqli? - PullRequest
0 голосов
/ 05 марта 2012

При наличии ошибки в синтаксисе SQL в классическом PHP MySQL запрос не будет выполняться без какого-либо другого эффекта. Но в mysqli он убьет скрипт PHP с фатальной ошибкой

mysql_query("SELECT title, misspelled_column FROM posts");

$mysqli->query("SELECT title, misspelled_column FROM posts");

В первом случае будут показаны другие запросы и вывод php; но второй случай убивает сценарий на

Fatal error: Call to a member function fetch_assoc() on a non-object

Проблема связана с non-object, возвращенным ложным запросом. Я могу пропустить эту ошибку на

if($result){$row = $result->fetch_assoc();}

но мой вопрос в том, почему мне не нужна эта проверка в классическом mysql? С более продвинутой системой можно ожидать, что новые функции не пропустят то, что мы имели.

Ответы [ 2 ]

1 голос
/ 05 марта 2012

Ошибка, сгенерированная MySQL, не должна останавливать выполнение. Фактически, вы можете сделать так, чтобы ваш скрипт показывал вам любые ошибки SQL, используя $mysqli->error (при условии, что $mysqli - это подключение к вашей базе данных, как в вашем примере). Однако может случиться так, что ваша ошибка mysqli приводит к тому, что определенный объект не будет создан, а затем вызов метода для этого объекта приведет к фатальной ошибке PHP. Например:

$dbconn = new mysqli("localhost", $username, $password, $dbname);
$stmt = $dbconn->prepare("bluh"); // not a valid statement. fails to create a mysqli statement object in $stmt.
echo($dbconn->error); // your script is still running, and this will show your MySQL syntax error.
$stmt->execute();

Это умрет не потому, что вы допустили ошибку SQL, а потому, что $stmt был нулевым и не имел ожидаемого execute() метода. Поэтому, как и все остальные, проверьте ваши логи и посмотрите, что является настоящей ошибкой

Использование @ для игнорирования ошибок будет происходить по ошибке, пока вы не выясните, какая именно команда создает ошибку.

update: Если вы знаете, что ошибка в запросе, то вы можете проверить, успешно ли выполнен запрос, прежде чем пытаться что-либо с ним сделать. Один из способов - проверить параметр error; другой - проверить, действительно ли он вернул тот тип объекта, который вам нужен.

Вот примеры обоих:

$result = $db->query("select firstname, lastname from people where firstname = 'egbert';");
if($db->error == '') {
     // the query worked, so fetch results from $result and do stuff with them.
}
else {
     // the query didn't work, so don't try to do anything with $result
}

// alternately:
if(gettype($result) == "object") {
     // the query worked.
}
else {
     // it didn't.
}
0 голосов
/ 05 марта 2012

Ошибка SQL не убивает mysqli в моем опыте.Я подозреваю, что у вас действительно есть ошибка PHP в соответствующем утвержденииПроверьте свой журнал ошибок.

В PHP вы можете использовать @ для подавления ошибок. плохая идея использовать это здесь.Но если это то, что вы действительно хотите, это задокументировано в http://php.net/manual/en/language.operators.errorcontrol.php.

...