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
.