2

ユーザーがインスタンス化できるデータベースクラスがあります。

class Foo extends PDO
{
    public function __construct($dsn, $username, $password)
    {
        parent::__construct($dsn, $username, $password);

        $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
}

$dsn = 'mysql:host=127.0.0.1;dbname=dbdatabase;charset=utf8';
$dbConnection = new Foo($dsn, 'root', 'password');

ただし、使用されるドライバーが次の場合は、コンストラクターでプリペアドステートメントのエミュレーションを無効にする必要がありますmysql

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

(私が知っている)他のドライバーの場合、プリペアドステートメントのエミュレーションはデフォルトで無効になっています(そうあるべきです)。私のクラスでエミュレートされたプリペアドステートメントを無効にする正しい方法は何でしょうか。

  • エミュレートされたプリペアドステートメントを無効にする行を常に追加しますか?これには副作用がありますか?
  • stripos($dsn, 'mysql:')dsnでmysqlを見つけるためにaを実行しますか?
  • PDO::getAttribute('PDO::ATTR_DRIVER_NAME')?を使用して
4

1 に答える 1

1

あなたはそのようなパラメータの副作用を決定することができないので、私はそれをグローバルに行うことを避けます、あなたはそれをするべきではありません。

ちなみに、あなたはmysqlに対してのみそれらを無効にしようとしているので、mysqlに対してのみそれを行ってください。

PDO::ATTR_DRIVER_NAMEを使用するのは良いオプションだと思います。

Doctrine\DBALそのようなものをdriverMapと組み合わせて使用​​して、そのようなものを決定したことを覚えています(そのためのソースが必要です)

また、DSNを使用するよりも見栄えがよくなります。これは、でDSNエイリアスを使用できるため、PDO一部mysqlが存在しない可能性があるためです。

于 2012-07-11T10:54:16.087 に答える