2013-02-16 2 views
4

Я читал вокруг и люди говорят, что при настройке соединения с базой данных, которые вы должны добавитьCodeigniter PDO эмулировать подготовить

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

Рассказывая PDO, чтобы отключить эмулировать подготовленные заявления с использованием реальных заявлений PDO.

Как настроить это в Codeigniter?

Я использую CodeIgniter 2.1.3

Edit 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; 
     } 
    } 

ответ

5

система/база данных/drivers/pdo вокруг линии 96 вы можете отредактировать режим ошибки, и вы можете добавить эмуляцию подготавливается к false. Теперь большинство серверов db могут воспользоваться этим, я знаю, что 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); 
    } 
0

Я долгое время боролся с этим. И я не смог найти рабочее решение, которое не было слишком хаки. Это то, что я придумал. Работает внутри всех контроллеров, но может быть распространен на все классы CI аналогичным образом.

  1. Изменить приложение/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 приложение/ядро ​​/ 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. Использование расширенного класса в контроллерах. Измените это во всех контроллерах (пример контроллера Users):

Изменить это:

класс пользователей расширяет CI _Controller {

в этом ->

класса пользователей расширяет MY _Controller {

Теперь у вас должны быть все данные, возвращенные с DB с правильными типами. Протестировано на CI3, но я считаю, что он также должен работать на CI2.

Смежные вопросы