PHP MySQL Improved Extension(mysqli)
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・・・
命名
余計なお世話型関数。
TrackBack URL :
Comments (0)