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 ...
  #1 (permalink)  
Antiguo 04/11/2005, 03:34
 
Fecha de Ingreso: mayo-2003
Mensajes: 527
Antigüedad: 20 años, 10 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
  #2 (permalink)  
Antiguo 04/11/2005, 04:19
 
Fecha de Ingreso: mayo-2004
Mensajes: 393
Antigüedad: 19 años, 11 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.
  #3 (permalink)  
Antiguo 04/11/2005, 04:24
 
Fecha de Ingreso: mayo-2003
Mensajes: 527
Antigüedad: 20 años, 10 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
  #4 (permalink)  
Antiguo 04/11/2005, 04:47
 
Fecha de Ingreso: mayo-2004
Mensajes: 393
Antigüedad: 19 años, 11 meses
Puntos: 0
Lo que veía es que no cerrabas las comas de $password
  #5 (permalink)  
Antiguo 04/11/2005, 06:10
 
Fecha de Ingreso: mayo-2003
Mensajes: 527
Antigüedad: 20 años, 10 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?
  #6 (permalink)  
Antiguo 04/11/2005, 08:08
 
Fecha de Ingreso: mayo-2003
Mensajes: 527
Antigüedad: 20 años, 10 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"
  #7 (permalink)  
Antiguo 04/11/2005, 09:05
 
Fecha de Ingreso: mayo-2004
Mensajes: 393
Antigüedad: 19 años, 11 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.
  #8 (permalink)  
Antiguo 05/11/2005, 10:38
 
Fecha de Ingreso: mayo-2003
Mensajes: 527
Antigüedad: 20 años, 10 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 20:11.