SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

PDOでサクサクDB開発

データベースへのアクセスを抽象化するPHP Data Objectの利用


  • X ポスト
  • このエントリーをはてなブックマークに追加

PDOStatementのその他のメソッド

 他のサンプルでも使用しているものがありますので、ここでは他のサンプルで紹介しきれていないメソッドについて説明します。

bindParam/bindValue/bindColumn

 bind系メソッドは前に紹介しましたが、もう少し詳しく見てみましょう。

bind
try {
    $pdo = CZ_PDO::getConnection();
    $stmt = $pdo->prepare(
"INSERT INTO CD(ID, TITLE, CONTENT) VALUES(:ID, :TITLE, :CONTENT)");
    $stmt->bindParam(":ID", $id, PDO::PARAM_INT);
    $stmt->bindParam(":TITLE", $title, PDO::PARAM_STR);
    $stmt->bindParam(":CONTENT", $content, PDO::PARAM_NULL);

    $id = 16;
    $title = "HEXDUMP";
    $content = "Hex Dump Music";
    $stmt->execute();

    $stmt = $pdo->prepare(
"INSERT INTO CD(ID, TITLE, CONTENT) VALUES(?, ?, ?)");
    $stmt->bindValue(1, 17, PDO::PARAM_INT);
    $stmt->bindValue(2, "", PDO::PARAM_STR);
    $stmt->bindValue(3, null, PDO::PARAM_NULL);
    $stmt->execute();

    echo "------------" . PHP_EOL;
    $stmt = null;

    $stmt = $pdo->prepare(
"SELECT ID, TITLE, CONTENT FROM CD WHERE ID > ?");
    $stmt->bindParam(1, $id);

    $id = 16;
    $stmt->execute();
    var_dump($stmt->fetch(PDO::FETCH_ASSOC));

    echo "------------" . PHP_EOL;
    $stmt = null;

    $stmt = $pdo->prepare(
    "SELECT ID, TITLE, CONTENT FROM CD WHERE ID > :ID");
    $stmt->bindValue(":ID", 15);
    $stmt->execute();
    var_dump($stmt->fetch(PDO::FETCH_ASSOC));

    echo "------------" . PHP_EOL;
    $stmt = null;

    $stmt = $pdo->prepare(
    "SELECT ID, TITLE, CONTENT FROM CD WHERE ID = 16");
    $stmt->execute();
    $stmt->bindColumn("ID", $id, PDO::PARAM_STR);
    $stmt->bindColumn("TITLE", $title, PDO::PARAM_INT);
    $stmt->bindColumn("CONTENT", $content, PDO::PARAM_NULL);
    $stmt->fetch();
    var_dump($id, $title, $content);

    echo "------------" . PHP_EOL;
    $stmt = null;

    $stmt = $pdo->prepare(
"SELECT id, title, content FROM CD WHERE ID = 17");
    $stmt->execute();
    $stmt->bindColumn(1, $id, PDO::PARAM_INT);
    $stmt->bindColumn(2, $title, PDO::PARAM_STR);
    $stmt->bindColumn(3, $content);
    $stmt->fetch();
    var_dump($id, $title, $content);

} catch (PDOException $e){
    var_dump($e->getMessage());
}

 bindを行うメソッドは第3引数にデータの型を指定することが可能です。

 バインドを行う際に空文字("")とPHPのNULLを扱うときは、この第3引数を正しく設定しておく必要があると言えます。バインドの値は第3引数の値で確定するので、間違ったデータを格納せずに済みます。

 また、SELECTした結果の値にも影響されるので、正しくデータを扱う際は必ず指定しましょう。

 上記の実行結果は以下です。

result
------------
array(3) {
    ["ID"]=>
    string(2) "17"
    ["TITLE"]=>
    string(0) ""
    ["CONTENT"]=>
    NULL
}
------------
array(3) {
    ["ID"]=>
    string(2) "16"
    ["TITLE"]=>
    string(7) "HEXDUMP"
    ["CONTENT"]=>
    NULL
}
------------
string(2) "16"
int(0)
NULL
------------
int(17)
string(0) ""
NULL

getColumnMeta

 PDOStatement::getColumnMetaは指定したカラムの詳細情報を取得することができます。以下にサンプルを示します。

columnMeta
try {
    $pdo = CZ_PDO::getConnection();

    $stmt = $pdo->query("SELECT * FROM CD");
    for($i = 0; $i < $stmt->columnCount(); $i++){
        var_dump($stmt->getColumnMeta($i));
    }
} catch (PDOException $e) {
    var_dump($e->getMessage());
}

 PDOStatement::getColumnMetaがサポートされていないドライバもあるので注意してください。以下はMySQLでの出力結果です。

result
array(6) {
    ["native_type"]=>
    string(4) "LONG"
    ["flags"]=>
    array(2) {
        [0]=>
        string(8) "not_null"
        [1]=>
        string(11) "primary_key"
    }
    ["name"]=>
    string(2) "ID"
    ["len"]=>
    int(11)
    ["precision"]=>
    int(0)
    ["pdo_type"]=>
    int(2)
}
array(6) {
    ["native_type"]=>
    string(10) "VAR_STRING"
    ["flags"]=>
    array(0) {
    }
    ["name"]=>
    string(5) "TITLE"
    ["len"]=>
    int(100)
    ["precision"]=>
    int(0)
    ["pdo_type"]=>
    int(2)
}
array(6) {
    ["native_type"]=>
    string(10) "VAR_STRING"
    ["flags"]=>
    array(0) {
    }
    ["name"]=>
    string(7) "CONTENT"
    ["len"]=>
    int(200)
    ["precision"]=>
    int(0)
    ["pdo_type"]=>
    int(2)
}

columnCount/rowCount

 PDOStatement::columnCountSELECT時のカラム数を返します。PDOStatement::rowCountUPDATEDELETE時の変更された行数を返します。

count
try {
    $pdo = CZ_PDO::getConnection();

    $stmt = $pdo->query("SELECT * FROM CD");
    var_dump($stmt->fetchObject());
    echo "column count: " . $stmt->columnCount() . PHP_EOL;
    echo "row count: " . $stmt->rowCount() . PHP_EOL;

    $stmt = null;
    $stmt = $pdo->query("DELETE FROM CD");
    echo "column count: " . $stmt->columnCount() . PHP_EOL;
    echo "row count: " . $stmt->rowCount() . PHP_EOL;
} catch (PDOException $e) {
    var_dump($e->getMessage());
}

 上記の実行結果は以下になります。

result
object(stdClass)#3 (3) {
    ["ID"]=>
    string(1) "1"
    ["TITLE"]=>
    string(5) "HAPPY"
    ["CONTENT"]=>
    string(10) "HAPPY SONG"
}
column count: 3
row count: 0
column count: 0
row count: 7

 次は、PDOで設定できる各オプション(設定項目)について説明します。

次のページ
PDOで設定できる属性(1/3)

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

ハタ(ハタ)

PHPの魅力に取り付かれた一人。現在はSeasar.PHPとしてSeasar(Java)をPHP5に移植する活動をしている。http://blog.xole.net/(ブログ)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/433 2007/12/13 16:05

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング