utf8 set_charset charset php zend-framework pdo zend-db-table

set_charset - set charset utf 8 php pdo



Cómo hacer que PDO ejecute SET NAMES utf8 cada vez que me conecto, en ZendFramework (8)

En tu archivo de arranque ...

$db = Zend_Db::factory($adapter, $config); $db->query("SET NAMES ''utf8''");

luego guardas esta instancia en tu registro

Zend_Registry::set(''db'', $db);

Cómo hacer que el adaptador PDO ejecute SET NAMES utf8 cada vez que me conecto, en ZendFramework. Estoy usando un archivo INI para guardar los datos de configuración del adaptador. ¿Qué entradas debo agregar allí?

Si no estaba claro, estoy buscando la sintaxis correcta para hacerlo en el archivo config.ini de mi proyecto y no en el código php, ya que considero esta parte del código de configuración.


Itay,

Una muy buena pregunta. Afortunadamente para ti la respuesta es muy simple:

database.params.driver_options.1002 = "SET NAMES utf8"

1002 es el valor de PDO constante :: MYSQL_ATTR_INIT_COMMAND

No puedes usar la constante en config.ini


La conexión en zend_db es floja, lo que significa que se conecta en la primera consulta. si tiene una página estática sin consultas, nunca se conectará, incluso si está inicializada en su archivo de arranque.

tan corriendo:

$db->query("SET NAMES ''utf8''");

No es tan inteligente Muchas gracias a dcaunt por su solución.


Simplemente debe ejecutar este comando antes de iniciar consultas, solo debe ejecutarlo una vez antes de las consultas y no para cada consulta.

$pdo->query("SET NAMES ''utf8''");

Ejemplo completo

$servername = "localhost"; $username = "root"; $password = "test"; $dbname = "yourDB"; try { $pdo = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); $pdo->query("SET NAMES ''utf8''"); //set the PDO error mode to exception $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "SELECT name FROM nations"; foreach ($pdo->query($sql) as $row) { echo "<option value=''".$row[''name'']."''>".$row[''name'']."</option>"; } } catch(PDOException $e) { echo "Error: " . $e->getMessage(); } $pdo = null;


Todos estos métodos deberían funcionar, excepto en algunas circunstancias especiales. Por ejemplo, si está ejecutando un servidor web localmente en una máquina Windows con php <5.3.1, solo una consulta ''manual'' $ db-> ("SET NAMES ''utf8''"); antes de que tu consulta real funcione. Cualquier otro método que intente usar MYSQL_ATTR_INIT_COMMAND fallará.

Esto es lo que aprendí hoy, luchando con este mismo problema:

  1. No puede referirse a PDO :: MYSQL_ATTR_INIT_COMMAND en algunos entornos (es decir, el mío, específicamente, no lo sé). Tienes que usar explícitamente 1002 en su lugar

  2. Con Zend Framework 1.11 (quizás desde 1.8, por confirmar), no necesita establecer database.params.driver_options.1002 = "SET NAMES utf8" en su config.ini: resources.db.params.charset = "utf8 "será suficiente para que Zend_Db_Adapter_Pdo_Mysql lo haga por usted.

  3. En Windows, necesita php> = 5.3.1 para que MYSQL_ATTR_INIT_COMMAND funcione.

  4. Si reemplaza su versión de php con 5.3.1 o superior (también probé 5.3.3), debe asegurarse de establecer un valor para pdo_mysql.default_socket en su php.ini. El valor vacío predeterminado no funcionará (para confirmarlo: leí algo sobre esto pero no me molesté en probar sin él después de averiguar sobre el punto 5)

  5. También debe asegurarse de tener ''127.0.0.1 localhost'' en su archivo de sistema oculto windows / system32 / drivers / etc / hosts (eso no fue un problema para php 5.3.0)

¡Con todo esto en mente, deberías ser capaz de salvarte un día de google y mantener algunos de tus pelos! ;)


solo pon esto en tu configuración

database.params.charset = "utf8"

o después de ZF 1.11 esto funcionaría en resources.db.params.charset = utf8 eso es


temer a mi google-fu

$pdo = new PDO( ''mysql:host=mysql.example.com;dbname=example_db'', "username", "password", array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

primer golpe ;)


$table->getAdapter()->query(''SET NAMES UTF8'');