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.
$mysqli
variable?SELECT
requête. Avez-vous vérifié cela?Réponses:
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:
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_reporting
doit être mis àE_ALL
valeur;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 1Sur un serveur de production
error_reporting
doit être mis àE_ALL
valeur;log_errors
doit être défini sur 1display_errors
doit être mis à 0Comment 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: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.
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
@
)! Cela rend un programmeur incapable de lire le message d'erreur et donc incapable de corriger l'erreurdie()
ouecho
ou 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.if($result)
). Avec les exceptions d'erreur activées, une telle condition sera tout simplement inutile.try..catch
opé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.
la source