Foros del Web » Programando para Internet » PHP » CodeIgniter »

Doctrine Posgree Error, usando CodeIgniter.

Estas en el tema de Doctrine Posgree Error, usando CodeIgniter. en el foro de CodeIgniter en Foros del Web. Hola a todos y gracias por su tiempo anticipadamente. Les cuento que estoy desarrollando una App usando CodeIgniter 1.7.2 y Doctrine 1.2.2 ambos integrados perfectamente, ...
  #1 (permalink)  
Antiguo 08/06/2011, 12:21
Avatar de Kodee  
Fecha de Ingreso: junio-2011
Mensajes: 11
Antigüedad: 13 años, 5 meses
Puntos: 0
Pregunta Doctrine Posgree Error, usando CodeIgniter.

Hola a todos y gracias por su tiempo anticipadamente.
Les cuento que estoy desarrollando una App usando CodeIgniter 1.7.2 y Doctrine 1.2.2 ambos integrados perfectamente, el formato de Base de Datos es Postgrees.
8.4.1
Sin embargo a la hora de insertar un obj de la forma clasica

Código PHP:
obj->save() 
Estoy obteniendo un extraño error por parte de Doctrine.

El codigo implicado es el siguiente.


METODO DEL CONTROLADOR QUE RECIBE LOS PARAMETROS
fichero: paciente_controller.php extiende de Controller

Código PHP:
function salvar() {

        
$paciente = new Paciente(PacienteTable::getInstance(), true);
        
$carnet $this->input->post('carnet');
        
$nombre $this->input->post('nombre');
        
$apellidos $this->input->post('apellidos');
        
$grado $this->input->post('grado');
        
$estado_civil $this->input->post('estado_civil');
        
$sexo $this->input->post('sexo');
        
$color_piel $this->input->post('color_piel');
        
$fecha_nacimiento $this->input->post('fecha_nacimiento');
        
$lugar_nacimiento $this->input->post('lugar_nacimiento');
        
$um $this->input->post('um');
        
$edad $this->input->post('edad');
        
$direccion $this->input->post('direccion');
        
        
$paciente->salvar($carnet$nombre$apellidos$grado$estado_civil$sexo$color_piel$fecha_nacimiento$lugar_nacimiento$um$edad$direccion);

    } 
METODO QUE SE ENCARGA DE SALVAR EL OBJETO, ESTA ALOJADO EN LA CLASE DEL MODELO QUE EXTIENDE DE LA BASE.
fichero: Paciente.php extiende de BasePaciente

Código PHP:
public function salvar($carnet,$nombre,$apellidos$grado$estado_civil$sexo$color_piel,
                         
$fecha_nacimiento,$lugar_nacimiento,$um$edad$direccion)
  {

      
$this->carnet $carnet;
      
$this->nombre $nombre;
      
$this->apellidos $apellidos;
      
$this->grado $grado;
      
$this->estado_civil $estado_civil;
      
$this->sexo $sexo;
      
$this->color_piel $color_piel;
      
$this->fecha_nacimiento $fecha_nacimiento;      
      
$this->lugar_nacimiento =  $lugar_nacimiento;
      
$this->um $um;
      
$this->edad $edad;
      
$this->direccion =  $direccion;

          try {
              
$this->save();
              
$result["success"] = true;
          }
          catch (
Doctrine_Validator_Exception $e) {
              
$errors $this->getErrorStackAsString();
              
$errorStack $this->getErrorStack();
              
$result["success"] = false;
              
$result["errors"]["reason"] = $errors;
                foreach(
$errorStack as $fieldName => $errorCodes) {
                   
$result["errors"][$fieldName]= $fieldName " - " implode(', '$errorCodes);// . "\n";
                 
}
          }

      echo 
json_encode($result);
      return  
json_encode($result);
    } 
Y a continuacion les muestro la excepcion que lanza Doctrine, es de tipo Doctrine_Connection_Pgsql_Exception

