funcion no inserta datos en la db

Iniciado por gAb1, 22 Septiembre 2014, 00:53 AM

0 Miembros y 1 Visitante están viendo este tema.

gAb1

Hola, estoy intentando añadir datos a un registro de usuarios, pero no funciona...

functions.php
Código (php) [Seleccionar]
//ip function
function get_ip_address() {
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
}

Código (php) [Seleccionar]
//time function
function get_current_time() {
$time = date('d/m/Y H:i:s', time());
}

Código (php) [Seleccionar]
//record attempt or failed login
$now = time();
$login_time = get_current_time();
$access_address = get_ip_address();

$mysqli->query("INSERT INTO login_attempts(user_id, used_password, time, login_time, access_address)
VALUES ('$user_id', '$used_password', '$now', '$login_time', '$access_address')");


Si antes de que se encripte la contraseña creo una variable que contenga $password tal y como viene en texto plano, podre usar esa variable despues para guardarla en la db y seguira conteniendo $password sin cifrar?

Eso es lo que quiero hacer para guardar cada login fallido, pero no funciona si incluyo el $login_time y el $access_address, si los quito si que inserta.

register.inc.php
Código (php) [Seleccionar]
// Insert the new user into the database
$reg_time = get_current_time();
$reg_ip = get_ip_address();
if ($insert_stmt = $mysqli->prepare("INSERT INTO members (username, email, password, salt, reg_time, reg_ip) VALUES (?, ?, ?, ?, ?, ?)")) {
$insert_stmt->bind_param('ssssss', $username, $email, $password, $random_salt, $reg_time, $reg_ip);
// Execute the prepared query.
if (! $insert_stmt->execute()) {
header('Location: ../error.php?err=Registration failure: Contacte al administrador.');
}
}


Eso tampoco funciona y es lo que quiero que se guarde en la db al crear el usuario. Y pasa lo mismo que antes, si quito $reg_time y $reg_ip si que funciona... ¿hay algo mal con esas dos variables o funciones?

He comprobado todo lo que se, la base de datos esta bien, todas las columnas existen, pero no inserta nada en la db... ni aparece ningun error. Cuando creo una cuenta me redirecciona a la pagina "Cuenta creada" como si todo hubiera salido bien, pero en la tabla members no hay nada creado...

Es posible que este mal la llamada a esas dos funciones y por eso no inserta nada, pero antes de crear esas dos funciones lo probe poniendo directamente el codigo y tampoco funcionaba. Es algo extraño la verdad.

Gracias.

MinusFour

¿Has revisado por los errores que pudiera tener tu SQL?

Código (php) [Seleccionar]

echo $mysql->error;

gAb1

#2
mysql o mysqli?? no me da ningun error cuando se ejecutan las sentencias...

MinusFour

Cita de: gAb1 en 22 Septiembre 2014, 04:09 AM
mysql o mysqli??

Depende del nombre del objeto mysqli de tu conexion.

gAb1

Si, es mysqli, pero no muestra ningun error. Y el log de mysql no muestra nada desde hace 2 dias que se encendio el servidor...

No será problema de:

Código (php) [Seleccionar]
$login_time = get_current_time();
$access_address = get_ip_address();


¿esas variables obtienen el valor de las variables que hay en esas funciones?

MinusFour

Cita de: gAb1 en 22 Septiembre 2014, 04:50 AM
Si, es mysqli, pero no muestra ningun error. Y el log de mysql no muestra nada desde hace 2 dias que se encendio el servidor...

No será problema de:

Código (php) [Seleccionar]
$login_time = get_current_time();
$access_address = get_ip_address();


¿esas variables obtienen el valor de las variables que hay en esas funciones?


Estás poniendo el $mysqli->error después de $mysqli->query() y $mysqli->execute() ?

Puedes hacerle un echo a tus variables $login_time y $access_address para asegurarte que están correctas.

gAb1

#6
Si, despues de varios if, ¿pero donde se mostraria ese echo? ¿en que pagina?

Esta es la función entera:
Código (php) [Seleccionar]
function login($email, $password, $mysqli) {
// Store password for the attempt record
$used_password = $password;

   // Using prepared statements means that SQL injection is not possible.
   if ($stmt = $mysqli->prepare("SELECT id, username, password, salt
       FROM members
WHERE email = ?
       LIMIT 1")) {
       $stmt->bind_param('s', $email);  // Bind "$email" to parameter.
       $stmt->execute();    // Execute the prepared query.
       $stmt->store_result();

       // get variables from result.
       $stmt->bind_result($user_id, $username, $db_password, $salt);
       $stmt->fetch();

       // hash the password with the unique salt.
       $password = hash('sha512', $password . $salt);
       if ($stmt->num_rows == 1) {
           // If the user exists we check if the account is locked
           // from too many login attempts

           if (checkbrute($user_id, $mysqli) == true) {
               // Account is locked
               // Send an email to user saying their account is locked
               return false;
           } else {
               // Check if the password in the database matches
               // the password the user submitted.
               if ($db_password == $password) {
                   // Password is correct!
                   // Get the user-agent string of the user.
                   $user_browser = $_SERVER['HTTP_USER_AGENT'];
                   // XSS protection as we might print this value
                   $user_id = preg_replace("/[^0-9]+/", "", $user_id);
                   $_SESSION['user_id'] = $user_id;
                   // XSS protection as we might print this value
                   $username = preg_replace("/[^a-zA-Z0-9_\-]+/",
                                                               "",
                                                               $username);
                   $_SESSION['username'] = $username;
                   $_SESSION['login_string'] = hash('sha512',
                             $password . $user_browser);
                   // Login successful.
$ip = get_ip_address();
if ($mysqli->query("INSERT INTO members(last_ip)
                                   VALUES ('$ip')"));
                   return true;
               } else {
                   // Password is not correct
                   // We record this attempt in the database
$now = time();
$time = get_current_time();
$ip = get_ip_address();
                   if ($mysqli->query("INSERT INTO login_attempts(user_id, password_used, time, login_time, access_address)
                                   VALUES ('$user_id', '$used_password', '$now', '$time', '$ip')"));
                   return false;
               }
           }
       } else {
           // No user exists.
           return false;
       }
    echo $mysqli->error;
   }
}

MinusFour

Los echos se deberían mostrar al ejecutarse el script.

gAb1

#8
Si hay algun error, yo no veo nada, en la pagina login.php me logueo pero no me da ningun error, ni aparece nada... Las sentencias siguen sin ejecutarse en la base de datos...

Desde otra pagina compruebo las variables:

Código (html5) [Seleccionar]
<p>The time is: <?php get_current_time() ?></p>
<p>My IP Address: <?php get_ip_address() ?></p>


Y funciona solo si pongo echo en las funciones:

Código (php) [Seleccionar]
function get_ip_address() {
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
echo $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
echo $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
echo $ip = $_SERVER['REMOTE_ADDR'];
}
}

function get_current_time() {
echo $time = date('d/m/Y H:i:s', time());
}


Edito: al parecer el usuario se crea, pero no guarda en la db estas dos ultimas variables. Lo he probado dejando echo en las funciones y sin echo, solo se guarda el nombre email y contraseña, ni la hora ni la ip...

Edito2: Solucionado era problema de las funciones y del length de la columna.

Sobre las funciones, esta es la solucion:
Código (php) [Seleccionar]
function get_current_time() {
return date('d/m/Y H:i:s', time());
}