MySQLi

MySQL関数を改良した形式のものでオブジェクト指向型と手続き型の2つの記述方法がある。

プリペアドステートメントやトランザクション処理が組み込まれている

サンプル(オブジェクト指向型)

プリペアド:ケース1
<?php
    // 接続
    $mysqli = new mysqli('localhost', 'root', '', 'testdb');
    if ($mysqli->connect_error) {
        die('Connect Error (' . $mysqli->connect_errno . ') '
                . $mysqli->connect_error);
    }
    echo "<pre>";var_dump($mysqli);echo "</pre>";
 
    /* プリペアドステートメントを作成します */
    $sql = "
        SELECT 
            col1
          , col2 
        FROM
            testtable1
        WHERE
            col1 = ?
    ";
    // バインドデータ設定
    $key = 1;
    if ($stmt = $mysqli->prepare($sql)) {
 
        /* マーカにパラメータをバインドします */
        $stmt->bind_param("i", $key);  // バインドする変数に設定して送る
 
        /* クエリを実行します */
        $stmt->execute();
 
        /* 結果変数をバインドします */
        $stmt->bind_result($col1, $col2);  // バインドする変数分設定
 
        /* 値を取得します */
        $stmt->fetch();
 
        printf("%s : %s\n", $col1, $col2);
 
        /* ステートメントを閉じます */
        $stmt->close();
    }
 
 
    // 切断
    $mysqli->close();
?>
 
 
プリペアド:ケース2(SQLのバインドパラメータが可変になる場合)
<?php
    // 接続
    $mysqli = new mysqli('localhost', 'root', '', 'testdb');
    if ($mysqli->connect_error) {
        die('Connect Error (' . $mysqli->connect_errno . ') '
                . $mysqli->connect_error);
    }
    echo "<pre>";var_dump($mysqli);echo "</pre>";
 
    /* プリペアドステートメントを作成します */
    $sql = "
        SELECT 
            col1
          , col2 
        FROM
            testtable1
        WHERE
            col1 in( ? , ? )
    ";
    // バインドデータ設定
    $keyList = array('ii', 1, 2);  // データ型で第1引数に設定する文字に注意
 
    if ($stmt = $mysqli->prepare($sql)) {
 
        /* マーカにパラメータをバインドします */
        call_user_func_array(array($stmt, 'bind_param'), refValues($keyList));  // 引数内容が可変の場合はcall_user_func_arrayを使用
 
        /* クエリを実行します */
        $stmt->execute();
 
        /* 結果変数をバインドします */
        $meta = $stmt->result_metadata();
        $parameters = array();
 
        // result_metadataで取得したフィールド名の配列エリアを取得してバインドすることに使用
        while ( $field = $meta->fetch_field() ) {
           $parameters[] = &$row[$field->name];
        }
        call_user_func_array(array($stmt, 'bind_result'), refValues($parameters));  // 引数内容が可変の場合はcall_user_func_arrayを使用
 
        /* 値を取得します */
        while ( $stmt->fetch() ) { 
           $x = array(); 
           foreach( $row as $key => $val ) { 
              $x[$key] = $val; 
           }
           echo "<hr />";
           var_dump($x);
        }
 
        printf("%s : %s\n", $col1, $col2);
 
        /* ステートメントを閉じます */
        $stmt->close();
    }
 
 
    // 切断
    $mysqli->close();
?>
<?php
/**
 * 配列の内容を参照形式で設定する
 */
    function refValues($arr){
        if (strnatcmp(phpversion(),'5.3') >= 0) //Reference is required for PHP 5.3+
        {
            $refs = array();
            foreach($arr as $key => $value)
                $refs[$key] = &$arr[$key];
            return $refs;
        }
        return $arr;
    }
 
?>
 
 

トランザクション
<?php
    // 接続
    $mysqli = new mysqli('localhost', 'root', '', 'testdb');
    if ($mysqli->connect_error) {
        die('Connect Error (' . $mysqli->connect_errno . ') '
                . $mysqli->connect_error);
    }
    echo "<pre>";var_dump($mysqli);echo "</pre>";
 
    // 自動コミットをFALSEに設定
    $mysqli->autocommit(FALSE);
 
    /* プリペアドステートメントを作成します */
    $sql = "
        INSERT INTO testtable1(
            col1
          , col2 
        ) values (
            ?
          , ?
        )
    ";
    // バインドデータ設定
    $keyList = array('is', 10, "xxxx");  // データ型で第1引数に設定する文字に注意
 
    if ($stmt = $mysqli->prepare($sql)) {
 
        /* マーカにパラメータをバインドします */
        call_user_func_array(array($stmt, 'bind_param'), refValues($keyList));  // 引数内容が可変の場合はcall_user_func_arrayを使用
 
        /* クエリを実行します */
        $stmt->execute();
 
        // 更新件数を表示
        printf("%d Row inserted.\n", $stmt->affected_rows);
 
        // ロールバック
        $mysqli->rollback();
 
        /* ステートメントを閉じます */
        $stmt->close();
    }
 
    // バインドデータ設定
    $keyList = array('is', 11, "vvvv");  // データ型で第1引数に設定する文字に注意
 
    if ($stmt = $mysqli->prepare($sql)) {
 
        /* マーカにパラメータをバインドします */
        call_user_func_array(array($stmt, 'bind_param'), refValues($keyList));  // 引数内容が可変の場合はcall_user_func_arrayを使用
 
        /* クエリを実行します */
        $stmt->execute();
 
        // 更新件数を表示
        printf("%d Row inserted.\n", $stmt->affected_rows);
 
        // コミット
        $mysqli->commit();
 
        /* ステートメントを閉じます */
        $stmt->close();
    }
 
 
    // 切断
    $mysqli->close();
?>
<?php
/**
 * 配列の内容を参照形式で設定する
 */
    function refValues($arr){
        if (strnatcmp(phpversion(),'5.3') >= 0) //Reference is required for PHP 5.3+
        {
            $refs = array();
            foreach($arr as $key => $value)
                $refs[$key] = &$arr[$key];
            return $refs;
        }
        return $arr;
    }
 
?>
 
 

サンプル(手続き型)

 


最終更新:2011年04月06日 16:23