Nueva pregunta

Pregunta:

Fecha: 18-06-2015 12:38:35 (En Español)

Problema con PDO bindParam() no me toma un dato[Resuelta]

Hola a todos

Genero esta pregunta ya que me estoy volviendo loco en encontrar el problema de lo siguiente.

En esta linea en particular:
$stmt->bindParam(':nickName', $usuario, PDO::PARAM_STR);


nickName no toma ningun valor y $usuario si tiene valor.
es en el momento de hacer INSERT.

     if ($stmt->rowCount() == 1){
            return TRUE;
        }else{
            return FALSE;
        }

Y el resultado es FALSE por el nickName

Lo he comprobado con el debugger de NetBeans.

En la tabla esta bien el campo nickName es un varchar(50)

El Codigo completo:

class Usuario extends BusinessObjects{
    private $nickName;
    private $nombreApellido;
    private $email;
    private $password;
    private $fechaMacimineto=NULL;
    private $fechaCreacion="NOW()";
    private $fechaEstado="NOW()";
    private $usuario_estado_id=1; // 1= estado por defecto Validar cuenta
    private $usuario_rol_id=3; // 3= rol por defecto Usuario Final
   
    
    public static function error() {
        throw new Exception('ERROR: Instancia de la clase [Usuario]');
    }


    // Metodos Getters & Setters Principales
    public function getNickName() {
        return $this->nickName;
    }

    public function getNombreApellido() {
        return $this->nombreApellido;
    }

    public function getEmail() {
        return $this->email;
    }

    public function getPassword() {
        return $this->password;
    }

    public function getFechaNacimiento() {
        return $this->fechaMacimineto;
    }

    public function getFechaCreacion() {
        return $this->fechaCreacion;
    }

    public function getFechaEstado() {
        return $this->fechaEstado;
    }

    public function getUsuario_estado_id() {
        return $this->usuario_estado_id; 
    }

    public function getUsuario_rol_id() {
    return $this->usuario_rol_id; 
    }
    // STEER
    public function setNickName($nickName) {
        $this->nickName = $nickName;
    }

    public function setNombreApellido($nombreApellido) {
        $this->nombreApellido = $nombreApellido;
    }

    public function setEmail($email) {
        $this->email = $email;
    }

    public function setPassword($password) {
        $this->password = $password;
    }

    public function setFechaNacimiento($fechaMacimineto) {
        $this->fechaMacimineto = $fechaMacimineto;
    }

    public function setFechaCreacion($fechaCreacion) {
        $this->fechaCreacion = $fechaCreacion;
    }

    public function setFechaEstado($fechaEstado) {
        $this->fechaEstado = $fechaEstado;
    }
    
    public function setUsuario_estado_id($usuario_estado_id) {
    $this->usuario_estado_id = $usuario_estado_id;
    }

    public function setUsuario_rol_id($usuario_rol_id) {
    $this->usuario_rol_id = $usuario_rol_id;
    }
    
     // Metodos Getters & Setters Secundarios
    
    // Inserta nuevo usuario
     private function insert() {
         $usuario_rol_id=       $this->getUsuario_estado_id();
         $usuario=             $this->getNickName();
         $nombreApellido=       $this->getNombreApellido();
         $email=                $this->getEmail();
         $password=             md5($this->getPassword());
         $fechaNacimiento=      $this->getFechaNacimiento();
         $fechaCreacion=        $this->getFechaCreacion();
         $fechaEstado=          $this->getFechaEstado();
         $usuario_estado_id=    $this->getUsuario_estado_id();
         
         // Se hace el INSERT en la DB   
        $conn =  DB::conectar();
$query = <<<QUERYDB
        INSERT INTO usuario 
            (usuario_rol_id, usuario_estado_id, nickName, nombreApellido, email, password, fechaNacimiento, fechaCreacion, fechaEstado) 
         VALUES 
            (:usuario_rol_id, :usuario_estado_id, :nickName, :nombreApellido, :email, :password, :fechaNacimiento, :fechaCreacion, :fechaEstado);
        
QUERYDB;


        $stmt = $conn->prepare($query);
        $stmt->bindParam(':usuario_rol_id', $usuario_rol_id, PDO::PARAM_STR);
        $stmt->bindParam(':usuario_estado_id', $usuario_estado_id, PDO::PARAM_STR);
        $stmt->bindParam(':nickName', $usuario, PDO::PARAM_STR);
        $stmt->bindParam(':nombreApellido', $nombreApellido, PDO::PARAM_STR);
        $stmt->bindParam(':email', $email, PDO::PARAM_STR);
        $stmt->bindParam(':password', $password, PDO::PARAM_STR);
        $stmt->bindParam(':fechaNacimiento', $fechaNacimiento, PDO::PARAM_STR);
        $stmt->bindParam(':fechaCreacion', $fechaCreacion, PDO::PARAM_STR);
        $stmt->bindParam(':fechaEstado', $fechaEstado, PDO::PARAM_STR);
        
        $stmt->execute();

        if ($stmt->rowCount() == 1){
            return TRUE;
        }else{
            return FALSE;
        }
         
     }
     
