2012-01-07 17 views
0

パラメータをPDO準備文にバインドしようとすると、非常に不満な結果になります。PHP PDO BindParam/BindValue二重引用符バグ

このエラーは次のとおりです。 SQL構文にエラーがあります。あなたのMySQLサーバのバージョンに対応するマニュアルをチェックして、正しい文法が1行目の 'items'の近くで使用されるようにしてください。

このエラーは明らかに、 'items'テーブルが一重引用符で囲まれ、そうです。私は下に少しテストをまとめました。ご覧のとおり、私は最初に文のパラメータを引用符で囲んでいません。おそらくほとんどの人々の最初の推測でしょう。 $ paramsをnullに設定して ':table'を 'items'と置き換えてbindParams関数をバイパスすると、BindParam/BindValue(同じ結果を両方とも試してみました)機能と関係があることが分かります。それは完璧に正常に動作します。

私の悲惨さから私を置き去りにして、誰かが私が行方不明になっていることを本当に明白に指摘しますか?

答えて

0

プリペアドステートメントのシンボルは、識別子ではなく値のプレースホルダーであるため、動的な列またはテーブル名でプリペアドステートメントを作成することはできません。すべてのデータベース参照は、準備時に解決する必要があります。これが真実ではない場合でも、:tableのプレースホルダがリテラルまたは識別子であることがPDO/MySQLによってどのように分かりましたか?彼らは異なる引用規則を持っています。

この制限は、すべてのデータベースシステムとすべてのAPIのプリペアドステートメントに共通しています。確かにPDOのバグではありません。

+0

ああ、それは私が聞く必要があった明らかなものです!乾杯! – Paul