PHPからMySQLに接続するのに、さすがにmysqlドライバではやり方が古いだろうということで、mysqliを使ってみた。prepared statementが使えるということで、パフォーマンスはいいし、パラメータクエリを使うことによってインジェクションも確実に防げるので非常にいい、のですが、書き方がどうも気に入らない。。
$dbh = @new mysqli($server,$id,$pw,$database);
if($dbh->connect_errno){
die('Connect Error'.$dbh->connect_errno);
}
$dbh->set_charset('utf8mb4');
$sql = 'select id,title from books where category_id = ? and author_id = ?';
$sth = $dbh->stmt_init();
if($sth->prepare($sql)){
$sth->bind_param('ii',$category_id,$author_id);
$sth->execute();
$sth->bind_result($r_id,$r_title);
while($sth->fetch()){
echo $r_id."|".$r_title."<br />";
}
$sth->close();
}
$dbh->close();
まず、パラメータの値を指定するbind_paramの部分、パラメータが出てくる順番に型と値を並べる。これって修正時にすごく間違いやすいと思う。
また、結果の値を変数にバインドするbind_resultの部分、これも、出現するカラムの順番通りにきちんと変数を並べないといけない。これなら、mysqlドライバの時のように、$row[“カラム名”]でアクセスできたほうが汎用性もあり便利だったのでは、と思うのはPHP初心者の考えなのかなあ。
PDOでアクセスする方法もあり、そちらの方が書きやすいという話も聞くので、そのうち比較してみます。