     private function update() {
         $id=                   $this->getId();
         $usuario_rol_id=       $this->getUsuario_estado_id();
         $nickName=             $this->getNickName();
         $nombreApellido=       $this->getNombreApellido();
         $email=                $this->getEmail();
         $password=             $this->getPassword();
         $fechaNacimiento=      $this->getFechaNacimiento();
         $fechaEstado=          $this->getFechaEstado();
         $usuario_estado_id=    $this->getUsuario_estado_id();
         
         // Se hace el UPDATE en la DB   
        $conn =  DB::conectar();
$query = <<<QUERYDB
        UPDATE usuario 
          SET  :usuario_rol_id, :nickName, :nombreApellido, :email, :password, :fechaNacimiento, :fechaEstado, :usuario_estado_id
          WHERE id=:id
QUERYDB;
        $stmt = $conn->prepare($query);
        $stmt->bindParam(':usuario_rol_id', $usuario_rol_id, PDO::PARAM_STR);
        $stmt->bindParam(':usuario_estado_id', $usuario_estado_id, PDO::PARAM_STR);
        $stmt->bindParam(':nickName', $usuario, PDO::PARAM_STR, PDO::PARAM_STR);
        $stmt->bindParam(':nombreApellido', $nombreApellido, PDO::PARAM_STR);
        $stmt->bindParam(':email', $email, PDO::PARAM_STR);
        $stmt->bindParam(':password', $password, PDO::PARAM_STR);
        $stmt->bindParam(':id', $id, PDO::PARAM_INT);
        $stmt->execute();
        return TRUE;
     }
     
     
     
     public function guardar() {
         if ($this->isNew()){
            return $this->insert();
         } else {
            return $this->update();
        }
    }
     


Espero que puedan entender la pregunta como el codigo expuesto.

Agradezco vuestra ayuda
Que tengan un buen dia
saludos
Etiquetas: MySQL Desarrollo - PHP - PHP Avanzado - PHP PDO - POO - Pregunta - Programación Orientada a Objetos Votos: 0 - Respuestas: 5 - Vistas: 14 Compartir en: Google Facebook Twitter LinkedIn Link
 

Respuestas:

  • Fecha: 19-06-2015 02:46:51 Hola Walter, al momenot de hacer el insert obtenes algun error? (copia y pega el error de PDO para ver el problema con más detalle)

    Saludos!
      Votos: 0 - Link respuesta
     
  • Fecha: 20-06-2015 13:43:19 Muchas gracias Fernando por responder

    al final del execute le agregue

            $stmt->execute();
            print_r($stmt->errorInfo()); // Linea agregada para obtener el error
            exit();// Linea agregada para obtener el error y detener la ejecución del script
    
    


    y responde

    Array ( [0] => 42S22 [1] => 1054 [2] => La columna 'fechaEstado' en field list es desconocido

    Y si el problema es que el campo estaba mal, fechaEstado no existía si existía estadoFecha, estaba mal escrito.

    Renombre la tabla a fechaEstado

    y luego me arroja otro error

    Array ( [0] => 23000 [1] => 1452 [2] => Cannot add or update a child row: a foreign key constraint fails (`swpositionreport`.`usuario`, CONSTRAINT `fk_usuario_rol_usuario` FOREIGN KEY (`usuario_rol_id`) REFERENCES `usuario_rol` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION) )


    mas alla del error del campo fechaEstado, aun nickName no toma valor

    Se muestra el erro y el debugger




    Tabla: Usuario



    Muchas gracias por la ayuda

    Saludos

    //OFFTOPIC// si alguien necesita grabar video con audio gratis sin programas les recomiendo esta herramienta Grabador de Pantalla Gratis Apowersoft en APPLET de JAVA que he utilizado
      Votos: 0 - Link respuesta
     
  • Fecha: 22-06-2015 03:48:46 Hola Walter, en la tabla "usuario_rol" tenes el registro con id = 1?

    El error que estas obteniendo es que no puede insertar en la tabla usuario porque la "constraint" contra la tabla "usuario_rol" falla (Cannot add or update a child row: a foreign key constraint fails).

    Primero busca resolver este problema, casi seguro te esta faltando el registor en "usuario_rol".

    Luego me cuentas.

    Saludos,
      Votos: 0 - Link respuesta
     
  • Fecha: 19-07-2015 14:03:30 Hola Fernando

    Muchas gracias por responder

    De hecho si tengo un registro con ID=1 en la tabla "usuario_rol"


    Saludos
      Votos: 0 - Link respuesta
     
  • Fecha: 21-07-2015 09:18:06 Ahora que vuelvo a ver el video detecto que estas usando bindParam para la fecha de creación (entre otras fechas) y eso no es posible, ya que "NOW()" será interpretado como una cadena de texto y no como una función de MySQL.

    Prueba cambiar esto por una fecha "2015-07-21 00:00:00" (por ejemplo) y prueba nuevamente.

    Otra cosa que puedes hacer es simplificar un poco la query, hacer un hardcode provisorio de algunas variables como nickname en el insert y no esperar que sean autocompletadas por los bindParam a fin de probar y poder sacar nuevas concluciones.

    Por ejemplo, cambiando el inset por:

    $query = <<<QUERYDB
    INSERT INTO usuario
    (usuario_rol_id,
    usuario_estado_id,
    nickName,
    nombreApellido,
    email,
    password,
    fechaNacimiento,
    fechaCreacion,
    fechaEstado) 
    VALUES 
    (:usuario_rol_id,
    :usuario_estado_id,
    'Walter',
    :nombreApellido,
    :email,
    :password,
    '2015-07-21 00:00:00',
    '2015-07-21 00:00:00',
    '2015-07-21 00:00:00');
    QUERYDB;
    


    y ver que pasa....

    Algo que también estoy notando es que utilizas dos tipos de notaciones, notación camelcase y underscore, si usas usuario_estado_id, lo correcto sería que uses para nombreApellido algo como nombre_apellido. De cualquier forma, no es aconsejable utilizar mayusculas en MySQL, porque el servidor tiene que tener una configuración especial (no estándar) para manejarlas, puedes leer un poco más sobre el parametro de configuración "lower_case_table_names", aquí el link a la documentación oficial: https://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html

    Prueba simplificar el bindParam como te mencioné y luego me cuentas...

    Saludos,
    Fernando
      Votos: 1 - Link respuesta
     
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
 
frjcbbae garagebible.com