2

Cuando inicia el login no me arroja los datos que quiero mostrar en este caso el account_id ¿Cómo lo puedo solucionar?

$account_email = $_POST['account_email'];
$account_password = $_POST['account_password'];

$account = 0;

$login_get = "SELECT COUNT(*) FROM $users WHERE account_email = ? AND account_password = ?";

$login_result = mysqli_prepare($base, $login_get);
    
mysqli_stmt_bind_param($login_result, "ss", $account_email, $account_password);

mysqli_stmt_execute($login_result);
   
mysqli_stmt_bind_result($login_result, $account);
   
mysqli_stmt_fetch($login_result);
    
if ($account > 0) {
    
    while (mysqli_stmt_fetch($list)) {
        
        echo $account_id;
        
    }
    
    mysqli_stmt_close($login_result);
    
}
Nuevo Usuario
  • 423
  • 4
  • 17

1 Answers1

2

En mi respuesta a otra pregunta tuya: Cómo compruebo si la cuenta existe en la base de datos te indicaba que la mejor forma de saber si un registro existe es contando.

Ahora bien, si lo que te interesa es otra cosa, (para este caso concreto obtener la columna account_id) tendrías que seleccionar esa columna en específico.

Te propongo esta solución, mejorando un poco el código y corrigiendo otros errores que indicaré al final:

#Evitaremos variables demasiado largas
$email = !empty($_POST['account_email']) ? $_POST['account_email'] : NULL;
$password = !empty($_POST['account_password']) ? $_POST['account_password'] : NULL;

$account = 0;
if ($email && $password) {
    $login_get = "SELECT account_id FROM $users WHERE account_email = ? AND account_password = ? LIMIT 1";
    $login_result = mysqli_prepare($base, $login_get); 
    #OJO al cambio de nombre de variables 
    mysqli_stmt_bind_param($login_result, "ss", $email, $password);
    mysqli_stmt_execute($login_result); 
    #Se espera sólo una columna, vinculamos un resultado
    mysqli_stmt_bind_result($account);
    mysqli_stmt_fetch($login_result);  
    mysqli_stmt_close($login_result);    
}
#Usar $account, que será 0 o el resultado de la consulta
var_dump($account); #Only for test

Algunas consideraciones

  1. En la instrucción SQL se está seleccionando la columna que interesa (account_id). Además de eso, he agregado intuitivamente LIMIT 1, dando por supuesto que esta consulta lo que busca es obtener una sola fila. Si me equivoco en esa intuición me lo dices y modifico la respuesta. Todo esto lo que busca es optimizar el código.
  2. En relación con lo dicho en 1, aquí no usaremos un while para leer los resultados, porque se intuye que se espera una sola fila y en esos casos no hace falta while. Es importante que comprendas que lo que hace mysqli_stmt_fetch es mover el puntero de resultados y que hay dos formas de hacer esto: Si se espera más de una fila, lo aplicas por medio de while; si se espera una sola fila, lo aplicas directamente. Tu código está mal implementado en este sentido, proque usas mysqli_stmt_fetch con y sin while. En ese caso, si hubieran varias filas, la parte del while empezaría a leerte de la segunda fila en adelante, porque el primer mysqli_stmt_fetch ya movió el puntero una vez(1).
  3. No tiene sentido vincular la variable $login_result a un resultado con mysqli_stmt_bind_result. El propósito de ese método es vincular a variables cada columna que te arroje la consulta SQL. Por ejemplo, esta consulta espera una columna que sería account_id y la estaríamos vinculando a la variable $account. Si se esperasen más columnas, debes vincularlas a variables destinadas para ello. Tu variable $login_result representa la consulta preparada, no puedes usarla también para vincular el resultado de una de las columnas. Sugiero que leas la documentación para evitar este tipo de errores que revelan desconocimiento sobre cómo funcionan las consultas preparadas en mysqli.

Si hay algo que no queda claro, pregunta en comentarios, debajo de esta respuesta.


Notas:

(1). Para más detalles sobre esto puedes consultar aquí y también aquí.

A. Cedano
  • 86,578
  • 19
  • 122
  • 221
  • A pesar del ejemplo no logro mostrar la id, es decir si el correo y la contraseña son correctas mostrar la id a traves de un echo, obviamente son muchos datos que necesito mostrar pero este es un ejemplo, lo sé hacer de la forma 'normal' pero con consultas preparadas me cuesta entender y lograrlo. ¿Exactamente a que debería de hacerle echo a esa consulta preparada para poder mostrar los datos? – Nuevo Usuario Sep 22 '21 at 18:14
  • @NuevoUsuario en la pregunta puse esto para prueba: `var_dump($account);`, ¿qué es lo que estás obteniendo actualmente? Aclara también a qué te refieres con *muchos datos*. Si esta consulta pudiera recibir varias filas entonces sí hay que incorporar la lectura con el `while`. – A. Cedano Sep 22 '21 at 19:32
  • Cuando el email y password son válidos entonces quisiera obtener la id de esa cuenta, y demás datos de esa cuenta. Pero $account sólo muestra número y necesito es el texto también de los demás datos que vaya a obtener – Nuevo Usuario Sep 22 '21 at 21:49