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してエラー画面を表示した方がいいでしょう。