Une requête peut échouer pour diverses raisons, auquel cas mysql_* et l'extension mysqli renverront false
à partir de leurs fonctions/méthodes de requête respectives. Vous devez tester cette condition d'erreur et la gérer en conséquence.
REMARQUE Les fonctions mysql_ sont obsolètes et ont été supprimés dans la version 7 de php.
Vérifier $result
avant de le passer à mysql_fetch_array
. Vous constaterez que c'est false
car la requête a échoué. Voir le mysql_query
documentation sur les valeurs de retour possibles et suggestions sur la façon de les gérer.
$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 ) {
...
style oo :
$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 instruction 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 ne font qu'illustrer ce que doit être fait (gestion des erreurs), pas comment le faire. Le code de production ne doit pas utiliser or die
lors de la sortie HTML, sinon il générera (à tout le moins) du code HTML invalide. De plus, les messages d'erreur de base de données ne doivent pas être affichés pour les utilisateurs non administrateurs, car ils divulgue trop d'informations
.