When trying to insert data into the DB I get an error [HY093]

0

The fact is that I am trying to insert users through PDO and CRUD and this is generating an error which I can not solve.

The error is exactly this

  

SQLSTATE [HY093]: Invalid parameter number: parameter was not defined

File containing the form alta_usuarios.php:

<form action="administrar_usuario.php" method="POST">
<input type="text" name="nombre" placeholder="Nombre">
<input type="text" name="apellido" placeholder="Apellido">
<input type="text" name="dni" placeholder="DNI">
<input type="text" name="usuario" placeholder="Usuario">
<input type="password" name="contrasena" placeholder="Contraseña">
<input type="email" name="email" placeholder="Correo">
<input type="text" name="direccion" placeholder="Direccion">
<input type="text" name="cod_postal" placeholder="Codigo Postal">
<input type="tel" name="tel" placeholder="Teléfono">
<input type="text" name="fecha_nac" placeholder="Fecha nacimiento">
<input type="text" name="foto" placeholder="foto">
<input type="text" name="curso" placeholder="curso">
<input type='hidden' name='insertar' value='insertar'>
<!--Con esto ejecutamos la funcion de insertar-->

<select name="tipo">
    <option value="1">Admin</option>
    <option value="2">Administración</option>
    <option value="3">Alumno</option>
    <option value="4">Profesor</option>
</select>
<input type="submit" name="altaUsuario" value="Crear">

Driver admin_user.php:

    <?php 
include_once('crud_usuario.php');
include_once('class_usuarios.php');

$crud = new CrudUsuario();
$usuario = new Usuario();

if (isset($_POST['insertar'])) {
    $usuario->setIdUsuario(NULL);
    $usuario->setDni($_POST['dni']);
    $usuario->setNombre($_POST['nombre']);
    $usuario->setApellido($_POST['apellido']);
    $usuario->setContrasena($_POST['contrasena']);
    $usuario->setEmail($_POST['email']);
    $usuario->setUsuario($_POST['usuario']);
    $usuario->setDireccion($_POST['direccion']);
    $usuario->setCodPostal($_POST['cod_postal']);
    $usuario->setTel($_POST['tel']);
    $usuario->setFechaNac($_POST['fecha_nac']);
    $usuario->setFoto($_POST['foto']);
    $usuario->setCurso($_POST['curso']);
    $usuario->setTipo($_POST['tipo']);
    $crud->insertar($usuario);
}

?>

File containing the crud, crud_usuario.php:

    <?php 
require_once('conexion.php');

class CrudUsuario{
    //constructor de la clase
    public function __contruct(){}

    public function insertar($usuario){
            $db=BaseDatos::conectar();

            try {
                $insert=$db->prepare('INSERT INTO Usuarios values(NULL,:dni,:nombre,:apellido,:contrasena,:email,:usuario,:direccion,:cod_postal,:telefono,:fecha_nac,:foto,:curso,:estado,:tipo)');
                $insert->bindValue('id_usuario',$usuario->getIdUsuario());
                $insert->bindValue('nombre',$usuario->getNombre());
                $insert->bindValue('apellido',$usuario->getApellido());
                $insert->bindValue('contrasena',$usuario->getContrasena());
                $insert->bindValue('email',$usuario->getEmail());
                $insert->bindValue('usuario',$usuario->getUsuario());
                $insert->bindValue('direccion',$usuario->getDireccion());
                $insert->bindValue('cod_postal',$usuario->getCodPostal());
                $insert->bindValue('telefono',$usuario->getTel());
                $insert->bindValue('fecha_nac',$usuario->getFechaNac());
                $insert->bindValue('foto',$usuario->getFoto());
                $insert->bindValue('curso',$usuario->getCurso());
                $insert->bindValue('estado',$usuario->getEstado());
                $insert->bindValue('tipo',$usuario->getTipo());
                $insert->execute(); 
            }   
            catch (PDOException $e) {
                print $e->getMessage ();
            }

    }


}

?>
    
asked by sergibarca 22.03.2018 в 12:40
source

1 answer

2

You have two errors in the code, one when preparing the SQL query between the data you are receiving, the one you enter in the SQL query and the one you assign with bindValue and the other when assigning the variables, you are forgetting the two points (put :dni instead of dni in calls to bindValue ).

You are setting id_usuario instead of dni in $insert->bindValue('id_usuario',$usuario->getIdUsuario()); . When doing it wrong you are causing the error that you get, that the id_usuario parameter is not defined in the prepared query.

I imagine that, for the data that you give input and the SQL, what you want is to associate the value dni and obtain it through $usuario->getDni() .

Test:

try {
    $insert=$db->prepare('
      INSERT INTO Usuarios
      VALUES (
        NULL,
        :dni,
        :nombre,
        :apellido,
        :contrasena,
        :email,
        :usuario,
        :direccion,
        :cod_postal,
        :telefono,
        :fecha_nac,
        :foto,
        :curso,
        :estado,
        :tipo
      )
    ');
    $insert->bindValue(':dni', $usuario->getDni());
    $insert->bindValue(':nombre', $usuario->getNombre());
    $insert->bindValue(':apellido', $usuario->getApellido());
    $insert->bindValue(':contrasena', $usuario->getContrasena());
    $insert->bindValue(':email', $usuario->getEmail());
    $insert->bindValue(':usuario', $usuario->getUsuario());
    $insert->bindValue(':direccion', $usuario->getDireccion());
    $insert->bindValue(':cod_postal', $usuario->getCodPostal());
    $insert->bindValue(':telefono', $usuario->getTel());
    $insert->bindValue(':fecha_nac', $usuario->getFechaNac());
    $insert->bindValue(':foto', $usuario->getFoto());
    $insert->bindValue(':curso', $usuario->getCurso());
    $insert->bindValue(':estado', $usuario->getEstado());
    $insert->bindValue(':tipo', $usuario->getTipo());
    $insert->execute(); 
} catch (PDOException $e) {
    print $e->getMessage();
}

Or, I would prefer:

try {
    $insert=$db->prepare('
      INSERT INTO Usuarios
      VALUES (
        :id_usuario,
        :dni,
        :nombre,
        :apellido,
        :contrasena,
        :email,
        :usuario,
        :direccion,
        :cod_postal,
        :telefono,
        :fecha_nac,
        :foto,
        :curso,
        :estado,
        :tipo
      )
    ');
    $insert->bindValue(':id_usuario', $usuario->getIdUsuario());
    $insert->bindValue(':dni', $usuario->getDni());
    $insert->bindValue(':nombre', $usuario->getNombre());
    $insert->bindValue(':apellido', $usuario->getApellido());
    $insert->bindValue(':contrasena', $usuario->getContrasena());
    $insert->bindValue(':email', $usuario->getEmail());
    $insert->bindValue(':usuario', $usuario->getUsuario());
    $insert->bindValue(':direccion', $usuario->getDireccion());
    $insert->bindValue(':cod_postal', $usuario->getCodPostal());
    $insert->bindValue(':telefono', $usuario->getTel());
    $insert->bindValue(':fecha_nac', $usuario->getFechaNac());
    $insert->bindValue(':foto', $usuario->getFoto());
    $insert->bindValue(':curso', $usuario->getCurso());
    $insert->bindValue(':estado', $usuario->getEstado());
    $insert->bindValue(':tipo', $usuario->getTipo());
    $insert->execute(); 
} catch (PDOException $e) {
    print $e->getMessage();
}
    
answered by 22.03.2018 / 13:05
source