1

hola que tal estoy haciendo un login con php y mysql pero al ejecutar mi codigo me aparece error en mysqli_free_result() y en mysqli_num_rows() aqui les dejo el codigo

<?php
session_start();
 $usuario=$_POST['email'];
 $contraseña=$_POST['contraseña'];

 $conexion=mysqli_connect("localhost","root","","datos_usuario");
 $consulta="SELECT * FROM datos WHERE email='$usuario' and contraseña='$contraseña'";
 $resultado=mysqli_query($conexion, $consulta);

 $filas=mysqli_num_rows($resultado);
 if ($filas >0){
  header("location:index.html");
 }else{
  echo "error en la autentificacion";
}
 mysqli_free_result($resultado);
 mysqli_close($conexion);
?>

la verdad no le encuentro adonde esta el error datos_usuario es la base de datos y datos es la tabla

este es el error que me aparece: Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, bool given in C:\xampp\htdocs\traductly\login.php on line 10 error en la autentificacion Warning: mysqli_free_result() expects parameter 1 to be mysqli_result, bool given in C:\xampp\htdocs\traductly\login.php on line 16

1 Answers1

2

Cuando escribas código, aunque parezca más tedioso, debes controlar totalmente el flujo de ese código, evaluando todas las posibilidades y enviando en cualquier caso un mensaje o algo que informe al usuario de lo ocurrido.

Tu código, por decirlo de alguna forma, es mudo es muchos puntos. Hay por lo menos 4 ó 5 casos en los que el código podría fallar y no haces nada al respecto.

Te aconsejo también que evites el uso de ñ, de acentos, de caracteres especiales, en los nombres de tablas o columnas de la base de datos, así como en el nombre de variables PHP.

Te dejo un ejemplo de código controlado, donde sabrás siempre lo que ha ocurrido para actuar en consecuencia.

En el código indico también la forma de establecer un charset adecuado a la conexión. Deberías también establecer un charset al documento actual PHP/HTML.

<?php
    session_start();
    $usuario=!empty ($_POST['email']) ? $_POST['email'] : NULL;
    $contraseña=!empty ($_POST['contraseña']) ? $_POST['contraseña'] : NULL;
    if ( $usuario && $contraseña ) {
        if ( $conexion=mysqli_connect("localhost","root","","datos_usuario") ) { 
                #Establecemos el charset para evitar errores 
                mysqli_set_charset($conexion, "utf8");
                $consulta="SELECT * FROM datos WHERE email='$usuario' and contraseña='$contraseña'";
                if ( $resultado=mysqli_query($conexion, $consulta) ) { 
                    $filas=mysqli_num_rows($resultado);
                    mysqli_free_result($resultado);
                    mysqli_close($conexion);
                    if ( $filas > 0 ) {
                        header("location:index.html");
                    }else{
                          echo "error en la autentificación";
                    }

                } else { 
                    echo "Error en la consulta: ". mysqli_error($conexion); 
                }

        } else { 
            echo "Conexión inválida";
        }
    } else {
        echo "No se postearon los datos"; 
    } 
?>

Debes indicar siempre un charset adecuado en tu documento, que suele ser UTF-8.

Puedes hacerlo en la cabecera HTML del documento.

HTML

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

O puedes hacerlo desde PHP, al inicio del script:

PHP

mb_internal_encoding("UTF-8");

O bien:

ini_set("default_charset", "UTF-8");

Para más detalles sobre esto, puedes consultar la respuesta a la pregunta: ¿Por que el Carácter inspector (�) aparece en algunos datos obtenidos de la Base de Datos?


Nota sobre la seguridad

Tu forma de pasar la consulta es insegura, podrías ser víctimas de ataques de Inyección SQL, un grave riesgo que afecta no solamente a la base de datos, sino que podría causar daños en el sistema. Cuando sea posible lee sobre el tema y blinda el código usando consultas preparadas.

A. Cedano
  • 86,578
  • 19
  • 122
  • 221
  • ohhh gracias por el dato pero me puedes explicar que significa esta parte del código ($usuario=!empty ($_POST['email']) ? $_POST['email'] : NULL;) y es normal que al copiar el código que escribiste me aparezca un error? – DANI GIRALDO Nov 03 '19 at 17:31
  • @DANIGIRALDO ese es un ternario. Lo que hace es verificar si hay un dato para `email` en el POST. Si lo hay, asigna el valor a la variable `$usuario`, si no lo hay asigna `NULL`. Luego, más adelante, se verifica si las dos variables tienen datos: `if ( $usuario && $contraseña ) {` para seguir con el código o imprimir un mensaje de error. O sea, en este tipo de código debes controlar también si los datos del POST están vacíos o no. En tu código hay 4 controles que no se están haciendo. No puedes programar pensando que todo saldrá bien siempre. Tienes que pensar en lo que puede salir mal. – A. Cedano Nov 03 '19 at 17:35
  • ohhh okey, al ejecutar tu codigo me aparece este error (Error en la consulta: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '�a='123'' at line 1) – DANI GIRALDO Nov 03 '19 at 17:38
  • ¿Ves cómo el código ya habla? Otra cosa que olvidé sugerirte precisamente es que evites el uso de `ñ`, acentos y caracteres especiales para nombrar tus variables, tablas y columnas en la base de datos. Aquí hay un problema con la `ñ`, la está cambiando por `�` y está rompiendo el código. Ahora te sugiero algo para setear la codificación, pero deberías, si puedes cambiar ese nombre de columna en la tabla. Puedes implementar sin problemas una convención de nombres en inglés, poniendo `password` en vez de `contraseña`. Ahora edito la respuesta. – A. Cedano Nov 03 '19 at 17:40
  • lo he acabado de cambiar por clave y me acabo de loguear pero me aparece el el mensaje "No se postearon los datos" y lo intento con una clave diferente y me aparece lo mismo – DANI GIRALDO Nov 03 '19 at 17:48
  • @DANIGIRALDO revisa la edición de la respuesta. Si pones `clave`, debes ponerlo en todo: formulario, variabes, columna de la base de datos. Revisa el código y donde quiera que ponga `contraseña` debes poner `clave`, asumiendo que también en la tabla cambiaste el nombre de la columna. – A. Cedano Nov 03 '19 at 17:50
  • eso he echo y me aparece lo mismo – DANI GIRALDO Nov 03 '19 at 17:54
  • ok ok ok ya lo he corregido, era una letra que tenia mal escrita, uff amigo muchas gracias me has ayudado demasiado – DANI GIRALDO Nov 03 '19 at 17:56
  • @DANIGIRALDO si aparece eso es porque en el formulario que mandas por POST no le pusiste el `name="clave"` y por eso no está recibiendo nada asociado a `clave` – A. Cedano Nov 03 '19 at 17:56