Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows etc... espera que o parâmetro 1 seja resource


Uma consulta pode falhar por vários motivos, caso em que tanto a extensão mysql_* quanto a extensão mysqli retornarão false de suas respectivas funções/métodos de consulta. Você precisa testar essa condição de erro e tratá-la adequadamente.

extensão mysql_* :

OBSERVAÇÃO As funções mysql_ estão obsoletas e foram removidos na versão 7 do php.

Verifique $result antes de passá-lo para mysql_fetch_array . Você verá que é false porque a consulta falhou. Veja o mysql_query documentação para possíveis valores de retorno e sugestões de como lidar com eles.
$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'];
}

extensão mysqli
estilo de procedimento :
$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 ) {
        ...

estilo 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 ) {
      ...

usando uma declaração preparada:
$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 ) {
      ...

Esses exemplos apenas ilustram o que deve ser feito (tratamento de erros), não como fazê-lo. O código de produção não deve usar or die ao gerar HTML, senão ele (no mínimo) gerará HTML inválido. Além disso, as mensagens de erro do banco de dados não devem ser exibidas para usuários não administradores, pois divulga muita informação .