mysqli_fetch_assoc () attend des erreurs de paramètre / appel à une fonction membre bind_param (). Comment obtenir l'erreur mysql réelle et la corriger?

109

Dans mon environnement local / de développement, la requête MySQLi fonctionne correctement. Cependant, lorsque je le télécharge sur mon environnement d'hébergement Web, j'obtiens cette erreur:

Erreur fatale: appel à une fonction membre bind_param () sur un non-objet dans ...

Voici le code:

global $mysqli;
$stmt = $mysqli->prepare("SELECT id, description FROM tbl_page_answer_category WHERE cur_own_id = ?");
$stmt->bind_param('i', $cur_id);
$stmt->execute();
$stmt->bind_result($uid, $desc);

Pour vérifier ma requête, j'ai essayé d'exécuter la requête via le panneau de contrôle phpMyAdmin et le résultat est OK.

siopoman
la source
Pouvons-nous voir où vous lancez la $mysqlivariable?
Rikesh
Il se peut que votre utilisateur MySQL ne dispose pas des privilèges nécessaires pour effectuer une SELECTrequête. Avez-vous vérifié cela?
Amal Murali
Ce qui me vient à l'esprit, c'est qu'il n'y a pas de mysqli disponible ou que vous avez fourni de mauvaises informations d'identification pour vous connecter à MySQL.
NB
@YourCommonSense - Avec l'ancien titre, il était plus simple de trouver cette question pour une référence en double.
Paul Spiegel
@Paul oui, c'est aussi ma plus profonde préoccupation. J'ai changé le titre pour des raisons de recherche Google et de reconnaissance globale, car pour l'utilisateur PHP moyen, la connexion entre son code et différents environnements n'est pas claire. Mais depuis, j'ai du mal à le trouver aussi. Finissez par l'avoir dans les signets. Si vous pouvez proposer un titre reconnaissable mais pertinent, ce serait génial
Votre bon sens

Réponses:

122

Parfois , votre code MySQLi produit une erreur comme mysqli_fetch_assoc() expects parameter..., Call to a member function bind_param()...ou similaire. Ou même sans aucune erreur, mais la requête ne fonctionne pas tout de même. Cela signifie que votre requête n'a pas pu s'exécuter.

Chaque fois qu'une requête échoue, MySQL a un message d'erreur qui explique la raison . Malheureusement, par défaut, ces erreurs ne sont pas transférées vers PHP, et tout ce que vous avez est un message d'erreur cryptique mentionné ci-dessus. Il est donc très important de configurer PHP et MySQLi pour vous signaler les erreurs MySQL. Et une fois que vous obtenez le message d'erreur, le réparer sera un jeu d'enfant.

Comment obtenir le message d'erreur dans MySQLi?

Tout d'abord, ayez toujours cette ligne avant que MySQLi ne se connecte dans tous vos environnements:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

Après cela, toutes les erreurs MySQL seront transférées dans les exceptions PHP. Une exception non interceptée, à son tour, crée une erreur PHP fatale. Ainsi, en cas d'erreur MySQL, vous obtiendrez une erreur PHP classique. Cela vous rendra instantanément conscient de la cause de l'erreur. Et une trace de pile vous mènera à l'endroit exact où l'erreur s'est produite.

Comment configurer PHP dans différents environnements

Voici l'essentiel de mon article sur les rapports d'erreurs PHP : Les
rapports d'erreurs sur un serveur de développement et en direct doivent être différents. Sur un serveur de développement, il est pratique d'afficher les erreurs à l'écran, mais sur un serveur en direct, les messages d'erreur doivent être consignés à la place pour que vous puissiez les retrouver plus tard dans le journal des erreurs.

