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
- 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.
- 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).
- 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í.