Eine Abfrage kann aus verschiedenen Gründen fehlschlagen. In diesem Fall geben sowohl mysql_* als auch die mysqli-Erweiterung false
zurück von ihren jeweiligen Abfragefunktionen/-methoden. Sie müssen diese Fehlerbedingung testen und entsprechend behandeln.
HINWEIS Die mysql_-Funktionen sind veraltet und wurden in PHP-Version 7 entfernt.
Prüfen Sie $result
bevor es an mysql_fetch_array
übergeben wird . Sie werden feststellen, dass es false
ist weil die Abfrage fehlgeschlagen ist. Siehe mysql_query
Dokumentation für mögliche Rückgabewerte und Vorschläge zum Umgang damit.
$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-Erweiterung
prozeduraler Stil :
$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-Stil :
$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 ) {
...
unter Verwendung einer vorbereiteten Anweisung:
$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 ) {
...
Diese Beispiele veranschaulichen nur was getan werden sollte (Fehlerbehandlung), nicht wie es zu tun ist. Produktionscode sollte nicht or die
verwenden
bei der Ausgabe von HTML, sonst wird es (zumindest) ungültiges HTML erzeugen. Außerdem sollten Datenbankfehlermeldungen nicht für Benutzer ohne Administratorrechte angezeigt werden, da es offenbart zu viele Informationen
.