mysqli拡張サポートによって、MySQL4.1以降で使える機能を利用できる。但し、個人的には全くこの手の関数を使わない。何故ならばMySQLに特化した関数であり、仮に他のDBに移行する場合、保守のコストがとっても高くなってしまうと考えているからだ。それにラーニングコストもかかるし、PDOのメソッド名とmysqliの関数名がごっちゃになる。
■mysqliを使ったDBへの接続
<?php $dbh = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME); if(mysqli_connect_errorno()){ //code for error } mysqli->close(); ?>
mysqliは例外をthrowしない。
<?php $dbh = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME); if(!$dbh){ //code for error } mysqli_close($dbh); ?>
■mysqliを使ったDBへのクエリ発行
<?php $name = mysqli->real_escape_string($_POST['name']); $sql = "SELECT `id`, `name` FROM `person` WHERE `name` = '$name'"; if(!$dbh->real_query($sql)){ //print($dbh->error); } if($result = mysql->store_result()){ while($row = $result->fetch_assoc()){ print($row['id'] . ': ' . $row['name']); } $result->close(); } ?>
$resultもcloseしなきゃならんとは。。。めんどい。。。
<?php $name = mysqli_real_escape_string($_POST['name']); $sql = "SELECT `id`, `name` FROM `person` WHERE `name` = '$name'"; if(mysqli_real_query($dbh, $sql)){ //print(mysqli_error()); } if($result = mysql_store_result($dbh)){ while($row = $result_fetch_assoc($result)){ print($row['id'] . ': ' . $row['name']); } mysqli_free_result($result); } ?>
うーむ。実に不愉快だ。やはりmysqliは性に合わん!
■mysqliを使ったプリペアドステートメント
<?php $sql = "INSERT INTO `person`(`id`, `name`, `country_id`) VALUES(?, ?, ?)"; if($stmt = $dbh->prepare($sql)){ $stmt->bindParam('s', $id, $_POST['name'], $_POST['country_id']); $stmt->execute(); $stmt->bind_result($result_id, $result_name); while($stmt->fetch()){ print($result_id . ': ' . $result_name); } $stmt->close(); } ?>
これじゃ、ソースを書きたくならないな。
<?php $sql = "INSERT INTO `person`(`id`, `name`, `country_id`) VALUES(?, ?, ?)"; if($stmt = mysqli_prepare($dbh, $sql)){ mysqli_stmt_bind_param($stmt, 's', $id, $_POST['name'], $_POST['country_id']); mysqli_stmt_execute()$stmt; mysqli_stmt_bind_result($dbh, $result_id, $result_name); while(mysqli_stmt_fetch()){ print($result_id . ': ' . $result_name); } mysqli_stmt_close($stmt); } ?>
■mysqliを使ったトランザクション
<?php $dbh->autocommit(false); $dbh->query("INSERT INTO `person`(`id`, `name`, `country_id`) VALUES('4', 'Jack', '2')"); $dbh->query("INSERT INTO `person`(`id`, `name`, `country_id`) VALUES('5', 'Emily', '1')"); if(!$dbh->commit()){ $dbh->rollback(); } ?>
<?php mysqli_autocommiti($dbh, false); mysqli_query($dbh, "INSERT INTO `person`(`id`, `name`, `country_id`) VALUES('4', 'Jack', '2')"); mysqli_query($dbh, "INSERT INTO `person`(`id`, `name`, `country_id`) VALUES('5', 'Emily', '1')"); if(!mysqli_commit($dbh)){ mysqli_rollback($dbh); } ?>
mysqliの特徴
「手続き型」と「オブジェクト指向型」の記述が可能である。
サーバによってはインストールされていない事もしばしばあるようだ。ますます使わんぞ、コリャ=3・・・
命名
余計なお世話型関数。