phpでどのmysqlのAPIを使うのがいいか
結論、『mysqlnd』使えて非同期クエリを投げられるので『mysqli』イチ押し、PostgresとかにDBの乗せ換える可能性があるのであれば『PDO mysql』だけど、『PDO postgres』に変えたとしても、結構互換性がなくて修正が必要になるので、『mysqli』でいいと思います。『mysql』はphp7で削除されたので使っちゃダメです。
尚、『mysqli』は名前付きプレースホルダ(Named Placeholder)を使えないので注意
MySQLのprepareは名前付きプレースホルダをサポートしていません。PDOはPDOの中でエミューレートしています。
これは、こんな感じでエミュレートしておけばいいでしょう。名前付きプレースホルダを通常のプレースホルダに変換
<?php $params = [ ':item_type' => 5 , ':item_price' => 30000 , ':item_id' => 4000 , ]; $sql = "SELECT item_id,item_name FROM item \n" . "WHERE \n" . " (item_type <= :item_type AND item_price > :item_price) OR \n" . " (item_type > :item_type AND item_id < :item_id )\n"; preg_match_all('/:[a-z_]+/',$sql, $matches); $params = array_map(function($x)use($params){return $params[$x];},$matches[0]); $sql = preg_replace('/:[a-z_]+/','?',$sql); echo $sql."\n"; print_r($params);
あと、mysqliのbindparamの仕様はかなり扱いにくい仕様になっており、
PDO準拠のラッパーを作っておいた方がいいです。同じく、prepareの結果もPDO準拠でラッパー作っておくべし
でないと、パラメーターが可変になった場合にかなりめんどくさい。
それとexception吐いてくれないので、エラー発生時に自分でスローする処理を入れておいた方がいいです。
でないと、そんなところで死なないで〜という状態になります。
フレームワークのルーターでcatchしてエラー画面を表示した方がいいでしょう。