忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

PHP PDOStatement クラスの中で使うと思われるメソッド(closeCursor,errorInfo,fetchAll,rowCount)について


PDO クラスを使ったデータベースへの接続からテーブルレコード取得、及びデータレコードに対しての登録・更新・削除、さらにトランザクションについて、以下の記事で説明してきました。

PHP PDO(PHP Data Objects)クラスを使ったデータベースへのアクセスについて
PHP PDO(PHP Data Objects)クラスを使ったデータベースへのアクセス(登録、更新、削除)について
PHP PDO(PHP Data Objects)クラスを使ったトランザクションについて
PHP PDO(PHP Data Objects)クラスを使った「AUTO_INCREMENT」カラムの取得について

そこで、今回は PDOStatement クラスの中で使うと思われるメソッドについて説明します。




■PDOStatement::closeCursor — カーソルを閉じてステートメントを再実行できるようにする

カーソル とはデータ取得SQL(SELECT)を実行し、データをフェッチする時の位置を指し示すポインタの様な概念です。
closeCursor はその カーソル を廃棄し再度のSQL実行を有効とします。 以下にスクリプト例を示します。

<?php /* [pdo19.php] */
ob_start(function($buf){ return mb_convert_encoding($buf, 'SJIS', 'UTF-8'); });
//  MySQLデータベースに接続
$dsn      = "mysql:host=localhost;dbname=pdo;";
$user     = 'root';
$password = 'password';
try {
    //  PDOクラス生成(データベース接続)
    $pdo = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    //  エラー発生
    die('データベース接続ERROR:'.$e->getMessage()."\n");
}

//  全データ取得SQL
$sql = "select * from `tm_shohin` order by id";
//  SELECTクエリの準備
$pdostmt = $pdo->prepare($sql);
//  SELECTクエリの実行
$pdostmt->execute();
//  先頭のデータ取得
$result = $pdostmt->fetch();
//  2番目のデータ取得
$result = $pdostmt->fetch();
echo "id:".$result["id"]." name :".$result["name"]." price:".$result["price"]."\n";

//  カーソルクローズ
$pdostmt->closeCursor();

//  再度SELECTクエリの実行
$pdostmt->execute();
//  先頭のデータ取得
$result = $pdostmt->fetch();
echo "id:".$result["id"]." name :".$result["name"]." price:".$result["price"]."\n";

//  接続を閉じる
$pdo = null;
?>

これを実行すると以下の様に表示されます。 カーソルクローズ後、再度クエリ実行した時に、先頭からフェッチされるのがわかります。

C:\xampp\htdocs\_test>php pdo19.php
id:2 name :パソコン002 price:202000
id:1 name :パソコン001 price:100000
 



■PDOStatement::errorInfo — 文ハンドラにおける直近の操作に関連する拡張エラー情報を取得する

errorInfo メソッドは直前のSQL実行に対してのエラー情報を取得します。
エラー情報は以下の様に配列データ(指標:[0 ~ 2])として返されます。

  • 情報配列[0]: SQLSTATE エラーコード (これは、ANSI SQL 標準で定義された英数 5 文字の ID)
  • 情報配列[1]: ドライバ固有のエラーコード
  • 情報配列[2]: ドライバ固有のエラーメッセージ
<?php /* [pdo20.php] */
ob_start(function($buf){ return mb_convert_encoding($buf, 'SJIS', 'UTF-8'); });
//  MySQLデータベースに接続
$dsn      = "mysql:host=localhost;dbname=pdo;";
$user     = 'root';
$password = 'password';
try {
    //  PDOクラス生成(データベース接続)
    $pdo = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    //  エラー発生
    die('データベース接続ERROR:'.$e->getMessage()."\n");
}

//  全データ取得SQL:エラーがあるSQL
$sql = "select * from `tm_shohin` order by ";
//  SELECTクエリの準備
$pdostmt = $pdo->prepare($sql);
//  SELECTクエリの実行
$ret = $pdostmt->execute();
if ($ret === false) {
	//	実行でエラーが発生したので、エラー情報取得
    $arr = $pdostmt->errorInfo();
    print_r($arr);
}

//  接続を閉じる
$pdo = null;
?>

これを実行すると以下の様に表示されます。

C:\xampp\htdocs\_test>php pdo20.php
Array
(
    [0] => 42000
    [1] => 1064
    [2] => You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to us
e near '' at line 1
)
 



■PDOStatement::fetchAll — 全ての結果行を含む配列を返す

fetch メソッドは1行毎のデータを取得しますが、fetch メソッドは全ての結果行を配列で返します。

