Chaque fois que vous obtenez le ...
"Avertissement: mysqli_fetch_object () s'attend à ce que le paramètre 1 soit mysqli_result, booléen étant donné"
... il est probable qu'il y ait un problème avec votre requête. Le prepare()
ou query()
peut retourner FALSE
(un booléen), mais ce message d'échec générique ne vous laisse pas beaucoup d'indices. Comment trouvez-vous ce qui ne va pas avec votre requête? Vous demandez !
Tout d'abord, assurez-vous que le rapport d'erreurs est activé et visible: ajoutez ces deux lignes en haut de vos fichiers juste après votre <?php
balise d' ouverture :
error_reporting(E_ALL);
ini_set('display_errors', 1);
Si votre rapport d'erreurs a été défini dans le php.ini, vous n'aurez pas à vous en soucier. Assurez-vous simplement de gérer les erreurs avec élégance et de ne jamais révéler la véritable cause des problèmes à vos utilisateurs. Révéler la véritable cause au public peut être une invitation gravée en or pour ceux qui veulent nuire à vos sites et serveurs. Si vous ne souhaitez pas envoyer d'erreurs au navigateur, vous pouvez toujours surveiller les journaux d'erreurs de votre serveur Web. Les emplacements des journaux varient d'un serveur à l'autre, par exemple, sur Ubuntu, le journal des erreurs se trouve généralement à /var/log/apache2/error.log
. Si vous examinez les journaux d'erreurs dans un environnement Linux, vous pouvez utiliser tail -f /path/to/log
dans une fenêtre de console pour voir les erreurs telles qu'elles se produisent en temps réel ... ou lorsque vous les faites.
Une fois que vous serez au courant des rapports d'erreur standard, l'ajout de la vérification des erreurs sur votre connexion à la base de données et vos requêtes vous donnera beaucoup plus de détails sur les problèmes en cours. Jetez un œil à cet exemple où le nom de la colonne est incorrect. Tout d'abord, le code qui renvoie le message d'erreur fatale générique:
$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
$query = $mysqli->prepare($sql)); // assuming $mysqli is the connection
$query->bind_param('s', $definition);
$query->execute();
L'erreur est générique et n'est pas très utile pour résoudre ce qui se passe.
Avec quelques lignes de code supplémentaires, vous pouvez obtenir des informations très détaillées que vous pouvez utiliser pour résoudre le problème immédiatement . Vérifiez la prepare()
véracité de la déclaration et si elle est bonne, vous pouvez passer à la liaison et à l'exécution.
$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
if($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection
$query->bind_param('s', $definition);
$query->execute();
// any additional code you need would go here.
} else {
$error = $mysqli->errno . ' ' . $mysqli->error; // 1054 Unknown column 'foo' in 'field list'
// handle error
}
Si quelque chose ne va pas, vous pouvez cracher un message d'erreur qui vous amène directement au problème. Dans ce cas, il n'y a pas de foo
colonne dans le tableau, la résolution du problème est triviale.
Si vous le souhaitez, vous pouvez inclure cette vérification dans une fonction ou une classe et l'étendre en gérant les erreurs avec élégance comme mentionné précédemment.