mysqli_connect()
recommande de vérifier la valeur de retour et d'afficher un message d'erreur à l'écran.
$link = mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db"); if (!$link) { echo "Error: Unable to connect to MySQL." . PHP_EOL; echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL; echo "Debugging error: " . mysqli_connect_error() . PHP_EOL; exit; }
De même, pour les constructeurs de style POO, ceci est recommandé :
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db'); if ($mysqli->connect_error) { die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error); }
Certains utilisateurs de Stack Overflow ont même utilisé du code avecmysqli_error($conn)
comme ceci :
$conn = mysqli_connect('localhost', 'a', 'a'); if (!$con) { die('Could not connect: ' . mysqli_error($conn)); }
Mais depuis quelques semaines, je me pose la question : pourquoi dois-je faire ça ? Le résultat du premier exemple est :
Attention : mysqli_connect() : (HY000/1045) : accès utilisateur refusé 'my_user'@'localhost' (utiliser le mot de passe : OUI) C:xampp...mysqli.php ligne 4
Erreur : Impossible de se connecter à MySQL. Numéro d'erreur de débogage : 1045 Débogage Erreur : Accès refusé pour l'utilisateur "my_user"@"localhost" (en utilisant le mot de passe : Oui)
Comme vous pouvez le constater, le message d'erreur s'affiche deux fois ! Le « débogage » manuel fournit en réalité moins d’informations.
Devrions-nous vérifier manuellement les erreurs de connexion ? Pouvons-nous obtenir plus d’informations que les avertissements automatisés de cette façon ? Est-ce une pratique recommandée ?
N'affichez jamais les erreurs de connexion manuellement !
MySQLi générera un avertissement s'il ne parvient pas à ouvrir une connexion à MySQL. Cet avertissement vous indique tout ce que vous devez savoir, y compris le code d'erreur, le message d'erreur et l'endroit où l'erreur s'est produite dans le code. La vérification manuelle des erreurs ne vous donnera pas plus d'informations.
Si vous ne voyez pas d'avertissements et ne parvenez pas à créer une connexion, cela signifie probablement que votre PHP n'est pas configuré pour les afficher. Dans ce cas, vous devez vérifier le fichier journal des erreurs sur le serveur. Si vous ne savez pas où il se trouve, utilisez
phpinfo() code>
获取该信息并搜索error_log
. Il vous indiquera où se trouvent les fichiers journaux d’erreurs.S'il n'y a aucun avertissement dans le journal des erreurs, cela signifie probablement que votre rapport d'erreurs PHP a été réduit au silence (complètement ou juste des avertissements). Vérifiez votre configuration PHP.
Dans un environnement deproduction, ces paramètres doivent être préservés :
error_reporting
必须为E_ALL
log_errors
必须开启
display_errors
必须关闭
Il fautFermer
Dans un environnement dedéveloppement
, ces paramètres doivent être préservés :error_reporting
必须为E_ALL
log_errors
必须开启
display_errors
必须开启
Doitactiver
Comme vous pouvez le voir dans le message d'erreur, le nom d'utilisateur et le mot de passe de votre base de données ont été divulgués à l'utilisateur final. Il s’agit d’informations sensibles que vous ne souhaitez montrer à personne. En fait, les utilisateurs ordinaires ne comprendront pas ce mystérieux message. C'est pourquoidisplay_errors
doit toujours être désactivé dans un environnement de production. Il est possible de consigner les erreurs sur le serveur en toute sécurité.
Avertissements et exceptions
!die/exit
Les avertissements n'arrêtent pas le script. Si un avertissement est émis, le script poursuivra son exécution jusqu'à ce qu'une erreur fatale soit rencontrée. Dans la plupart des cas, vous devez lever une exception pour arrêter le script.N'utilisez pasSi la connexion mysqli ne peut pas être établie, une exception doit être levée, qui, si elle n'est pas gérée, apparaîtra et arrêtera le script avec une erreur fatale. Vous pouvez configurer MySQLi pour qu'il lève automatiquement des exceptions. Ceci est inestimable car toutes les fonctions mysqli peuvent échouer pour diverses raisons, et elles ne vous informeront d'aucun problème à moins que vous ne vérifiiez manuellement chacune d'elles pour détecter les erreurs. Utilisez la ligne suivante avant d'ouvrir la connexion :
Ne détectez pas les exceptions à moins de savoir vraiment comment les gérer ! Un cas d'utilisation possible est décrit dans Comment se connecter correctement en utilisant MySQLimysqli_error()
Des problèmes liés à la connexion peuvent-ils être affichés ?
Non. Doit être une connexion mysqli valide, sinon vous obtiendrez ce message d'erreur :mysqli_error($conn)
预计 mysqli 连接成功。$conn
$conn->error
和mysqli_error($conn)
ne peut afficher aucune erreur liée à la connexion !Connexe :Dois-je vérifier manuellement les erreurs lors de l'appel de « mysqli_stmt_prepare » ?p>