Zapytanie może zakończyć się niepowodzeniem z różnych powodów, w którym to przypadku zarówno mysql_*, jak i rozszerzenie mysqli zwrócą false
z odpowiednich funkcji/metod zapytania. Musisz przetestować ten stan błędu i odpowiednio go obsłużyć.
UWAGA funkcje mysql_ są przestarzałe i zostały usunięte w wersji php 7.
Sprawdź $result
przed przekazaniem go do mysql_fetch_array
. Przekonasz się, że to false
ponieważ zapytanie nie powiodło się. Zobacz mysql_query
dokumentacja dotycząca możliwych wartości zwrotów i sugestie, jak sobie z nimi radzić.
$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'];
}
rozszerzenie mysqli
styl proceduralny :
$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 ) {
...
w stylu 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 ) {
...
za pomocą przygotowanego oświadczenia:
$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 ) {
...
Te przykłady pokazują tylko, co należy zrobić (obsługa błędów), a nie jak to zrobić. Kod produkcyjny nie powinien używać or die
podczas wysyłania HTML, w przeciwnym razie (przynajmniej) wygeneruje nieprawidłowy kod HTML. Ponadto komunikaty o błędach bazy danych nie powinny być wyświetlane użytkownikom niebędącym administratorami, ponieważ ujawnia zbyt wiele informacji
.