Foros del Web » Programando para Internet » PHP »

Preparar declaracion

Estas en el tema de Preparar declaracion en el foro de PHP en Foros del Web. Hola gente de foros del web. He estado dando muchas vueltas a el codigo pero no hallo una respuesta. Veran es un Login con funciones ...
  #1 (permalink)  
Antiguo 05/05/2016, 14:26
Skorge
Invitado
 
Mensajes: n/a
Puntos:
Preparar declaracion

Hola gente de foros del web.

He estado dando muchas vueltas a el codigo pero no hallo una respuesta. Veran es un Login con funciones preparadas, he trabajado poco o nada con estas entonces no me va muy bien, he ojeado el manual y se como representarlas pero ahora me sale un error que es un poco extraño Database error: cannot prepare statement = Error base de datos : no se puede preparar la declaración, pero en parte no hay sentido alguien podria explicarme que pasa por favor.
  #2 (permalink)  
Antiguo 05/05/2016, 15:10
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: Preparar declaracion

Mejor muestra el código que te da el error, a si sin más es difícil que alguien te pueda ayudar.
__________________
Unset($vida['malRollo']);
  #3 (permalink)  
Antiguo 05/05/2016, 15:26
Skorge
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Preparar declaracion

Hola, Hombre gracias por responder, el codigo es este.

