0

Entiendo que hay preguntas similares ya respondidas pero ninguna de las soluciones que he encontrado resuelve mi problema.

Mi archivo php se ejecuta correctamente(ya que php no me muestra errores en el navegador), validando todos los campos e incluso me muestra la url que indico al final con el mensaje ?register=success al enviar el formulario. Sin embargo, los datos no son insertados en mi base de datos.

<?php

  if (isset($_POST["submit"])){
    echo '<pre>Before Connect' . print_r($_POST, true) . '</pre>'; // display the $_POST array
    include_once "dbh_inc.php";
    $first = mysqli_real_escape_string($conn, $_POST["first"]);
    $last = mysqli_real_escape_string($conn, $_POST["last"]);
    $nickname = mysqli_real_escape_string($conn, $_POST["nickname"]);
    $password = mysqli_real_escape_string($conn, $_POST["password"]);
    $email = mysqli_real_escape_string($conn, $_POST["email"]);

    //Birthdate 
    $birthDay = mysqli_real_escape_string($conn, $_POST["birth-day"]);
    $birthMonth = mysqli_real_escape_string($conn, $_POST["birth-month"]);
    $birthAge = mysqli_real_escape_string($conn, $_POST["birth-age"]);
    $birthDate = $birthDay."-".$birthMonth."-".$birthAge;        

    $speciality = mysqli_real_escape_string($conn, $_POST["speciality"]);
    $gender = mysqli_real_escape_string($conn, $_POST["gender"]);

    //Error handlers
    //Check for empty fields

    if (empty($first) || empty($last) || empty($email) || empty($last) || empty($last) || empty($last)) {
      header("Location: ../register.php?register=empty");
      exit();
    }else{
      //Check if input characters are valid
      if(!preg_match("/^[a-zA-Z]*$/", $first) || !preg_match("/^[a-zA-Z]*$/", $last)){
        header("Location: ../register.php?register=invalid");
        exit();
      }else{
        //Check if email is valid
        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
          header("Location: ../register.php?register=email");
          exit();
        }else{
          //Check if birthdate is valid
          if (!checkdate ($birthMonth , $birthDay, $birthAge)) {
            header("Location: ../register.php?register=date");
            exit();
          }else{
            //Check if user exists
            $sql = "SELECT * FROM users WHERE user_nickname='$nickname'";
            $result = mysqli_query($conn, $sql);
            $resultCheck = mysqli_num_rows($result);
            //Entering to the database to check if username exists
            if ($resultCheck > 0) {
              header("Location: ../register.php?register=usertaked");
              exit();
            }else{
              //Hashing the password
              $hashedPwd = password_hash($password, PASSWORD_DEFAULT);
              //Insert user registration data into the database
              echo "Successful insertion!!!";
              $sql = "INSERT INTO users (user_first, user_last, user_nickname, user_password, user_email, user_birth_date, user_speciality, user_gender) VALUES ('$first', '$last', '$nickname', '$password', '$email', '$birthDate', '$speciality', '$gender')";
              mysqli_query($conn, $sql);
              header("Location: ../register.php?register=success");
              exit();
            }
          }
        }
      }
    }
  }else{
    header("Location: ../register.php");
    exit();
  }

Finalmente, este es el php (bdh_inc.php) en el que hago la conexión a la base de datos:

<?php

$dbServername = "localhost";//because there's running a local server
$dbUsername = "root";
$dbPassword = "";
$dbName = "login_system";

$conn = mysqli_connect($dbServername, $dbUsername, $dbPassword, $dbName) or die ("Conexion fallida");
GhostOrder
  • 117
  • 5
  • El hecho de que te redirija no significa que la consulta funcione. Si quieres saber el resultado exacto del INSERT puedes controlarlo así: `$resultado=mysqli_query($conn, $sql);` Ahora evalúas: `$total= mysqli_num_rows($resultado); if ($total>0) {header("Location: ../register.php?register=success");}else{echo "Hubo un error: ".mysqli_error($conn);}`. Aún tu código es mejorable en varios aspectos, incluyendo la seguridad, ya que tus consultas tienen una seria vulnerabilidad: **a través de ellas [pueden inyectar código malicioso en tu sistema](https://es.stackoverflow.com/q/108520/29967)**. – A. Cedano Dec 22 '17 at 07:35
  • A parte de todo lo comentado por los compañeros, el campo `user_birth_date` lo estas construyendo mal, debería ser `año-mes-dia` que es el formato que mysql utiliza para fechas – Xerif Dec 22 '17 at 12:44
  • @Xerif Es precisamente lo que faltaba, soy realmente nuevo en php y no conocía este detalle. Por lo que veo esto quiere decir que si alguno de los campos en la base de datos recibe un tipo de dato que no corresponde, el resto de los datos no se insertaran tampoco, ¿verdad? Ya que solo al cambiar el orden en la fecha los datos se enviaron correctamente a la base de datos. – GhostOrder Dec 22 '17 at 19:21
  • @A.Cedano Gracias por la información. Actualmente estoy aprendiendo php por mi cuenta, por lo que me preocupo más por que el script funcione, pero definitivamente la seguridad es el siguiente paso obligatorio. Gracias nuevamente. – GhostOrder Dec 22 '17 at 19:38

2 Answers2

0

en el caso que no tengas incluida tu conexion debes incluir tambien tu archivo bdh_inc.php de esta forma:

require_once('bdh_inc.php');
jsstoni
  • 75
  • 9
0

Prueba intentando con un try catch

try {
    //Codigo
} catch (Exception $exc) {
    echo $exc->getMessage();
}

y dentro de el código dale un echo(temporalmente, hasta identificar el problema) al $sql:

$sql = "INSERT INTO users (user_first, user_last, user_nickname, user_password, user_email, user_birth_date, user_speciality, user_gender) VALUES ('$first', '$last', '$nickname', '$password', '$email', '$birthDate', '$speciality', '$gender')";
echo $sql;

y quitale el header (temporalmente, hasta identificar el problema).

(quitar el header para poder leer el echo)

luego copias los datos que te entregará la pagina como:

INSERT INTO users (user_first, user_last, user_nickname, user_password, user_email, user_birth_date, user_speciality, user_gender) VALUES ('Juan', 'Martinez', 'Juan123', 'ilovemexico', 'j.m.mex@correo.mx', '1990-12-22', 'taco', 'Hombre')

y los ejecutas en sql de phpMyAdmin

si te da error: es un problema en la sql

sino: hay algo mal ejecutando la query o antes de llegar a ejecutarla

Pd: El $hashedPwd no esta en el INSERT

Kevin Delva
  • 667
  • 5
  • 16
  • En efecto, try catch me ayudo a encontrar el problema, no conocía este 'metodo', gracias por la respuesta @Kevin Delva – GhostOrder Dec 22 '17 at 19:27