Par conséquent, vous devez définir les options de configuration correspondantes sur les valeurs suivantes:

  • Sur un serveur de développement

    • error_reportingdoit être mis à E_ALLvaleur;
    • log_errors doit être défini sur 1 (il est également pratique d'avoir des journaux sur un PC de développement)
    • display_errors doit être défini sur 1
  • Sur un serveur de production

    • error_reportingdoit être mis à E_ALLvaleur;
    • log_errors doit être défini sur 1
    • display_errors doit être mis à 0

Comment l'utiliser réellement?

Supprimez simplement tout code qui vérifie l'erreur manuellement , tous ceux-ci or die(), if ($result)etc. Écrivez simplement votre code d'interaction de base de données tout de suite:

$stmt = $this->con->prepare("INSERT INTO table(name, quantity) VALUES (?,?)");
$stmt->bind_param("si", $name, $quantity);
$stmt->execute();

encore une fois, sans aucune condition autour . Si une erreur se produit, elle sera traitée comme toute autre erreur dans votre code. Par exemple, sur un PC de développement, il apparaîtra simplement à l'écran, tandis que sur un site en direct, il sera enregistré pour un programmeur, alors que pour la commodité de l'utilisateur, vous pouvez utiliser un gestionnaire d'erreurs (mais c'est une histoire différente qui est hors sujet pour MySQLi, mais vous pouvez le lire dans l'article lié ci-dessus).

Que faire du message d'erreur que vous recevez?

Tout d'abord, vous devez localiser la requête problématique. Le message d'erreur contient le nom du fichier et le numéro de ligne de l'endroit exact où l'erreur s'est produite. Pour le code simple, cela suffit, mais si votre code utilise des fonctions ou des classes, vous devrez peut-être suivre la trace de la pile pour localiser la requête problématique.

Après avoir reçu le message d'erreur, vous devez le lire et le comprendre. Cela semble trop évident, voire condescendant, mais les apprenants oublient souvent que le message d'erreur n'est pas seulement un signal d'alarme, mais qu'il contient en fait une explication détaillée du problème . Et tout ce dont vous avez besoin est de lire le message d'erreur et de résoudre le problème.

  • Dites, si cela indique qu'une table particulière n'existe pas, vous devez vérifier l'orthographe, les fautes de frappe, la casse des lettres. Vous devez également vous assurer que votre script PHP se connecte à une base de données correcte
  • Ou, s'il indique qu'il y a une erreur dans la syntaxe SQL, vous devez alors examiner votre SQL. Et le point problématique est juste avant la partie de requête citée dans le message d'erreur.

Si vous ne comprenez pas le message d'erreur, essayez de le rechercher sur Google. Et lorsque vous parcourez les résultats, tenez-vous-en aux réponses qui expliquent l'erreur plutôt que de donner carrément la solution. Une solution peut ne pas fonctionner dans votre cas particulier, mais l'explication vous aidera à comprendre le problème et vous permettra de le résoudre vous-même.

Vous devez également faire confiance au message d'erreur. S'il indique que le nombre de jetons ne correspond pas au nombre de variables liées, il en est ainsi. Il en va de même pour les tables ou colonnes absentes. Si vous avez le choix, que ce soit votre propre erreur ou que le message d'erreur soit erroné, respectez toujours le premier. Encore une fois, cela semble condescendant, mais des centaines de questions sur ce site même prouvent que ce conseil est extrêmement utile.

Une liste de choses que vous ne devriez jamais faire en ce qui concerne les rapports d'erreurs

  • N'utilisez jamais un opérateur de suppression d'erreurs ( @)! Cela rend un programmeur incapable de lire le message d'erreur et donc incapable de corriger l'erreur
  • N'utilisez pas die()ou echoou toute autre fonction pour imprimer le message d'erreur à l'écran sans condition. PHP peut signaler les erreurs par lui-même et le faire de la bonne manière dépend de l'environnement - alors laissez-le pour PHP.
  • N'ajoutez pas de condition pour tester le résultat de la requête manuellement (comme if($result)). Avec les exceptions d'erreur activées, une telle condition sera tout simplement inutile.
  • N'utilisez pas l' try..catchopérateur pour faire écho au message d'erreur. Cet opérateur doit être utilisé pour effectuer une gestion des erreurs, comme une annulation de transaction. Mais ne l'utilisez jamais uniquement pour signaler des erreurs - comme nous l'avons appris ci-dessus, PHP peut déjà le faire, de la bonne manière.

PS
Parfois, il n'y a pas d'erreur mais pas de résultats non plus. Cela signifie alors qu'il n'y a pas de données dans la base de données correspondant à vos critères . Dans ce cas, vous devez admettre ce fait, même si vous pouvez jurer que les données et les critères sont corrects. Ils ne sont pas. Vous devez les vérifier à nouveau. J'ai un article qui peut vous aider à ce sujet, Comment déboguer les interactions de base de données . Bien qu'il soit écrit pour PDO, mais le principe est le même. Suivez simplement cette instruction étape par étape et résolvez votre problème ou posez une question à laquelle Stack Overflow peut répondre.

Votre bon sens
la source
@AdamWinter en utilisant @ est toujours faux, et dans ce cas particulier il est décuplé. Les messages d'erreur à votre programme sont les mêmes qu'une douleur à votre corps. Cela vous indique que quelque chose ne va pas, comme si votre jambe était cassée. Et vous devez réparer la jambe, pas seulement prendre un analgésique et continuer. PAREIL ICI. PHP vous dit qu'aucune variable n'est attendue. Vous devez donc corriger le formulaire ou autre, pour rendre cette variable disponible. Pas seulement écrire un code pour contourner une erreur.
Votre bon sens