私は最近、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
をオンにする必要がありますか?
具体的なエラーメッセージとはなんですか?そして、はい、MySQLには文がパラメータ化を許可するいくつかの制限があります。テーブルの宣言は、値のバインディングや式では実際には機能しません( 'LIKE'節とよく似ています)。 – mario
@marioエラーメッセージは、(?文が準備されていない)理解できないクエリの '?'文字のために、構文の無効に関するものです。 – user2180613