Une requête peut échouer pour diverses raisons, auquel cas les extensions mysql_* et mysqli renverront toutes deux false
à partir de leurs fonctions/méthodes d'interrogation respectives. Vous devez tester cette condition d'erreur et la traiter en conséquence.
L'extension mysql_* :
NOTE Le site Les fonctions mysql_ sont dépréciées et ont été supprimés dans la version 7 de php.
Vérifiez $result
avant de le transmettre à mysql_fetch_array
. Vous verrez que c'est false
parce que la requête a échoué. Voir le mysql_query
pour connaître les valeurs de retour possibles et les suggestions sur la façon de les traiter.
$username = mysql_real_escape_string($_POST['username']);
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");
if($result === FALSE) {
die(mysql_error()); // TODO: better error handling
}
while($row = mysql_fetch_array($result))
{
echo $row['FirstName'];
}
extension mysqli
style procédural :
$username = mysqli_real_escape_string($mysqli, $_POST['username']);
$result = mysqli_query($mysqli, "SELECT * FROM Users WHERE UserName LIKE '$username'");
// mysqli_query returns false if something went wrong with the query
if($result === FALSE) {
yourErrorHandler(mysqli_error($mysqli));
}
else {
// as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
foreach( $result as $row ) {
...
oo-style :
$username = $mysqli->escape_string($_POST['username']);
$result = $mysqli->query("SELECT * FROM Users WHERE UserName LIKE '$username'");
if($result === FALSE) {
yourErrorHandler($mysqli->error); // or $mysqli->error_list
}
else {
// as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
foreach( $result as $row ) {
...
en utilisant une déclaration préparée :
$stmt = $mysqli->prepare('SELECT * FROM Users WHERE UserName LIKE ?');
if ( !$stmt ) {
yourErrorHandler($mysqli->error); // or $mysqli->error_list
}
else if ( !$stmt->bind_param('s', $_POST['username']) ) {
yourErrorHandler($stmt->error); // or $stmt->error_list
}
else if ( !$stmt->execute() ) {
yourErrorHandler($stmt->error); // or $stmt->error_list
}
else {
$result = $stmt->get_result();
// as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
foreach( $result as $row ) {
...
Ces exemples illustrent seulement ce que devrait être fait (gestion des erreurs), pas comment le faire. Le code de production ne devrait pas utiliser or die
lors de la sortie du HTML, sinon il générera (au minimum) du HTML invalide. De plus, les messages d'erreur de la base de données ne doivent pas être affichés aux utilisateurs non administrateurs, car cela pourrait nuire à l'intégrité de la base de données. divulgue trop d'informations .
15 votes
Vous pouvez obtenir des messages d'erreur plus utiles en utilisant: : QUERY ou die(mysql_error()) ;
124 votes
Et aussi la note obligatoire : Votre code est susceptible de Injection SQL . Vous devez valider et/ou échapper à la saisie de l'utilisateur. Jetez un coup d'œil à
mysql_real_escape_string
. Ne faites jamais confiance aux données des utilisateurs.7 votes
En fait, le code de l'OP provoquera une erreur de syntaxe sur le serveur MySQL, mais au moins il est no vulnérable à l'injection SQL car les guillemets simples n'ont pas d'interpolation de variable.
4 votes
@FelixKling Je réalise que c'est très ancien, et probablement le plus précis possible à l'époque, mais votre commentaire est maintenant dangereusement erroné dans un sens :
mysql_real_escape_string
n'est pas la panacée en matière de protection contre les injections SQL ; elle reste vulnérable à un certain nombre d'attaques. (Non, vous n'avez jamais dit qu'il était parfait, mais vous avez laissé entendre que c'était la seule solution requise) La meilleure solution actuelle est PDO, pour autant que je sache.0 votes
@NicHartley Pour ajouter à votre commentaire : aquí sont des descriptions sur la façon dont cela fonctionne.
2 votes
Gah. Étendre cette question pour inclure MySQLi et PDO était une mauvaise idée. Ils ont chacun leur propre syntaxe et leurs messages d'erreur légèrement différents et ils auraient parfaitement pu avoir leurs propres questions. Le fait de tout combiner en une seule question géante en trois parties ne fait que rendre cette question moins facile à trouver sur Google et oblige les personnes qui arrivent ici à se frayer un chemin à travers un contenu non pertinent pour arriver à ce qu'elles veulent. Cela a également invalidé un grand nombre des réponses ci-dessous, et rend cette question "trop large" selon les normes que nous appliquons normalement. C'est un désordre, à mon avis, mais il est trop tard pour le réparer maintenant.
1 votes
En plus de la première erreur, ce que vous avez affiché aurait déclenché une autre erreur, celle-ci pour
LIKE $username
car il est plus que probable que nous ayons affaire à une chaîne de caractères et non à un nombre entier. Il faudrait donc qu'elle soit citée.1 votes
Pour tous ceux qui viennent ici et qui utilisent MySQLi : veuillez plutôt consulter cet article : Comment obtenir le message d'erreur dans MySQLi ?