web-dev-qa-db-fra.com

Comment obtenir des informations d'erreur MySQLi dans différents environnements

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

Erreur fatale: appel à un membre de la fonction 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é de l'exécuter via le panneau de configuration phpMyAdmin et le résultat est OK.

66
siopaoman

Tout d’abord, ayez toujours cette ligne avant que MySQLi se connecte dans all vos environnements:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

Après cela, toutes les erreurs MySQL seront transférées dans des exceptions PHP. L’exception Uncaught, à son tour, génère une erreur fatale PHP. Ainsi, en cas d'erreur MySQL, vous obtiendrez une erreur conventionnelle PHP. Cela vous fera instantanément prendre conscience de la cause de l'erreur. Une trace de pile vous mènera à l'endroit exact où une erreur s'est produite.

Notez que vous devez être capable de voir PHP erreurs en général . Et voici en effet la question des différents environnements:

  • Sur un site actif, vous devez jeter un coup d’œil dans les journaux d’erreurs, les paramètres doivent donc être conservés.

    error_reporting(E_ALL);
    ini_set('display_errors', 0);
    ini_set('log_errors', 1);
    
  • Sur un serveur de développement local, vous pouvez commettre des erreurs à l'écran:

    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    

Et une petite liste de ce que vous ne devriez pas :

  • Utiliser l'opérateur de suppression d'erreur (@)
  • Utilisez die() ou echo ou toute autre fonction pour imprimer le message d'erreur à l'écran sans condition. PHP peut déjà y revenir, aucune aide n'est requise.
  • Tester le résultat de la requête manuellement (comme if($result)) n'a aucun sens. Soit votre requête a échoué et vous obtiendrez déjà l’exception d’erreur, soit tout allait bien et il n’ya rien à tester.
  • Utilisez try..catch pour renvoyer le message d'erreur. Encore une fois PHP peut mieux faire, bien mieux.
75
Your Common Sense

Je ne pense pas que vous ayez créé l'objet.

$ mysqli = new mysqli ('localhost', 'mon_utilisateur', 'mon_password', 'monde');

mais je vous suggère vraiment d'utiliser PDO à la place.

0
Wayne Oliver