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

Zend Form y Zend DB no se llevan bien

Estas en el tema de Zend Form y Zend DB no se llevan bien en el foro de Zend en Foros del Web. Mi consulta es un problema que tal vez ya sea común, pero no logro dar con una solución en Zend Framework. Estoy haciendo un manejador ...
  #1 (permalink)  
Antiguo 15/09/2008, 11:07
Avatar de ArrauKano  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago
Mensajes: 664
Antigüedad: 21 años, 5 meses
Puntos: 4
Zend Form y Zend DB no se llevan bien

Mi consulta es un problema que tal vez ya sea común, pero no logro dar con una solución en Zend Framework.

Estoy haciendo un manejador de datos para una pequeña tienda. Por lo tanto, debo registrar a los clientes y demás datos asociados.

Entonces tengo mi clase Modelo, y en mi Controlador tengo un "crearFormulario()".
El problema es que cuando el nombre del cliente tiene caracteres acentuados, los rescata mal de la BD, por ejemplo, si hago algo tan simple como esto:

Código PHP:
        $db Zend_Registry::get('core_db');
        
$sql 'SELECT * FROM tabla WHERE id_cliente = 1324';
        
$result $db->fetchRow($sql);
        
var_dump($result); 
Me retorna la cadena, pero los acentos me salen con un caracter de inválido (Por ejemplo, el apellido: Mons�lvez).

--
El problema gravísimo, es que cuando pego ese valor en un formulario, de esta manera:

Código PHP:
    $form->costumerName->setValue(
        
$costumerInfo->name
    
); 
Luego el valor aparece en blanco en la vista. Ni siquiera aparece la cadena con el caracter invalido tal como si lo imprimiera directo en pantalla. Lo curioso es que si pongo directamente

Código PHP:
    $form->costumerName->setValue(
        
'ñoño'
    
); 
Se ve perfecto, y si copio/pego el nombre de la persona, como aparece en el navegador si lo imprimo directo, así:


Código PHP:
    $form->costumerName->setValue(
        
'Mons�lvez'
    
); 
También aparece la cadena (con el caracter inválido, pero al menos aparece).

¿QUE HAGO?

La idea es ojalá, no tener que tocar el servidor, porque si alguna vez quisiera usar la aplicación en un hosting, seguramente no voy a poder modificar el php.ini ni la configuración de la BD.

En mi vista uso explícitamente UTF-8 (tanto en la codificación del archivo fuente como en el tag html), en la base de datos también uso utf-8, en TODOS los campos de cadena, incluso las tablas las creé directamente como utf-8.

¿Alguna idea?
__________________
Blog | Tecnosquad
  #2 (permalink)  
Antiguo 15/09/2008, 12:49
Avatar de pablofmorales  
Fecha de Ingreso: abril-2008
Ubicación: Buenos Aires, Argentina, Argentina
Mensajes: 222
Antigüedad: 16 años
Puntos: 37
Respuesta: Zend Form y Zend DB no se llevan bien

Formatea antes el texto

$form->costumerName->setValue(
$this->escape( $costumerInfo->name )
);
__________________
blog
  #3 (permalink)  
Antiguo 15/09/2008, 13:05
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Zend Form y Zend DB no se llevan bien

Hola ArrauKano,

Que tipo de codificación usas en tu HTML y en tu Base de Datos?

Prueba pasarla a UTF8, en la BD puedes hacer:
Código php:
Ver original
  1. $sql = 'SET NAMES utf8';
  2. // o
  3. $sql = 'SET CHARACTER_SET utf8';

Saludos.
  #4 (permalink)  
Antiguo 15/09/2008, 13:21
Avatar de ArrauKano  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago
Mensajes: 664
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: Zend Form y Zend DB no se llevan bien

Cita:
Iniciado por pablofmorales Ver Mensaje
Formatea antes el texto

$form->costumerName->setValue(
$this->escape( $costumerInfo->name )
);
ese método es de la vista según veo.

Peor. cuando hago eso, no imprime nada
__________________
Blog | Tecnosquad
  #5 (permalink)  
Antiguo 15/09/2008, 13:39
Avatar de pablofmorales  
Fecha de Ingreso: abril-2008
Ubicación: Buenos Aires, Argentina, Argentina
Mensajes: 222
Antigüedad: 16 años
Puntos: 37
Respuesta: Zend Form y Zend DB no se llevan bien

Si es de la vista

sino usa este metodo, stripslashes

pero lo mejor es hacer como dice Gatarov,, y revisar el encoding
__________________
blog
  #6 (permalink)  
Antiguo 15/09/2008, 13:57
Avatar de ArrauKano  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago
Mensajes: 664
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: Zend Form y Zend DB no se llevan bien

Cita:
Iniciado por GatorV Ver Mensaje
Hola ArrauKano,

Que tipo de codificación usas en tu HTML y en tu Base de Datos?

Prueba pasarla a UTF8, en la BD puedes hacer:
Código php:
Ver original
  1. $sql = 'SET NAMES utf8';
  2. // o
  3. $sql = 'SET CHARACTER_SET utf8';

