Een query kan om verschillende redenen mislukken, in welk geval zowel de mysql_* als de mysqli-extensie false
retourneert van hun respectievelijke zoekfuncties/-methoden. U moet die foutconditie testen en dienovereenkomstig behandelen.
OPMERKING De mysql_-functies zijn verouderd en zijn verwijderd in php versie 7.
Controleer $result
voordat je het doorgeeft aan mysql_fetch_array
. Je zult zien dat het false
. is omdat de query is mislukt. Zie de mysql_query
documentatie voor mogelijke retourwaarden en suggesties om hiermee om te gaan.
$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'];
}
mysqli-extensie
procedurele stijl :
$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-stijl :
$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 ) {
...
met behulp van een voorbereide verklaring:
$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 ) {
...
Deze voorbeelden illustreren alleen wat moet worden gedaan (foutafhandeling), niet hoe het moet. Productiecode mag geen gebruik maken van or die
bij het uitvoeren van HTML, zal het anders (op zijn minst) ongeldige HTML genereren. Ook mogen database-foutberichten niet worden weergegeven aan niet-beheerders, omdat het geeft te veel informatie
.