Una consulta puede fallar por varios motivos, en cuyo caso tanto la extensión mysql_* como mysqli devolverán false
de sus respectivas funciones/métodos de consulta. Debe probar esa condición de error y manejarla en consecuencia.
NOTA Las las funciones mysql_ están en desuso y han sido eliminados en la versión 7 de php.
Comprobar $result
antes de pasarlo a mysql_fetch_array
. Verás que es false
porque la consulta falló. Consulte el mysql_query
documentación para posibles valores de retorno y sugerencias sobre cómo manejarlos.
$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'];
}
extensión mysqli
estilo procesal :
$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 una declaración 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 ) {
...
Estos ejemplos solo ilustran qué debe hacerse (manejo de errores), no cómo hacerlo. El código de producción no debería usar or die
al generar HTML, de lo contrario (como mínimo) generará HTML no válido. Además, los mensajes de error de la base de datos no deben mostrarse a usuarios que no sean administradores, ya que divulga demasiada información
.