Mysql
 sql >> Database >  >> RDS >> Mysql

mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows ecc... si aspetta che il parametro 1 sia una risorsa

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.

estensione mysql_* :

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 .