Pregunta:
Fecha: 18-06-2015 12:38:35
(En Español)
Genero esta pregunta ya que me estoy volviendo loco en encontrar el problema de lo siguiente.
En esta linea en particular:
nickName no toma ningun valor y $usuario si tiene valor.
es en el momento de hacer INSERT.
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:
Espero que puedan entender la pregunta como el codigo expuesto.
Agradezco vuestra ayuda
Que tengan un buen dia
saludos Votos: 0 - Respuestas: 5 - Vistas: 14 Compartir en: Google Facebook Twitter LinkedIn Link
Problema con PDO bindParam() no me toma un dato[Resuelta]
Hola a todosGenero 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 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