Uncaught exception 'Doctrine_Connection_Pgsql_Exception' with message 'SQLSTATE[22001]: String data, right truncated: 7 ERROR: value too long for type character varying(1)' in C:\wamp\www\Peritaje\apps\plugins\doctrine\lib\Doc trine\Connection.php:1082


El codigo anterior funciona perfectamente, con una BD mysql, les adelanto, que los parametros del objetos son correctamente enviados, lo notaran en la validacion que se hace en el metodo salvar, la cual verifica que no halla errores en los paramentros.

Alguna idea de porque se produce este error? De donde proviene o como puede ser resuelto?

Para los mas avezados publico el Stack trace, quizas peudan definir la causa del mismo.

Código HTML:
<b>Fatal error</b>:  Uncaught exception 'Doctrine_Connection_Pgsql_Exception' with message 'SQLSTATE[22001]: String data, right truncated: 7 ERROR:  value too long for type character varying(1)' in C:\wamp\www\Peritaje\apps\plugins\doctrine\lib\Doctrine\Connection.php:1082
Stack trace:
#0 C:\wamp\www\Peritaje\apps\plugins\doctrine\lib\Doctrine\Connection\Statement.php(269): Doctrine_Connection-&gt;rethrowException(Object(PDOException), Object(Doctrine_Connection_Statement))
#1 C:\wamp\www\Peritaje\apps\plugins\doctrine\lib\Doctrine\Connection.php(1042): Doctrine_Connection_Statement-&gt;execute(Array)
#2 C:\wamp\www\Peritaje\apps\plugins\doctrine\lib\Doctrine\Connection\Pgsql.php(244): Doctrine_Connection-&gt;exec('INSERT INTO pac...', Array)
#3 C:\wamp\www\Peritaje\apps\plugins\doctrine\lib\Doctrine\Connection\UnitOfWork.php(635): Doctrine_Connection_Pgsql-&gt;insert(Object(PacienteTable), Array)
#4 C:\wamp\www\Peritaje\apps\plugins\doctrine\lib\Doctrine\Connection\UnitOfWork.php(566): Doctrine_Connection in <b>C:\wamp\www\Peritaje\apps\plugins\doctrine\lib\Doctrine\Connection.php</b> on line <b>1082</b><br /> 
Saludos y gracias por la ayuda.
  #2 (permalink)  
Antiguo 08/06/2011, 14:00
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Doctrine Posgree Error, usando CodeIgniter.

El problema fuera de Doctrine es que una de tus columnas acepta menos datos de los que le estas enviando, por eso te esta lanzando la excepción.
  #3 (permalink)  
Antiguo 09/06/2011, 06:19
Avatar de Kodee  
Fecha de Ingreso: junio-2011
Mensajes: 11
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Doctrine Posgree Error, usando CodeIgniter.

Exactamente, es como dices, el error lanzado por postgres, se debia a que doctrine intentaba insertar un dato mayor que el tamaño de la columna, funcionaba correctamente para mysql debido a que las base de datos eran diferentes, en una existia el error y en otra no.

Ahora mi duda queda si estoy validando todo con doctrine:

Código PHP:
Doctrine_Manager::getInstance()->setAttribute(
    
Doctrine_Core::ATTR_VALIDATE,Doctrine_Core::VALIDATE_ALL); 
y el modelo es generado a partir de la base datos incorrecta, donde tiene definido el tamaño de la columna, porqué doctrine no me lanza una excepcion del tipo Doctrine_Validator_Exception cuando llamo al metodo save() del obj?

No es lógico que compare el tamaño del dato que quiero insertar con el tamaño de la columna correspodiente en el modelo?
  #4 (permalink)  
Antiguo 09/06/2011, 06:29
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Doctrine Posgree Error, usando CodeIgniter.

