@blog.justoneplanet.info

日々勉強

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・・・

命名

余計なお世話型関数。

コメントはまだありません»

No comments yet.

RSS feed for comments on this post.TrackBack URL

Leave a comment