4

私は周りを読んでいて、データベースとの接続を設定するときに追加する必要があると人々は言います

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

実際のPDOステートメントを使用してエミュレートされたプリペアドステートメントを無効にするようにPDOに指示します。

Codeigniterでこれを設定するにはどうすればよいですか?

codeigniter2.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

システム/データベース/ドライバー/pdoの96行目あたりで、エラーモードを編集したり、エミュレート準備を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. PDOを使用するようにapplication/config/database.phpを変更します。

    $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. コントローラで拡張クラスを使用する。すべてのコントローラー(ユーザーコントローラーの例)でこれを変更します。

これを変える:

クラスUsersはCI_Controller {を拡張します

これに->

クラスUsersはMY_Controller {を拡張します

これで、DBからすべてのデータが正しいタイプで返されるはずです。CI3でテストしましたが、CI2でも機能するはずです。

于 2017-11-09T08:07:39.227 に答える