【问题标题】:How to make PDO run SET NAMES utf8 each time I connect, In ZendFramework每次连接时如何让 PDO 运行 SET NAMES utf8,在 ZendFramework 中
【发布时间】:2010-10-09 17:44:15
【问题描述】:

如何让 PDO 适配器在我每次连接时运行 SET NAMES utf8,在 ZendFramework 中。 我正在使用 INI 文件来保存适配器配置数据。我应该在那里添加哪些条目?

如果不清楚,我正在我的项目的 config.ini 文件中而不是在 php 代码中寻找正确的语法,因为我认为这部分配置代码。

【问题讨论】:

    标签: php zend-framework pdo zend-db-table


    【解决方案1】:

    害怕我的google-fu

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

    第一次命中 ;)

    【讨论】:

    • :-) 我的 google foo 更好,在发布之前发现了这个,应该这么说。我会完善我的问题,我试图在 config.ini 中而不是在 php 代码中进行。
    • 这个常量中的斜线转义是怎么回事?
    • 是的,问题是问如何设置utf8。但我认为如果你使用 mysql,你应该考虑使用 utf8mb4 来支持完整的 utf8 字符集。如果您使用 utf8,那么您可能会丢失数据,具体取决于您的 mysql 的配置方式。
    • 感谢 SchizoDuckie,我正在为我的奇怪字符问题寻找解决方案,而您的解决方案完美运行!
    • Google 结果导致 stackoverflow :)
    【解决方案2】:

    意大利,

    一个很好的问题。幸运的是,答案很简单:

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

    1002 是常量 PDO::MYSQL_ATTR_INIT_COMMAND 的值

    你不能在 config.ini 中使用常量

    【讨论】:

      【解决方案3】:

      把它放在你的配置中

      database.params.charset = "utf8"
      

      或在 ZF 1.11 之后,这将适用于 resources.db.params.charset = utf8 就是这样

      【讨论】:

      • 这是现在最好的方法:)
      【解决方案4】:

      zend_db 中的连接是惰性的,这意味着它在第一个查询时连接。 如果你有一个没有查询的静态页面,它甚至永远不会连接 - 即使它在你的引导文件中初始化。

      这样运行:

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

      没那么聪明。 非常感谢 dcaunt 的解决方案。

      【讨论】:

        【解决方案5】:

        所有这些方法应该工作,除非在某些特殊情况下。例如,如果您在 php query("SET NAMES 'utf8'");在您的实际查询起作用之前。 尝试使用 MYSQL_ATTR_INIT_COMMAND 的任何其他方法都将失败。

        这是我今天学到的东西,正在努力解决这个问题:

        1. 您不能在某些环境中引用 PDO::MYSQL_ATTR_INIT_COMMAND(即我的,具体来说我不知道​​)。你必须明确地使用 1002 来代替

        2. 使用 Zend Framework 1.11(可能自 1.8 起,待确认),您无需在 config.ini : resources.db 中设置 database.params.driver_options.1002 = "SET NAMES utf8"。 params.charset = "utf8" 足以让 Zend_Db_Adapter_Pdo_Mysql 为你做这件事。

        3. 在 Windows 上,您需要 php >= 5.3.1 才能使 MYSQL_ATTR_INIT_COMMAND 工作。

        4. 如果您将 php 版本替换为 5.3.1 或更高版本(我也测试了 5.3.3),您需要确保在 php.ini 中为 pdo_mysql.default_socket 设置了一个值。默认的空值不起作用(有待确认:我读过一些关于此的内容,但在发现第 5 点后没有费心尝试没有它)

        5. 您还需要确保您的 windows\system32\drivers\etc\hosts 隐藏系统文件中有“127.0.0.1 localhost”(这对于 php 5.3.0 来说不是问题)

        考虑到这一切,您应该可以节省一天的谷歌搜索时间并保留一些头发! ;)

        【讨论】:

          【解决方案6】:

          您只需在开始查询之前执行此命令,您只需在查询之前执行一次,而不是每次查询。

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

          完整示例

          $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; 
          

          【讨论】:

            【解决方案7】:

            在您的引导文件中...

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

            然后将此实例保存在注册表中

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

            【讨论】:

              【解决方案8】:
              $table->getAdapter()->query('SET NAMES UTF8');
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2011-02-09
                • 2012-12-12
                • 1970-01-01
                • 2014-08-27
                • 2019-04-06
                • 2015-09-09
                • 2013-03-01
                相关资源
                最近更新 更多