4

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

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

2 回答 2

6

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);
    }
于 2013-02-19T01:46:43.393 回答
0

我在这个问题上挣扎了很久。而且我无法找到一个不太老套的可行解决方案。这就是我想出的。在所有控制器中工作,但可以以类似的方式扩展到任何 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 {

进入这个->

类用户扩展的 _Controller {

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

于 2017-11-09T08:07:39.227 回答