Código PHP:
Ver original
  1. function login($username, $password, $mysqli) {
  2.     // Using prepared statements means that SQL injection is not possible.
  3.     if ($stmt = $mysqli->prepare("SELECT id,
  4.                                          Nombre,
  5.                                          Apellidos,
  6.                                          password,
  7.                                          salt,
  8.                                          cargo,
  9.                                          departamento
  10.                                   FROM   usuario
  11.                                  WHERE  username = ? LIMIT 1")) {
  12.         $stmt->bind_param('s', $username);  // Bind "$usernamel" to parameter.
  13.         $stmt->execute();    // Execute the prepared query.
  14.         $stmt->store_result();
  15.  
  16.         // get variables from result.
  17.         $stmt->bind_result($username, $db_password, $salt);
  18.         $stmt->fetch();
  19.  
  20.         // hash the password with the unique salt.
  21.         $password = hash('sha512', $password . $salt);
  22.         if ($stmt->num_rows == 1) {
  23.             // If the user exists we check if the account is locked
  24.             // from too many login attempts
  25.             if (checkbrute($username, $mysqli) == true) {
  26.  
  27.                 return false;
  28.             } else {
  29.                 // Check if the password in the database matches
  30.                 // the password the user submitted.
  31.                 if ($db_password == $password) {
  32.                     // Password is correct!
  33.                     // Get the user-agent string of the user.
  34.                     $user_browser = $_SERVER['HTTP_USER_AGENT'];
  35.  
  36.                     // XSS protection as we might print this value
  37.                     $username = preg_replace("/[^0-9]+/", "", $username);
  38.                     $_SESSION['username'] = $username;
  39.  
  40.                     // XSS protection as we might print this value
  41.                     $username = preg_replace("/[^a-zA-Z0-9_\-]+/", "", $username);
  42.  
  43.                     $_SESSION['username'] = $username;
  44.                     $_SESSION['login_string'] = hash('sha512', $password . $user_browser);
  45.  
  46.                     // Login successful.
  47.                     return true;
  48.                 } else {
  49.                     // Password is not correct
  50.                     // We record this attempt in the database
  51.                     $now = time();
  52.                     if (!$mysqli->query("INSERT INTO inyeccion(username, time)
  53.                                    VALUES ('$username', '$now')")) {
  54.                         header("Location: ../error.php?err=Database error: inyeccion");
  55.                         exit();
  56.                     }
  57.                     return false;
  58.                 }
  59.             }
  60.         } else {
  61.             // No user exists.
  62.             return false;
  63.         }
  64.     } else {
  65.         // Could not create a prepared statement
  66.         header("Location: ../error.php?err=Database error: cannot prepare statement");
  67.         exit();
  68.     }
  69. }
  70. function checkbrute($username, $mysqli){
  71.     // Obtenemos el timestamp
  72.     $now = time();
  73.     $valid_attempts = $now - (82 * 60 * 60);
  74.     if($stmt = $mysqli->prepare("SELECT password FROM inyeccion WHERE username = ?" AND time > '$valid_attempts')){
  75.         $stmt->bind_param('u',$username);
  76.         $stmt->execute;
  77.         $stmt->store_result();
  78.        
  79.         if ($stmt->num_rows> 5){
  80.             return true;
  81.         } else {
  82.         return false;
  83.     }
  84. } else {
  85.         [B]header("Location: ../error.php?err=Database error: cannot prepare statement");
  86.         exit();[/B]
  87.      }
  88. }

Este codigo me ha dado muchos problemas, :v pero ya he ejecutado la consulta del query y sale bien ya la descarte, mire las variables y tambien, solo se quedo hay estancado. Gracias por responder nuevamente!
  #4 (permalink)  
Antiguo 05/05/2016, 15:53
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: Preparar declaracion

Código PHP:
Ver original
  1. // aquí tienes un error de sintaxis en el if
  2. if($stmt = $mysqli->prepare("SELECT password FROM inyeccion WHERE username = ?" AND time > '$valid_attempts')){....}
  3.  
  4.  
  5. // a ver así
  6. if( ($stmt = $mysqli->prepare("SELECT password FROM inyeccion WHERE username = ? ") )  AND time > $valid_attempts){....}

Edit:
Error mio , me corrijo, ahora si.
__________________
Unset($vida['malRollo']);

Última edición por xerifandtomas; 05/05/2016 a las 16:04
  #5 (permalink)  
Antiguo 06/05/2016, 07:51
Skorge
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Preparar declaracion

Hola y no amigo aun sigue sin funcionar, mismo error y gracias por ver ese error no me habia percado.

Sabes y he depurado los parametros pero no aparece error, pero el error que me aparece en la ejecucion dice que es de parametros

Código PHP:
Ver original
  1. if (!$stmt->bind_param('s', $username)){
  2.         echo "Falló la vinculación de parámetros: (" . $stmt->errno . ") " . $stmt->error;}// Bind "$email" to parameter.
  3.         if ($stmt->execute()) {
  4.         echo "Fallo la ejecucion: (" .$sentencia->errno. ")" .stmt->error;}    // Execute the prepared query.
  5.         $stmt->store_result();

Última edición por Skorge; 06/05/2016 a las 08:31 Razón: Agrego informacion
  #6 (permalink)  
Antiguo 06/05/2016, 08:55
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: Preparar declaracion

Puedes mostrar el error en concreto y línea en su contexto?

Por cierto a time le faltan también los paréntesis que no me di cuenta

Código PHP:
Ver original
  1. if( ($stmt = $mysqli->prepare("SELECT password FROM inyeccion WHERE username = ? ") )  AND time() > $valid_attempts){....}

Aun que esa validación después del AND me parece un poco inútil, por que si expandes las variables vienes ha hacer algo como esto
Código PHP:
Ver original
  1. if( time()-(82*60*60) > time() )// Esto siempre se va a cumplir y no entiendo que sentido tiene
  2. // ya que $valid_attempts lo defines justo antes del if con
  3. $now = time();
  4. $valid_attempts = $now - (82 * 60 * 60);
  5. if( ($stmt = $mysqli->prepare("SELECT password FROM inyeccion WHERE username = ? ") )  AND time() > $valid_attempts){....}
__________________
Unset($vida['malRollo']);

Última edición por xerifandtomas; 06/05/2016 a las 09:12
  #7 (permalink)  
Antiguo 06/05/2016, 09:32
Skorge
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Preparar declaracion

Hola. Gracias por tu ayuda!

Hombre en realidad el error no sale como un error de ejecucion, no sale ni nada asi por el estilo sale es una pantalla con el siguiente mensaje, Database error: cannot prepare statement.

Este codigo da lata y mucha, con respecto a las variables inutiles tienes razon, con ese comentario, no se en que estaba pensando. Voy a lanzar unas cuantas lineas haber que tal, aunque son un poco aleatorias.

Oye pero tambien mira que defino los parametros para que me muestren el error real y no sale nada :/, solo la pantalla con el mensaje que te deje

Edito: Al fin logre sacar un el msm de error mira
Código PHP:
Ver original
  1. Fatal error: Uncaught Error: Call to a member function bind_param() on boolean in C:\xamp\htdocs\Seg\Seg\includes\Loguear_el_logueo.php:29 Stack trace: #0 C:\xamp\htdocs\Seg\Seg\includes\login.php(10): login('Groyert', 'e9e97ceb185bf0b...', Object(mysqli)) #1 {main} thrown in C:\xamp\htdocs\Seg\Seg\includes\Loguear_el_logueo.php on line 29

Última edición por Skorge; 06/05/2016 a las 11:14
  #8 (permalink)  
Antiguo 06/05/2016, 11:45
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: Preparar declaracion

Y cual es la línea 29 y su contexto en el archivo Loguear_el_logueo.php?
__________________
Unset($vida['malRollo']);
  #9 (permalink)  
Antiguo 06/05/2016, 12:02
Skorge
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Preparar declaracion

Linea 29
Código PHP:
Ver original
  1. if (!$stmt->bind_param("i", $username)) {
Su contexto toma los valores de aqui,
Código PHP:
Ver original
  1. if(!($stmt = $mysqli->prepare("SELECT id, Nombre, Apellidos, password, cargo, despartamento FROM usuario WHERE username = ? LIMIT 1")))
y su contexto el volver el valor username un parametro.
  #10 (permalink)  
Antiguo 06/05/2016, 15:20
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: Preparar declaracion

A ver así un poco a la aventura por qué el contesto que muestras es bastante limitado.

Aquí le estas diciendo a bind_param que $username es un entero, cosa que dudo bastante, por que no suele ser habitual que un nombre se usuario sea sólo un número entero quizás la opción adecuada es s más que I, pero mira la documentación a ver cual se adapta mejor a ti dato.
Código PHP:
Ver original
  1. if (!$stmt->bind_param("i", $username)) {
__________________
Unset($vida['malRollo']);
  #11 (permalink)  
Antiguo 10/05/2016, 12:03
Skorge
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Preparar declaracion

Hola! Gracias por seguir respondiendo xerifandtomas y por tener paciencia.

Pido excusas por proporcionar la informacion tan limitada, casi no os entiendo y trato de poner lo que "puede ser", no quiero tampoco pasarme un poco de la raya,Vale me pondre al tanto de la documentacion, mientras he visto que el error se repite si lo enlazo con otra BD, entonces si es el codigo. Gracias por seguir respondiendo.

Etiquetas: declaracion
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 07:48.