Formulario de cambio de contraseña, si no hay resultados

Por alguna razón no puedo envolver mi cabeza alrededor de esto.

$result = mysql_query("SELECT `strPassword` FROM cf_user WHERE `strUserId`='$username'");

    if(!$result){
        echo "The username entered does not exist!";
    }
    else {

        if($newpassword == $confirmnewpassword){
        $sql = mysql_query("UPDATE cf_user SET `strPassword` = '$newpassword' WHERE `strUserId` = '$username'");        
        }

        if(!$sql){
        echo "Congratulations, password successfully changed!";
        }
        else{
        echo "New password and confirm password must be the same!";
        }
    }

Cada vez que aparece "El nombre de usuario ingresado no existe", incluso si especifico el nombre de usuario. ¡Estoy seguro! $resultados significa que no es igual? También probé un if (mysql_num_rows($result)==0), mysql_num_rows no existe.

Probé el comando sql manualmente sin las variables y obtengo un resultado. He hecho eco de los resultados del formulario y son los esperados.

Gracias por la ayuda.

preguntado el 03 de mayo de 12 a las 18:05

Esto: mysql_query("SELECCIONAR strPassword DESDE cf_user DONDE strUserId='$username'"); es una forma realmente muy mala de hacer algo con respecto a un flujo de trabajo de inicio de sesión. Aún más, es una forma incorrecta de hacer cualquier cosa con una contraseña. Mejor que encontrar una respuesta para esta pregunta, debe re- piense en el flujo de trabajo nuevamente. Nunca debe obtener la contraseña, la contraseña es solo para la base de datos y debe permanecer allí. Puede consultar sobre la identificación o devolver algo, pero nunca la contraseña. Nunca debe actualizar la contraseña a través de una actualización sin validar, o un SP, o algo como MD5 o cualquier método hash.

4 Respuestas

Dependiendo de la versión de php de su servidor, es posible que las variables en la consulta no se inserten correctamente.

Tienes:

    $result = mysql_query("SELECT `strPassword` FROM cf_user WHERE `strUserId`='$username'");

Intente usar operadores de concatenación de php (el punto), podría ayudar (sin ser condescendiente, solo intente esto, podría ser el problema).

    $result = mysql_query("SELECT `strPassword` FROM cf_user WHERE `strUserId`='".$username."' ");

Por supuesto, esto fue en respuesta a la parte sobre usted diciendo que funciona si se eliminan las variables. Así que supongo que hay un error en su consulta sobre el área variable.

Uso premiumsoft NaviCat para probar mis consultas y asegurarme de que funcionan, mucho más fáciles de solucionar. Puede ver si su consulta está escrita correctamente guardando la consulta en una variable y haciéndola eco, de esa manera verá si se está canalizando correctamente.

es decir.

$query = "SELECT `strPassword` FROM cf_user WHERE `strUserId`='".$username."' ";

// echoes to browser to see final sql statement.  Don't use in production environment, and make SURE to delete then going live!!!  It will expose you database names and field names to whoever runs the function...
echo $query;

$result = mysql_query($query);

contestado el 04 de mayo de 12 a las 01:05

Necesitas hacer algo como:

$result = mysql_query("SELECT user_id FROM cf_user WHERE `strUserId`='$username' AND strPassword='".md5($password)."' LIMIT 0,1");

if(mysql_num_rows($result)==0){
    echo "The username entered does not exist!";
}
....

$result no es el resultado real, es un enlace de recursos al conjunto de resultados.

Desde el manual de PHP:

Para SELECT, SHOW, DESCRIBE, EXPLAIN y otras declaraciones que devuelven un conjunto de resultados, mysql_query () devuelve un recurso en caso de éxito o FALSE en caso de error.

Para otro tipo de declaraciones SQL, INSERT, UPDATE, DELETE, DROP, etc., mysql_query () devuelve TRUE en caso de éxito o FALSE en caso de error.

El recurso de resultado devuelto debe pasarse a mysql_fetch_array () y otras funciones para tratar con tablas de resultados, para acceder a los datos devueltos.

Utilice mysql_num_rows () para averiguar cuántas filas se devolvieron para una declaración SELECT o mysql_affected_rows () para averiguar cuántas filas se vieron afectadas por una declaración DELETE, INSERT, REPLACE o UPDATE.

mysql_query () también fallará y devolverá FALSE si el usuario no tiene permiso para acceder a las tablas a las que hace referencia la consulta.

contestado el 03 de mayo de 12 a las 19:05

Lo primero es lo primero: el fragmento no está codificado muy bien.

Para empezar mysql_query cuando se usa para SELECT devuelve un falso solo para un error. Si hay un resultado vacío, se ejecutará con éxito.

Cuando se usa con un UPDATE vuelve true en éxito y falso en error. El código parece estar cometiendo un error. Porque cuando devuelve un falso, está diciendo que ha cambiado con éxito la contraseña, lo cual no es el caso.

Lo que hay que hacer es:

$result = mysql_query("SELECT `strPassword` FROM cf_user WHERE `strUserId`='$username'");

if ($result !== FALSE) { //not an error
    if (mysql_num_rows($result) > 0) { //some rows have been returned
        if ($newPassword == $confirmPassword) {
            $query = mysql_query("UPDATE STATEMENT HERE");
            if ($query === TRUE) {
                die('Password changed');
            } else {
                die(mysql_error());
            }
        } else {
            die('Passwords don't match);
        }
    } else { //no rows returned
        die('Username not found');
    }
} else { //error
    die(mysql_error());
}

Tenga en cuenta que el código anterior es solo una muestra y NO recomendaría usarlo en un entorno PROD. No hay escape de entrada.

contestado el 03 de mayo de 12 a las 18:05

intente var_dump($result) para ver el resultado real si es la contraseña o no

contestado el 03 de mayo de 12 a las 18:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.