【问题标题】:Codeigniter PDO emulate prepareCodeigniter PDO 模拟准备
【发布时间】:2013-02-01 01:27:45
【问题描述】:

我一直在阅读,人们说在建立与数据库的连接时应该添加

$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

告诉 PDO 使用真实的 PDO 语句禁用模拟的预准备语句。

如何在 Codeigniter 中进行设置?

我正在使用 codeigniter 2.1.3

编辑1:

我现在如何连接:

$active_group = 'default';
$active_record = FALSE;

$db['default']['hostname'] = 'mysql:host=localhost';
$db['default']['username'] = 'XXXXXXX';
$db['default']['password'] = 'XXXXXXXXXX';
$db['default']['database'] = 'XXXXXXX';
$db['default']['dbdriver'] = 'pdo';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = FALSE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

一个查询示例是:

function validate_login()
    {
    $bcrypt = new Bcrypt(17);   
    $sql = "SELECT * FROM users WHERE username = :user";
    $loginQ = $this->db->conn_id->prepare($sql);
    $loginQ->bindParam(':user', $this->input->post('username'));
    $loginQ->execute(); 
    $row = $loginQ->fetch();
    $hash = $row['password'];
    $password = $this->input->post('password');
    $verified = $bcrypt->verify($password, $hash);

        if($bcrypt->verify($password, $hash))
        {
            return $loginQ;
        }
    }

【问题讨论】:

    标签: php mysql codeigniter pdo prepared-statement


    【解决方案1】:

    我在这个问题上挣扎了很久。而且我无法找到一个不太老套的可行解决方案。这就是我想出的。适用于所有控制器,但可以以类似方式扩展到任何 CI 类。

    1. 更改 application/config/database.php 以使用 PDO:

      $db['default'] = array(
          'dsn'   => 'mysql:host=localhost;dbname={{my_db}};charset=utf8;',
          'username' => 'my_db_user',
          'password' => '123',
          'database' => 'my_db',
          'dbdriver' => 'pdo',
          ...
      );
      
    2. 创建 MY_Controller 类以扩展 CI_Controller application/core/MY_Controller.php

      class MY_Controller extends CI_Controller {
          public function __construct() {
              parent::__construct();
              $this->db->conn_id->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
          }
      }
      
    3. 在控制器中使用扩展类。在所有控制器中更改此设置(示例用户控制器):

    改变这个:

    类用户扩展CI_Controller {

    进入这个->

    类用户扩展MY_Controller {

    现在您应该拥有从数据库返回的所有正确类型的数据。在 CI3 上测试过,但我相信它也应该适用于 CI2。

    【讨论】:

      【解决方案2】:

      system/database/drivers/pdo 在第 96 行附近,您可以编辑错误模式,并且可以将 emulate prepares 添加为 false。现在大多数数据库服务器都可以利用这一点,我知道 mysql 可以。希望这对其他人有帮助。

      function db_connect()
          {
              $this->options['PDO::ATTR_ERRMODE'] = PDO::ERRMODE_EXCEPTION;
              $this->options['PDO::ATTR_EMULATE_PREPARES'] = FALSE;
      
              return new PDO($this->hostname, $this->username, $this->password, $this->options);
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-17
        • 2020-03-26
        • 2011-04-14
        • 1970-01-01
        • 2016-11-29
        • 1970-01-01
        • 2012-06-02
        相关资源
        最近更新 更多