//	fetchメソッド定義
public PDOStatement::fetchAll([ int $fetch_style [, mixed $fetch_argument [, array $ctor_args = array() ]]]):array

$fetch_style    レコードを呼び出し元に返す方法を制御します。
                PDO::FETCH_* 定数のどれかで、デフォルトは  PDO::FETCH_BOTH です。 
$fetch_argument この引数は、fetch_style の値によって意味が異なります。
                PDO::FETCH_COLUMN: ここで指定した、 0 から始まる番号のカラムを返します。
                PDO::FETCH_CLASS:  ここで指定したクラスのインスタンスを返します。
                                   各行のカラムがクラスのプロパティ名にマッピングされます。
                PDO::FETCH_FUNC:   ここで指定した関数をコールした結果を返します。
                                   各行のカラムを関数コール時のパラメータとします。

$ctor_args      fetch_style が PDO::FETCH_CLASS のときに使う、独自のクラスコンストラクタへの引数。

返り値: 結果セットに残っている全ての行を含む配列を返します。
        取得結果がゼロ件だった場合は空の配列を返し、失敗した場合は FALSE を返します。 

以下にスクリプトの例を示します。

<?php /* [pdo21.php] */
ob_start(function($buf){ return mb_convert_encoding($buf, 'SJIS', 'UTF-8'); });
//  MySQLデータベースに接続
$dsn      = "mysql:host=localhost;dbname=pdo;";
$user     = 'root';
$password = 'password';
try {
    //  PDOクラス生成(データベース接続)
    $pdo = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    //  エラー発生
    die('データベース接続ERROR:'.$e->getMessage()."\n");
}

//  全データ取得SQL:エラーがあるSQL
$sql = "select * from `tm_shohin` order by id";
//  SELECTクエリの準備
$pdostmt = $pdo->prepare($sql);
//  SELECTクエリの実行
$pdostmt->execute();
//  全ての行を取得
$arr = $pdostmt->fetchAll();
print_r($arr);

//  接続を閉じる
$pdo = null;
?>

これを実行すると以下の様に表示されます。

C:\xampp\htdocs\_test>php pdo21.php
Array
(
    [0] => Array
        (
            [id] => 1
            [0] => 1
            [name] => パソコン001
            [1] => パソコン001
            [price] => 100000
            [2] => 100000
        )

    [1] => Array
        (
            [id] => 2
            [0] => 2
            [name] => パソコン002
            [1] => パソコン002
            [price] => 202000
            [2] => 202000
        )

    [2] => Array
        (
            [id] => 3
            [0] => 3
            [name] => パソコン003
            [1] => パソコン003
            [price] => 303000
            [2] => 303000
        )

    [3] => Array
        (
            [id] => 4
            [0] => 4
            [name] => プリンタ001
            [1] => プリンタ001
            [price] => 50000
            [2] => 50000
        )

)
 



■PDOStatement::rowCount — 直近の SQL ステートメントによって作用した行数を返す

rowCount メソッドは相当する PDOStatement オブジェクトによって実行された 直前の DELETE, INSERT, UPDATE 文によって作用した行数を返します。

尚、SELECT 文によって作用した行数を返さないので、別の方法が必要になります。 (取得するSELECT文をラップして「SELECT COUNT(*)...」するとかでしょうか)

<?php /* [pdo22.php] */
ob_start(function($buf){ return mb_convert_encoding($buf, 'SJIS', 'UTF-8'); });
//  MySQLデータベースに接続
$dsn      = "mysql:host=localhost;dbname=pdo;";
$user     = 'root';
$password = 'password';
try {
    //  PDOクラス生成(データベース接続)
    $pdo = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    //  エラー発生
    die('データベース接続ERROR:'.$e->getMessage()."\n");
}

//  レコード更新(UPDATE)SQL
$sql = "update `tm_shohin` set price = price * 1.1 where id >= :id1 and id <= :id2";
//  SQL文の準備
$pdostmt = $pdo->prepare($sql);
//  データ変数設定
$intId1 = 1;
$intId2 = 3;
//  データバインド
$pdostmt->bindValue(":id1", $intId1, PDO::PARAM_INT);
$pdostmt->bindValue(":id2", $intId2, PDO::PARAM_INT);
//  SQL文の実行
$ret = $pdostmt->execute();

//	実行行数の取得
$count = $pdostmt->rowCount();
echo "rowCount(): $count \n";

//  接続を閉じる
$pdo = null;
?>

これを実行すると以下の様に表示されます。

C:\xampp\htdocs\_test>php pdo22.php
rowCount(): 3
 













PR

コメント

コメントを書く