Saludos.
Bueno, hice esto y funciona :D

Código php:
Ver original
  1. $db = Zend_Registry::get('core_db');
  2.         $sql = 'SET NAMES \'utf8\'';
  3.         $result = $db->query($sql);
  4.         //var_dump($result);  
  5.         $sql = 'SET CHARACTER SET utf8';
  6.         $result = $db->query($sql);
  7.         //var_dump($result);

Salvo por un detalle.

¿Esto es exclusivamente para mysql o es una consulta sql-estándar?
No me quiero amarrar a un motor de BD, menos por un detalle como este.
__________________
Blog | Tecnosquad
  #7 (permalink)  
Antiguo 15/09/2008, 14:01
Avatar de Genetix  
Fecha de Ingreso: febrero-2002
Ubicación: Lima - Perú
Mensajes: 1.600
Antigüedad: 22 años, 2 meses
Puntos: 45
Respuesta: Zend Form y Zend DB no se llevan bien

Hola ArrauKano

Como dice gator pásale el encoding

Lo puedes hacer al momento inicializar el objeto en tu index.php
Código PHP:

$db 
Zend_Db::factory($config);
Zend_Db_Table_Abstract::setDefaultAdapter($db);
$db->query('SET NAMES UTF8'); 
Saludos!
__________________
"El conocimiento nos hace responsables."
twitter: @benjamingb
blog personal: http://codigolinea.com
ZF Manual en español http://manual.zfdes.com
  #8 (permalink)  
Antiguo 15/09/2008, 14:21
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Zend Form y Zend DB no se llevan bien

Ese query es solo para MySQL, por eso te preguntaba que codificación usas en tu base de datos, ya que lo ideal es que uses UTF8 como character set.

Saludos.
  #9 (permalink)  
Antiguo 15/09/2008, 19:22
Avatar de ArrauKano  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago
Mensajes: 664
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: Zend Form y Zend DB no se llevan bien

Mis tablas, y los campos son todos utf-8.

Por eso me extraña que la conexión en sí vuelva en el "latin1" predeterminado.

Uso utf8 en todo, en el editor de texto, en la codificación de los archivos fuente, en las tablas de la base de datos, TODO.
__________________
Blog | Tecnosquad
  #10 (permalink)  
Antiguo 15/09/2008, 19:44
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Zend Form y Zend DB no se llevan bien

En ese caso verifica en el my.cnf el default charset que tiene puesto.

Saludos.
  #11 (permalink)  
Antiguo 15/09/2008, 21:08
Avatar de ArrauKano  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago
Mensajes: 664
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: Zend Form y Zend DB no se llevan bien

Bien, arreglaré mi servidor, pero no me queda otra que añadir el hack, pues como dije, si quisiera ocupar mi aplicación en un hosting, entonces no podría modificar el servidor.

Creo entonces que la solución sería hacer "algo" intermedio, que cuando se cree la conexión, verifique si el adapter es *mysql*, en tal caso, ejecute esas sentencias.
__________________
Blog | Tecnosquad
  #12 (permalink)  
Antiguo 15/09/2008, 22:37
Avatar de ArrauKano  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago
Mensajes: 664
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: Zend Form y Zend DB no se llevan bien

Bueno, finalmente puse esto en un plugin:

Código php:
Ver original
  1. $config = Zend_Registry::get('core_config');
  2. $db = Zend_Registry::get('core_db');
  3. $db->getConnection();
  4.        
  5. // Set charset
  6. if( isset($config->database->charset) && $config->database->charset !== null )
  7. {
  8.    switch( $config->database->adapter )
  9.    {
  10.        case 'mysql':
  11.        case 'mysqli':
  12.        case 'pdo_mysql':
  13.           $db->query('SET NAMES \''.strtoupper($config->database->charset).'\'');
  14.           $db->query('SET CHARACTER SET '.strtoupper($config->database->charset));
  15.        break;
  16.    }
  17. }

Donde la configuración la saco del mismo config.ini que tenía para configurar el resto de la base de datos.
__________________
Blog | Tecnosquad
  #13 (permalink)  
Antiguo 16/09/2008, 08:31
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Zend Form y Zend DB no se llevan bien

Perfecto buena forma de abstraer, tambien deberias de documentarte para ver si es posible que te pase ese problema con otros adaptadores y bases de datos.

Saludos.
  #14 (permalink)  
Antiguo 16/09/2008, 12:50
Avatar de ArrauKano  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago
Mensajes: 664
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: Zend Form y Zend DB no se llevan bien

Exacto, ya que pretendo que el motor de base de datos sea "cualquiera" (soportado), me puse a probar con postgresql también. Descubrí que aún cuando instalé el servidor con la codificación predeterminadad de windows, acá al configurar LA base de datos (la que voy a ocupar, no el motor entero) se le puede decir explícitamente que sea utf8 y la conexión en sí respeta eso, pero también se puede cambiar la codificación en el cliente. Lamentablemente, postgres resultó un poco más lento.

Voy a probar con MSSQL y otras tal vez con Firebird.

Salu2
__________________
Blog | Tecnosquad
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 02:17.