Una query potrebbe non riuscire per vari motivi, nel qual caso sia l'estensione mysql_* che l'estensione mysqli restituiranno false
dalle rispettive funzioni/metodi di interrogazione. Devi verificare la condizione di errore e gestirla di conseguenza.
NOTA Le funzioni mysql_ sono obsolete e sono stati rimossi in php versione 7.
Controlla $result
prima di passarlo a mysql_fetch_array
. Scoprirai che è false
perché la query non è riuscita. Vedi mysql_query
documentazione per possibili valori di ritorno e suggerimenti su come gestirli.
$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'];
}
estensione mysqli
stile procedurale :
$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 ) {
...
stile 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 ) {
...
utilizzando una dichiarazione preparata:
$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 ) {
...
Questi esempi illustrano solo cosa dovrebbe essere fatto (gestione degli errori), non come farlo. Il codice di produzione non deve utilizzare or die
durante l'output di HTML, altrimenti genererà (almeno) HTML non valido. Inoltre, i messaggi di errore del database non devono essere visualizzati per gli utenti non amministratori, poiché rivela troppe informazioni
.