http://php.net/manual/en/mysqli.quickstart.prepared-statements.php からの正しい MySQLi パラメータ化クエリ構文:
リーリーただし、これは絶対に行わないでください:
リーリー 私の意見では、 名前付きパラメータ
置換は、API レベルで実装するのが合理的な機能です。驚いたことに、MySQLi はライブラリに 名前のないパラメータ
のみを実装します。
正当な理由はありますか? PDO、DQL、ORM がすべてクエリで名前付きパラメーターをどのように受け取るかを見ると、これは私には理解できません。
MySQLi 開発者が「怠け者なのでやりたくない」という状況に陥らないことを願っています。きっと正当な理由があるはずだと信じていて、その理由、あるいはその理由を見つける方法を探しています。名前付きパラメータが MySQLi 拡張ライブラリに実装されていない理由。
伝統的に、MySQLi は MySQL API です。それ自体では何も追加されませんが、これには理由があります。名前付きプレースホルダーのような機能を追加するには、(考えてみれば) 膨大な SQL クエリ解析が必要になります。もちろん、これはデータベース API の仕事ではありません。他の回答で述べたように、API は DAL または DBAL ではなく、異なる目的を果たします。
PDO は、言語ではめったに見られない偉大な偉業であり、ウェス ファーロングは、ほぼ独力でその任務を引き受けた天才です。しかし、PDO は別の話です。これはデータベース アクセスの抽象化レイヤーであり、好むと好まざるにかかわらず、これを実現するにはクエリ パーサーが必要です。すでにクエリ パーサーがあり、ドライバーの 1 つが名前付きプレースホルダーをサポートしているため、サポートされているすべてのドライバーにそれを追加するのが自然です。ご覧のとおり、MySQLi ではすべてが変わります。
簡単に言うと「怠惰」ではなく「怠惰」です。それは規範に従うことです。
MYSQLi
名前付きパラメータがサポートされない主な理由は 2 つあります。これはラッパーで使用することを「意図」しており (この用語は大まかに使用しています)、-
これに対応する - PDO
ポイント 1 について詳しく説明すると、は機能します - 車輪を再発明する必要はありません
mysqli
は、
PDOと比較して多くの欠点があるにもかかわらず、優れたラッパーと簡単に比較できます。つまり、名前付きパラメーター (とりわけ) がサポートされています。 mysqli 自体ではなくラッパーによって。これは仕様によるもので、理由は 1 つだけです:
は、高速かつ柔軟なライブラリになるように設計されています。
mysqli
実行時間を短縮したいですか?ラッパーなしでと
pdoは両方とも PHP 5 (PDO バージョンは 5.3 だったと思います) でリリースされたため、異なる目的を果たします。
mysqli
を使用します。名前付きパラメータが必要ですか?これを処理するには、
PDOを使用するか、
mysqliラッパーを構築します。ただし、これにより実行時間が妨げられることに注意してください。