Возможный дубликат:
Ошибка PHP: mysql_fetch_array () ожидает, что параметр 1 будет ресурсом, boolean
Я очень смущен этой ошибкой, это показывает, когда я пытаюсь вернуть результат из базы данных, которая не существует … Я пробовал mysql_num_rows()
но он возвращает ту же ошибку, но вместо mysql_fetch_assoc
ожидает … это говорит mysql_num_rows()
ожидает …
Я устанавливаю error_reporting(0)
чтобы не показывать эту ошибку, но я не удовлетворен этим решением …
Вот правильный способ:
<?PHP $sql = 'some query...'; $result = mysql_query($q); if (! $result){ throw new My_Db_Exception('Database error: ' . mysql_error()); } while($row = mysql_fetch_assoc($result)){ //handle rows. }
Обратите внимание на check (! $ Result) – если ваш $ result является логическим, это, безусловно, неверно, и это означает, что произошла ошибка базы данных, то есть ваш запрос был, вероятно, плохим.
Вы должны проверить, является ли результат, возвращаемый mysql_query, ложным.
$r = mysql_qyery("..."); if ($r) { mysql_fetch_assoc($r); }
Вы можете использовать @mysql_fetch_assoc($r)
чтобы избежать отображения ошибок.
Правильный синтаксис (в примере):
$query = mysql_query('SELECT * FROM beer ORDER BY quality'); while($row = mysql_fetch_assoc($query)) $results[] = $row;
Вот как вы должны использовать mysql_fetch_assoc ():
$result = mysql_query($query); while ($row = mysql_fetch_assoc($result)) { // Do stuff with $row }
$ result должен быть ресурсом. Даже если запрос не возвращает строк, $ result все равно является ресурсом. Единственный раз $ result – это логическое значение, если возникла ошибка при запросе базы данных. В этом случае вы должны выяснить, что это за ошибка, используя mysql_error () и убедиться, что этого не произойдет. Тогда вам не нужно скрываться от каких-либо ошибок.
Вы всегда должны покрывать базу, что могут произойти ошибки:
if (!$result) { die(mysql_error()); }
По крайней мере, тогда вы, скорее всего, исправите ошибку, а не оставите пользователей с вопиющей уродливой ошибкой в их лице.
Вам не нужно предотвращать это сообщение об ошибке!
Сообщения об ошибках – ваши друзья!
Без сообщения об ошибке вы никогда не узнаете, что произошло.
Все в порядке! Любой рабочий код должен выдавать сообщения об ошибках.
Хотя сообщения об ошибках требуют правильной обработки. Обычно вам не нужно предпринимать никаких специальных действий, чтобы избежать таких сообщений об ошибках. Просто оставьте свой код неповрежденным. Но если вы не хотите, чтобы это сообщение об ошибке отображалось пользователю, просто отключите его. Не само сообщение об ошибке, а разглашение его пользователю.
ini_set('display_errors',0); ini_set('log_errors',1);
или даже лучше на уровне .htaccess / php.ini
И пользователь никогда не увидит никаких сообщений об ошибках. Пока вы сможете увидеть его в журнале ошибок.
Обратите внимание, что error_reporting должен быть максимальным в обоих случаях.
Чтобы предотвратить это сообщение, вы можете проверить результат mysql_query и запустить fetch_assoc только с успехом.
Но обычно никто не использует его, так как может потребоваться слишком много вложенных if.
Но может быть и решение – исключения!
Но это еще не обязательно. Вы можете оставить свой код так, как есть, потому что он должен работать без ошибок, когда это делается.
Использование return
– это еще один способ избежать вложенных сообщений об ошибках. Вот фрагмент моей функции обработки базы данных:
$res = mysql_query($query); if (!$res) { trigger_error("dbget: ".mysql_error()." in ".$query); return false; } if (!mysql_num_rows($res)) return NULL; //fetching goes here //if there was no errors only
Если вы просто хотите подавить предупреждения от функции, вы можете добавить знак @
впереди:
<?php @function_that_i_dont_want_to_see_errors_from(parameters); ?>