8
votes

Essayer d'obtenir la propriété de non-objet mysqli résultat

Vous avez un peu de code PHP, je me débatte - eu une recherche autour de Google, etc. et j'ai essayé tout mentionné, mais pour une raison quelconque, j'ai du mal à résoudre.

Le problème est:

J'ai un certain code qui interroge une base de données pour la présence d'un utilisateur particulier.

Le code (c'est une méthode à l'intérieur d'une classe) xxx < p> J'ai Var a largué le résultat de la requête ($ R) et j'ai obtenu ceci: xxx

Ceci est correct, il ne devrait y avoir qu'une ligne ci-dessus.

Je reçois cette erreur de liaison à la ligne indiquant si ($ r-> num_rows) {

avis: essayer d'obtenir la propriété de non-objet dans le fichier La ligne de ligne

mais je ne sais pas pourquoi, car l'objet est valide (comme ci-dessus) et cela devrait fonctionner correctement. D'après ce que je peux dire, il semble passer d'accord, je me demandais pourquoi il y a une erreur. Je suis sûr que c'est quelque chose de simple mais j'apprécierais toute aide.


9 commentaires

C'est vraiment très étrange, essayez de var_dump ($ r-> num_rows) . BTW: Si vous utilisez MySQLI, pourquoi n'utilisez-vous pas des déclarations préparées ou d'échapper au moins aux valeurs insérées?


avez-vous essayé $ r ["num_rows"]]


Ceci est juste au début du développement précoce pour le moment, je n'ai donc pas ajouté d'échappé, etc., mais dès sa publication, elle sera annulée en conséquence. Des idées sur mon problème réel?


Vous utilisez globalement, faites-moi de deviner que vous passez à un autre fichier à un autre fichier de traitement


@Haim oui j'ai utilisé $ mysqli = nouveau mysqli ("localhost", "utilisateur", '', 'db');


@Roshan Selon le manuel , la notation de La question est correcte


J'obtiens aussi int (1) quand j'ajouter var_dump ($ r-> num_rows) donc il semble que l'int (1) arrive, donc je n'ai aucune idée de pourquoi Un message apparaît ?!


Il semble fonctionner lorsque je change de renvoi de faux dans la déclaration IF à autre chose (c'est-à-dire retour vrai, etc.). Quelqu'un sache quelque chose derrière pourquoi?


Utilisez la fonction ISSET pour l'enregistrement si l'instruction: Si (ESSET ($ R-> NUM_ROWS))


5 Réponses :


-2
votes

Je pensais juste que je devrais développer cela un peu.

Si vous exécutez une requête MySQLI Sélectionner qui renvoie 0 résultats, il renvoie false.

Cependant, si vous obtenez cette erreur et que vous avez écrit Votre propre fonction de requête MySQLI, vous pouvez également obtenir cette erreur si la requête que vous utilisez n'est pas une mise à jour, mais une mise à jour. Une requête de mise à jour reviendra être vraie ou false. Donc, si vous supposez simplement que tout résultat non faux aura des enregistrements renvoyés, vous allez trébucher lorsque vous exécutez une mise à jour ou autre chose que SELECT.

La solution la plus facile, une fois que vous avez vérifié que ce n'est pas faux. , est de vérifier d'abord que le résultat de la requête est un objet. xxx


3 commentaires

La première ligne de cette réponse est fausse. Il ne renvoie que false quand il y a une erreur. Une requête avec 0 correspondance n'est pas une erreur.


Vous avez manqué le bit où j'ai dit que vous exécutez une mise à jour, pas une sélection.


Désolé, je n'ai pas regardé de près la question. Je pensais que vous parliez de mysqli :: Query () , pas une méthode écrite d'utilisateur avec ses propres critères pour le retour false .



-1
votes

J'ai travaillé à écrire un module personnalisé à Drupal 7 et obtenu la même erreur:

Avis: essayer d'obtenir une propriété de non-objet p> blockQuote>

Mon code est quelque chose comme ceci: p> xxx pré>

solution: Je viens d'ajouter une condition si (is_object ($ sqlresult)) code>, et tout s'est bien passé. P>

Voici mon code final: p>

function mediaten_node_access($node, $op, $account) {

    if (is_object($node)){

     if ($node->type == 'page' && $op == 'update') {
       drupal_set_message('This poll has been published, you may not make changes.','error');
       return NODE_ACCESS_DENY;    
      }

    }

}


0 commentaires

-1
votes

Je pense que ce n'est pas la raison pour laquelle tout le monde a dit au-dessus. Il y a quelque chose qui ne va pas dans votre code, peut-être manquer d'orthographe ou d'incompatibilité avec les noms de colonne de base de données. Si la requête MySQLI ne reçoit aucun résultat, elle reviendra de faux, de sorte que ce ne soit pas un objet - est une mauvaise idée. Tout fonctionne bien. Il retourne 1 ou 0 si la requête a des résultats ou non.

Donc, ma suggestion est de vérifier vos noms de variable et vos noms de colonne de table ou tout autre mal orthographique.


0 commentaires

29
votes
$sql = "SELECT * FROM table";
$result = $conn->query($sql);

if (!$result) {
    trigger_error('Invalid query: ' . $conn->error);
}
check the error with mysqli_error() function probably your query has some faults.

0 commentaires

2
votes

La cause de votre problème est simple. Tant de personnes vont courir dans le même problème, parce que je faisais aussi et cela m'a pris heure pour comprendre. Juste au cas où, quelqu'un d'autre trébuche, le problème est dans votre requête, votre relevé de sélection appelle $ dbname au lieu du nom de la table. Donc, ce n'est pas trouvé pour le retour faux qui est booléen . Bonne chance.


0 commentaires