web-dev-qa-db-fra.com

comment éviter cette erreur: Avertissement: mysql_fetch_assoc () s'attend à ce que le paramètre 1 soit une ressource, un booléen donné en ... sur la ligne 11

Duplicata possible:
Erreur PHP: mysql_fetch_array () s'attend à ce que le paramètre 1 soit une ressource, booléen donné

Je suis très confus avec cette erreur, elle apparaît lorsque j'essaie de renvoyer un résultat de la base de données qui n'existe pas ... J'ai essayé mysql_num_rows() mais il renvoie la même erreur mais au lieu de mysql_fetch_assoc Attend ... il dit mysql_num_rows() attend ...

J'ai défini error_reporting(0) pour éviter d'afficher cette erreur, mais je ne suis pas satisfait de cette solution ...

8
Naughty.Coder

Voici la bonne façon de faire les choses:

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

Notez la vérification (! $ Result) - si votre $ result est un booléen, c'est certainement faux, et cela signifie qu'il y a eu une erreur de base de données, ce qui signifie que votre requête était probablement mauvaise.

13
timdev

Vous devez vérifier si le résultat retourné par mysql_query est faux.

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

Vous pouvez utiliser @mysql_fetch_assoc($r) pour éviter une erreur d'affichage.

1
Pavel Strakhov

La syntaxe appropriée est (dans l'exemple):

$query = mysql_query('SELECT * FROM beer ORDER BY quality');
while($row = mysql_fetch_assoc($query)) $results[] = $row;
0
cypher

Voici comment vous devriez utiliser mysql_fetch_assoc ():

$result = mysql_query($query);

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

$ result devrait être une ressource. Même si la requête ne renvoie aucune ligne, $ result est toujours une ressource. La seule fois où $ result est une valeur booléenne, c'est en cas d'erreur lors de l'interrogation de la base de données. Dans ce cas, vous devez découvrir quelle est cette erreur en utilisant mysql_error () et vous assurer qu'elle ne peut pas se produire . Vous n'avez alors pas à vous cacher d'erreurs.

Vous devez toujours couvrir la base que les erreurs mai se produisent en faisant:

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

Au moins alors, vous serez plus susceptible de corriger l'erreur plutôt que de laisser les utilisateurs avec une horrible erreur laide dans leur visage.

0
Joseph Mansfield

Vous n'avez pas besoin d'empêcher ce message d'erreur!
Les messages d'erreur sont vos amis!
Sans message d'erreur, vous ne sauriez jamais ce qui s'est passé.
C'est bon! Tout code de travail censé générer des messages d'erreur.

Bien que les messages d'erreur nécessitent une manipulation appropriée. Habituellement, vous n'avez pas à prendre de mesures spéciales pour éviter de tels messages d'erreur. Laissez simplement votre code intact. Mais si vous ne souhaitez pas que ce message d'erreur soit affiché à l'utilisateur, désactivez-le. Pas un message d'erreur lui-même, mais l'afficher à l'utilisateur.

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

ou encore mieux au niveau .htaccess/php.ini
Et l'utilisateur ne verra jamais aucun message d'erreur. Bien que vous puissiez toujours le voir dans le journal des erreurs.
Veuillez noter que error_reporting doit être au maximum dans les deux cas.

Pour éviter ce message, vous pouvez vérifier le résultat mysql_query et exécuter fetch_assoc uniquement en cas de succès.
Mais généralement, personne ne l'utilise car il peut nécessiter trop de si imbriqués.
Mais il peut aussi y avoir une solution - exceptions!

Mais ce n'est toujours pas nécessaire. Vous pouvez laisser votre code tel quel, car il est censé fonctionner sans erreur une fois terminé.

L'utilisation de return est une autre méthode pour éviter les messages d'erreur imbriqués. Voici un extrait de ma fonction de gestion de base de données:

  $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
Your Common Sense