как предотвратить эту ошибку: Предупреждение: mysql fetch assoc() ожидает, что параметр 1 будет ресурсным, логическим, заданным в... в строке 11 [дубликат]


Возможный Дубликат:
Ошибка PHP: mysql_fetch_array() ожидает, что параметр 1 будет ресурсным, с логическим значением

Меня очень смущает эта ошибка, она появляется, когда я пытаюсь вернуть результат из БД, которого не существует... Я попробовал mysql_num_rows(), но он возвращает ту же ошибку, но вместо mysql_fetch_assoc ожидает... он говорит, что mysql_num_rows() ожидает...

Я установил error_reporting(0), чтобы избежать отображения этой ошибки, но я не удовлетворен этим решением...

Author: Community, 2010-06-28

6 answers

Вот правильный способ сделать что-то:

<?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.
}

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

 14
Author: timdev, 2010-06-28 00:22:07

Вы должны проверить, является ли результат, возвращаемый mysql_query, ложным.

$r = mysql_qyery("...");
if ($r) {
  mysql_fetch_assoc($r);
}

Вы можете использовать @mysql_fetch_assoc($r), чтобы избежать отображения ошибок.

 1
Author: Pavel Strakhov, 2010-06-27 23:59:49

Правильный синтаксис (в примере):

$query = mysql_query('SELECT * FROM beer ORDER BY quality');
while($row = mysql_fetch_assoc($query)) $results[] = $row;
 0
Author: cypher, 2010-06-28 00:03:48

Вот как вы должны использовать mysql_fetch_assoc():

$result = mysql_query($query);

while ($row = mysql_fetch_assoc($result)) {
    // Do stuff with $row
}

$результат должен быть ресурсом. Даже если запрос не возвращает строк, $result все равно остается ресурсом. Единственный раз, когда $result является логическим значением, это если при запросе базы данных произошла ошибка. В этом случае вы должны выяснить, что это за ошибка, используя mysql_error() и убедитесь, что она не может произойти. Тогда вам не придется прятаться от каких-либо ошибок.

Вы всегда должны покрывать основывайтесь на том, что ошибки могут произойти, выполнив:

if (!$result) {
    die(mysql_error());
}

По крайней мере, тогда у вас будет больше шансов на самом деле исправить ошибку, а не оставлять пользователей с вопиющей уродливой ошибкой на их лице.

 0
Author: Joseph Mansfield, 2010-06-28 00:17:40

Вам не нужно предотвращать это сообщение об ошибке!
Сообщения об ошибках - ваши друзья!
Без сообщения об ошибке вы бы никогда не узнали, что произошло.
Все в порядке! Любой рабочий код должен выдавать сообщения об ошибках.

Хотя сообщения об ошибках требуют надлежащей обработки. Обычно вам не нужно предпринимать никаких специальных действий, чтобы избежать таких сообщений об ошибках. Просто оставьте свой код нетронутым. Но если вы не хотите, чтобы это сообщение об ошибке отображалось пользователю, просто отключите его. Не само сообщение об ошибке, но отправляющее его пользователю.

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
 0
Author: Your Common Sense, 2010-06-28 00:35:47

Если вы просто хотите отключить предупреждения от функции, вы можете добавить знак @ спереди:

<?php @function_that_i_dont_want_to_see_errors_from(parameters); ?>
 -2
Author: Computerish, 2010-06-27 23:59:21