Si no recuerdo mal, save no dispara de forma automática el isValid, has probado hacer un isValid primero ?

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #5 (permalink)  
Antiguo 09/06/2011, 11:53
Avatar de Kodee  
Fecha de Ingreso: junio-2011
Mensajes: 11
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Doctrine Posgree Error, usando CodeIgniter.

Mi error al pensar que el metodo save() dispararia el isValid(), aunque creo que deberia, doctrine no deberia dejar de forma inconsistente un obj a la hora de salvarlo.

Bueno gracias a todos por sus respuestas, finalmente el error fue solucionado y todo marcha sobre ruedas.

un saludo y dios los bendiga.
  #6 (permalink)  
Antiguo 09/06/2011, 12:11
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Doctrine Posgree Error, usando CodeIgniter.

Depende desde donde se mire, la gente de Doctrine piensa que es tarea del programador decidir cuando validar, ahora extender Doctrine_Record y hacer tu save con is valid, te lleva cuanto ? 5 lineas, es algo simple agregar esa funcionalidad.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #7 (permalink)  
Antiguo 09/06/2011, 15:54
Avatar de Kodee  
Fecha de Ingreso: junio-2011
Mensajes: 11
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Doctrine Posgree Error, usando CodeIgniter.

Claro te entiendo, y entiendo la filosofia de doctrine, al dejarte la libertad de decidir cuando validas, sin embargo a modo de muro defensa, podrian definirle un estado al obj, para saber si fue validado o no, y en caso de que no fuera asi pues activar el metodo isValid() a la hora de realizar un save().

Creo que de esta forma seria mas sólido el ORM, y ademas preveeria errores de conocimiento de parte del programador. Voy a tomarme el trabajo de postear en el foro de doctrine a ver que creen de esta idea, quizas hasta doctrine lo haga ya con la configuracion adecuada.
  #8 (permalink)  
Antiguo 09/06/2011, 16:06
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Doctrine Posgree Error, usando CodeIgniter.

Es que de esa forma obligas a validar en el modelo y es lo que se quiere evitar, la idea es que tengas la posibilidad pero no la obligación.

Y ten en cuenta que a la versión 1.2.x no creo que se le hagan cambios, ya se han movido a la versión 2 la cual ha eliminado por completo los validators.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #9 (permalink)  
Antiguo 13/06/2011, 08:46
Avatar de Kodee  
Fecha de Ingreso: junio-2011
Mensajes: 11
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Doctrine Posgree Error, usando CodeIgniter.

Y que los sustituye ahora en la version 2.0?
  #10 (permalink)  
Antiguo 13/06/2011, 09:09
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Doctrine Posgree Error, usando CodeIgniter.

Dentro de Doctrine no hay nada que lo reemplace, se han eliminado, la idea es utilizar los del FW que estés trabajando, en tu caso serian los de CI.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #11 (permalink)  
Antiguo 13/06/2011, 10:42
Avatar de Kodee  
Fecha de Ingreso: junio-2011
Mensajes: 11
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Doctrine Posgree Error, usando CodeIgniter.

Bueno ellos son los expertos y sabrán porque lo hacen, por mi parte considero que la validación del ORM es excelente y deberian al menos conservarla.

Muchas gracias por tu respuestas, se nota que estás preparando en el tema.

Saludos
  #12 (permalink)  
Antiguo 13/06/2011, 14:25
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Doctrine Posgree Error, usando CodeIgniter.

Son decisiones que deben tomar a unos les gusta a otros no tanto, para mi es una buena elección, te dejo un par de referencias,

http://www.doctrine-project.org/blog...e2-validations
http://www.doctrine-project.org/docs...-entities.html

D2 es realmente excelente.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #13 (permalink)  
Antiguo 15/06/2011, 16:46
Avatar de Kodee  
Fecha de Ingreso: junio-2011
Mensajes: 11
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Doctrine Posgree Error, usando CodeIgniter.

muy buenas referencias, en general la guia oficial de doctine 2 es muy completa.

Etiquetas: doctrine, frameworks-y-php-orientado-a-objetos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:21.