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

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

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

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

6 ответов


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

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

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


вы должны проверить, является ли результат, возвращенный 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());
}

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


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

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

ini_set('display_errors',0);
ini_set('log_errors',1);

или даже лучше .htaccess в/РНР.уровень Ини
И пользователь не увидит никаких сообщений об ошибках. Хотя вы все равно сможете увидеть его в журнале ошибок.
Обратите внимание, что error_reporting должен быть максимальным в обоих случаях.

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

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

используя 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); ?>