Foros del Web » Programando para Internet » PHP »

Error con mysqli_num_rows()

Estas en el tema de Error con mysqli_num_rows() en el foro de PHP en Foros del Web. Por qué motivo este script me devuelve el siguiente error?: Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in c:\SERVIDOR\htdocs.... Código PHP: session_start ...
 
Antiguo 04/11/2005, 03:34
 
Fecha de Ingreso: mayo-2003
Mensajes: 527
Antigüedad: 23 años, 4 meses
Puntos: 3
Exclamación Error con mysqli_num_rows()

Por qué motivo este script me devuelve el siguiente error?:
Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in c:\SERVIDOR\htdocs....

Código PHP:
session_start();
..........
if (isset(
$_POST['userid']) && isset($_POST['password'])) {
        
// El usuario ha enviado log in a través del formulario

        // Conexión a base de datos
        
@$db = mysqli_connect('localhost', 'validador', 'passValidador', 'autenticacion');
        
        
// Se ha producido error de conexión?:
        
if (mysqli_connect_errno()) {
            
// Error al intentar acceder a base de datos
            
echo 'No se ha podido hacer la conexión a la base de datos. Inténtelo más tarde.<br />';
            exit;
        }
        
        
// Nombres cortos a var. superglobales de formulario:
        
$userid = $_POST['userid'];
        
$password = $_POST['password'];

        
// Consulta:
        
$consulta = "select * from autorizados where name=".$userid." and password=".$password;
        
$result = mysqli_query($db, $consulta);
        
$num_results = mysqli_num_rows($result);
        
        
// Se ha obtenido alguna coincidencia?
        
if ($num_results > 0) {
            
// Se ha obtenido un valor coincidente en tabla de usuarios registrados con el userid y password proporcionados
            // Creamos la variable de sesión idusuario
            
$_SESSION['usuario_valido'] = $userid;
        } 
        
// Finalizar consulta:                
        
mysqli_free_result($result);
        
mysqli_close($db);
    }
............... 
Es extraño, porque en consultas parecidas no me ha ocurrido esto. También me sale la misma Warning para la línea de mysqli_free_result($result);

Alguna sugerencia?

Última edición por Tigervlc; 04/11/2005 a las 03:40
 
Antiguo 04/11/2005, 04:19
 
Fecha de Ingreso: mayo-2004
Mensajes: 393
Antigüedad: 22 años, 5 meses
Puntos: 0
Código PHP:
$consulta = "select * from autorizados where name=".$userid." and password=".$password; 
Esta línea está mal aquí: password=".$password;

No sé si con esto se arreglará tu problema.

Saludos.
 
Antiguo 04/11/2005, 04:24
 
Fecha de Ingreso: mayo-2003
Mensajes: 527
Antigüedad: 23 años, 4 meses
Puntos: 3
Está mal?? no me ha dado parse error. Dónde crees que está el error ahí?. De todas formas he probado con

Código PHP:
$consulta = "select * from autorizados where name=".$userid." and password=".
                        
$password." limit 1"; 
para que la línea de consulta no acabase en una variable,

y también da error la línea de mysqli_num_rows
 
Antiguo 04/11/2005, 04:47
 
Fecha de Ingreso: mayo-2004
Mensajes: 393
Antigüedad: 22 años, 5 meses
Puntos: 0
Lo que veía es que no cerrabas las comas de $password
 
Antiguo 04/11/2005, 06:10
 
Fecha de Ingreso: mayo-2003
Mensajes: 527
Antigüedad: 23 años, 4 meses
Puntos: 3
Yo creo que esa línea está bien. De todas formas la he mejorado añadiéndole limit 1 al final (ya que en este caso se espera sólo un resultado porque sólo puede haber un registro con un nombre de usuario y password exclusivos).

Pero bueo, que el error no está ahí seguro. Parece que mysqli_num_rows espere recibir otro resultado del que se le pasa con $result

Me pasa algo parecido si uso el método orientado a objetos:
$num_results = $result->num_rows;

en este caso tb me dice que esperaba recibir otro tipo.

No lo entiendo, porque lo hago tal cual debería ser no?
 
Antiguo 04/11/2005, 08:08
 
Fecha de Ingreso: mayo-2003
Mensajes: 527
Antigüedad: 23 años, 4 meses
Puntos: 3
Ya está claro: me faltaba delimitar los valores de los campos de la consulta entre comillas simples:

Código PHP:
$consulta = "select * from autorizados where name='".$userid."' and password='".$password."' limit 1"; 
 
Antiguo 04/11/2005, 09:05
 
Fecha de Ingreso: mayo-2004
Mensajes: 393
Antigüedad: 22 años, 5 meses
Puntos: 0
Me alegro de que lo hayas solucionado.

Lo que me deja algo confuso y perplejo es que la sentencia pueda funcionar sin cerrar todas las comas. Siempre pensé que esto era algo fundamental. Pero veo que en según que casos, puede evitarse.

Saludos.
 
Antiguo 05/11/2005, 10:38
 
Fecha de Ingreso: mayo-2003
Mensajes: 527
Antigüedad: 23 años, 4 meses
Puntos: 3
Al decir comas te refieres a las comillas no?

Es que por comas, entiendo esto: (,) y luego están las comillas simples ('algo') y dobles ("algo").

Pues es un comportamiento que permite la construcción dinámica de expresiones cuyo valor no sabemos de antemano (está almacenado en variables), y que han de ir entre comillas. P.ej:

Código PHP:
"......... name='".$userid."' and ........" 
Así se consigue que el intérprete de PHP antes de enviar la consulta a MySQL, haga que dentro de la cadena, el valor de la variable vaya entrecomillado:

Código PHP:
"......... name='soyUnUsuario' and ........" 
, que es como debe estar el valor de cada campo en la consulta MySQL, cosa que olvidé y por eso más que nada abrí este hilo porque no las puse y me daba error. Tonto de mí.

Siempre que uses alternancia o anidamiento entre clases de comillas lo puedes hacer. Si quieres mostrar una cadena con una comilla doble, puedes hacer:

Código PHP:
echo 'Esto son comillas dobles: (")'; 
y al revés:

Código PHP:
echo "Esto es una comilla simple o apóstrofe: (')"; 
Esto estaría mal lógicamente:

Código PHP:
echo "Esto son comillas dobles: (")";
echo 'Esto es una comilla simple o apóstrofe: (')'; 
pero se podría solventar escapando las comillas internas, que quieres salvar para la cadena:

Código PHP:
echo "Esto son comillas dobles: (\")";
echo 
'Esto es una comilla simple o apóstrofe: (\')'; 
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta



La zona horaria es GMT -6. Ahora son las 03:24.