2016-09-18 2 views
1

私は最近、PHPでATTR_EMULATE_PREPARESがデフォルトでtrueに設定されていることを知りました。それは私が行うことを決めたものですので、このフォーラムは、falseにATTR_EMULATE_PREPARESを設定することをお勧めいくつかの記事が含まれていますATTR_EMULATE_PREPARESがオフのときにPDOでDEFAULTパラメータをエミュレートする方法は?

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

それは簡単な変更だし、システム内に存在するSQLクエリのいずれも影響を受けてはなりませんこの属性を設定します。結局のところ、クエリSELECT column1, column2 FROM table WHERE column3 = ?では、パラメータがMySQLサーバによって解釈される実際のパラメータであるか、またはPDOによって提供される(エスケープされた)値で置き換えられたかどうかは問合せの結果に関係しないはずです。

しかし、今日、私は奇妙なエラーに出くわしました。クエリのパラメータをエミュレートしないようにフラグを設定した後に突然失敗したクエリALTER TABLE table ADD COLUMN column INT NULL DEFAULT ?があります。

何らかの理由でDEFAULTの値をパラメータにすることはできません。代わりにハードコードされた値でなければなりません。したがって、PDOが文をエミュレートすると、MySQLサーバは、DEFAULTの値がもともとハードコードされた値ではなくパラメータであったことに気付かずにクエリを受け取ります。エミュレーションを行わないと、MySQLサーバはパラメータ値をサポートしていないため、構文エラーをスローします。

これは私の質問です:PDOを持つことは可能ですはクエリステートメントをエミュレートしませんが、値をエミュレートするだけですか?または、DEFAULT句を含むデータベーススキーマ調整クエリを作成するときに、このようなエミュレーションを自分で試みるべきですか?

エラーを避けるために、単にATTR_EMULATE_PREPARESをオンにする必要がありますか?

+0

具体的なエラーメッセージとはなんですか?そして、はい、MySQLには文がパラメータ化を許可するいくつかの制限があります。テーブルの宣言は、値のバインディングや式では実際には機能しません( 'LIKE'節とよく似ています)。 – mario

+0

@marioエラーメッセージは、(?文が準備されていない)理解できないクエリの '?'文字のために、構文の無効に関するものです。 – user2180613

答えて

0

いいえ、そんなことはありません。

エミュレーションモードをオフにしたがっている場合は、データベースがプリペアドステートメントをサポートしていないデータ変更クエリやその他のステートメントを実行するときに、その状態を一時的に元に戻すことができます。この特定のクエリを実行した後、エミュレーションモードをオフに戻します。

エミュレーションモードを永続的に保つことができます。ここで唯一の不都合は、execute()でLIMITパラメータをバインドできないことです。

関連する問題