絶対そうです。
実際のところ、ネイティブのプリペアド ステートメントは、教科書の単純なケースにのみ適しています。
複雑なケースが何であれ、「数百行」を書かなければならないことを意味します。そのようなケースの小さなダイジェストをPDO タグ wikiに作成しました。主なデメリットは
- 識別子のプレースホルダーはありません。古い良い mysql_* コードのように、手動でフォーマットして注入する必要があります。
- 配列のプレースホルダーはありません。つまり、コードを手動で記述し、後でそれをクエリに挿入する必要があることを意味します。そのため、何らかのトラブルに陥る可能性がまだあります。
したがって、PDO でもより高いレベルの抽象化が必要です。一般的な解決策は、最新のすべてのフレームワークで提供されるある種のクエリ ビルダーを使用することです。
しかし、個人的には、SQL 全体を置き換えるふりをして、明らかに失敗しているように見えて、肥大化しすぎているように見えるクエリ ビルダーが嫌いです。というわけで、純粋なSQLが使えるのになぜPHPで書かれたSQLを使うのか理解できません。この目的のために、ネイティブのプリペアド ステートメントsafeMysqlのすべての欠点を修正するために、抽象化ライブラリを作成しました。必要なものすべてのプレースホルダーがあるため、クエリは PDO よりもはるかに安全になりますが、アプリケーション コードは劇的に短くなります。
safeMysqlを使用すると、実際に「文字通りクエリを書く」ことができます。
$sql = "SELECT * FROM articles WHERE id IN(?a) ORDER BY ?n LIMIT ?i"
$data = $db->getAll($sql, $ids,$_GET['order'], $limit);
$sql = "INSERT INTO stats SET pid=?i,ip=inet_aton(?s),?u ON DUPLICATE KEY UPDATE ?u";
$db->query($sql, $pid, $ip, $data, $data);
これらの 2 ライナーを、生の PDO を使用して記述する必要があるコードの量と比較してください。