忍者ブログ

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

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

PHP PDO(PHP Data Objects)クラスを使ったデータベースへのアクセス(登録、更新、削除)について


PDO を使ったデータベースへの接続と、テーブルレコード取得を以下の記事で説明しました。
PHP PDO(PHP Data Objects)クラスを使ったデータベースへのアクセスについて

そこで、今回はデータレコードに対しての登録(INSERT)、更新(UPDATE)、削除(DELETE)について説明します。




■テーブルレコード登録(INSERT)の例

テーブルにレコード登録を行う場合 prepare メソッドでSQL文を作成し execute メソッドでSQL文を実行します。
今回のSQL文には バインドパラメータ が無いので prepare メソッドは引数無しで実行します。
尚、レコード登録の前後で全データの一覧を表示する関数「dispAll」を宣言しました。

<?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");
}

//  === 全データの取得・表示 ===
function dispAll($_pdo) {
    $sql = "select * from `tm_shohin` order by id"; //  全データ取得SQL
    $pdostmt = $_pdo->prepare($sql);                //  SELECTクエリの準備
    $pdostmt->execute();                            //  SELECTクエリの実行
    while ($result = $pdostmt->fetch()) {
        echo "id:".$result["id"]." name :".$result["name"]." price:".$result["price"]."\n";
    }
    echo "\n";
}

//  登録前の表示
dispAll($pdo);

//  レコード登録(INSERT)SQL
$sql = "insert into `tm_shohin` (id, name, price) VALUE (6, 'プリンタ003', 60000)";
//  SQL文の準備
$pdostmt = $pdo->prepare($sql);
//  SQL文の実行
$pdostmt->execute();    //  パラメータが無いので指定しない

//  登録後の表示
dispAll($pdo);

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

これを実行すると以下の様に表示されます。「id = 6」のレコードが追加されたのがわかります。

C:\xampp\htdocs\_test>php pdo6.php
id:1 name :パソコン001 price:100000
id:2 name :パソコン002 price:202000
id:3 name :パソコン003 price:303000
id:4 name :プリンタ001 price:50000
id:5 name :プリンタ002 price:150000

id:1 name :パソコン001 price:100000
id:2 name :パソコン002 price:202000
id:3 name :パソコン003 price:303000
id:4 name :プリンタ001 price:50000
id:5 name :プリンタ002 price:150000
id:6 name :プリンタ003 price:60000

「id = 6」のレコードが存在している状況で、再度レコード登録を行うと、どうなるのでしょうか。
以下のスクリプトを実行してみます。

<?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");
}

//  レコード登録(INSERT)SQL
$sql = "insert into `tm_shohin` (id, name, price) VALUE (6, 'プリンタ003', 60000)";
//  SQL文の準備
$pdostmt = $pdo->prepare($sql);
//  SQL文の実行
$ret = $pdostmt->execute();    //  返り値を変数で受ける
var_dump($ret);

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

これを実行すると以下の様に返り値が false で返されるのが分かります。
上記の登録が正常な場合には true が返されているはずです。 実際の処理においては、返り値で登録が正常または異常かを判断して、その後の処理を行う必要があります。

C:\xampp\htdocs\_test>php pdo7.php
bool(false)
 


上のスクリプトは固定のSQL文でしたが、以下に 名前付パラメータ を含むものしたスクリプトを記します。
1回の prepare で複数のデータ実行ができることが分かります。

<?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");
}

//  レコード登録(INSERT)SQL
$sql = "insert into `tm_shohin` (id, name, price) VALUE (:id, :name, :price)";
//  SQL文の準備
$pdostmt = $pdo->prepare($sql);
//  SQL文の実行(名前付パラメータのデータを配列で指定)
$ret = $pdostmt->execute(array(":id" => 7, ":name" => 'マウス001', ":price" => 3000));
//  準備済みのSQLを利用して別のデータで実行
$ret = $pdostmt->execute(array(":id" => 8, ":name" => 'マウス002', ":price" => 5000));

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

execute メソッドの引数に配列で設定するのではなく、以下の bindValue メソッドを使って各名前付パラメータに値を設定できます。

//	bindValueメソッド定義
public PDOStatement::bindValue ( mixed $parameter , mixed $value [, int $data_type = PDO::PARAM_STR ] ) : bool

$parameter  パラメータ ID。
            名前付パラメータを使用するプリペアドステートメントの場合は、:name 形式のパラメータ名となります。
            疑問符パラメータを使用するプリペアドステートメントの場合は、1 から始まるパラメータの位置となります。
            実行される SQL 文の中のバインドパラメータと同数の要素からなる、値の配列。
$value      パラメータにバインドする値。
$data_type  パラメータに対して PDO::PARAM_* 定数 を使った明示的なデータ型を指定します。

返り値:  成功した場合に TRUE を、失敗した場合に FALSE を返します。 

bindValue メソッドを使ってデータ登録を行うスクリプトを記します。

<?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");
}

//  レコード登録(INSERT)SQL
$sql = "insert into `tm_shohin` (id, name, price) VALUE (:id, :name, :price)";
//  SQL文の準備
$pdostmt = $pdo->prepare($sql);
//  データ変数設定
$intId    = 9;
$strName  = "マウス003";
$intPrice = 7000;
//  データバインド
$pdostmt->bindValue(":id"   , $intId   , PDO::PARAM_INT);
$pdostmt->bindValue(":name" , $strName , PDO::PARAM_STR);
$pdostmt->bindValue(":price", $intPrice, PDO::PARAM_INT);
//  SQL文の実行
$ret = $pdostmt->execute();

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



■テーブルレコード更新(UPDATE)の例

レコートの登録(追加)が一通り終わりましたので、更新に付いて記します。
更新の場合も、登録と同様にSQL文を prepare メソッドで準備し bindValue メソッドを使って名前付パラメータに値を設定後、 execute メソッドでSQLの実行を行います。
以下の更新処理は、「id」が「1」~「3」の「price」を1.1倍にします。

<?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");
}

//  === 全データの取得・表示 ===
function dispAll($_pdo) {
    $sql = "select * from `tm_shohin` order by id"; //  全データ取得SQL
    $pdostmt = $_pdo->prepare($sql);                //  SELECTクエリの準備
    $pdostmt->execute();                            //  SELECTクエリの実行
    while ($result = $pdostmt->fetch()) {
        echo "id:".$result["id"]." name :".$result["name"]." price:".$result["price"]."\n";
    }
    echo "\n";
}

//  更新前の表示
dispAll($pdo);

//  レコード更新(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();

//  更新後の表示
dispAll($pdo);

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

これを実行すると以下の様に表示されます。「id」が「1」~「3」の「price」が1.1倍になったのがわかります。

C:\xampp\htdocs\_test>php pdo10.php
id:1 name :パソコン001 price:100000
id:2 name :パソコン002 price:202000
id:3 name :パソコン003 price:303000
id:4 name :プリンタ001 price:50000
id:5 name :プリンタ002 price:150000
id:6 name :プリンタ003 price:60000
id:7 name :マウス001 price:3000
id:8 name :マウス002 price:5000
id:9 name :マウス003 price:7000

id:1 name :パソコン001 price:110000
id:2 name :パソコン002 price:222200
id:3 name :パソコン003 price:333300
id:4 name :プリンタ001 price:50000
id:5 name :プリンタ002 price:150000
id:6 name :プリンタ003 price:60000
id:7 name :マウス001 price:3000
id:8 name :マウス002 price:5000
id:9 name :マウス003 price:7000



■テーブルレコード削除(DELETE)の例

prepare メソッドで削除SQLを準備し bindValue メソッドを使って名前付パラメータに値を設定後、 execute メソッドで削除の実行を行います。

<?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");
}

//  === 全データの取得・表示 ===
function dispAll($_pdo) {
    $sql = "select * from `tm_shohin` order by id"; //  全データ取得SQL
    $pdostmt = $_pdo->prepare($sql);                //  SELECTクエリの準備
    $pdostmt->execute();                            //  SELECTクエリの実行
    while ($result = $pdostmt->fetch()) {
        echo "id:".$result["id"]." name :".$result["name"]." price:".$result["price"]."\n";
    }
    echo "\n";
}

//  削除前の表示
dispAll($pdo);

//  レコード削除(UPDATE)SQL
$sql = "delete from `tm_shohin` where id between :id1 and :id2";
//  SQL文の準備
$pdostmt = $pdo->prepare($sql);
//  データ変数設定
$intId1 = 7;
$intId2 = 9;
//  データバインド
$pdostmt->bindValue(":id1", $intId1, PDO::PARAM_INT);
$pdostmt->bindValue(":id2", $intId2, PDO::PARAM_INT);
//  SQL文の実行
$ret = $pdostmt->execute();

//  削除後の表示
dispAll($pdo);

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

これを実行すると以下の様に表示されます。「id 」の「7」~「9」のレコードが削除されたのがわかります。

C:\xampp\htdocs\_test>php pdo11.php
id:1 name :パソコン001 price:110000
id:2 name :パソコン002 price:222200
id:3 name :パソコン003 price:333300
id:4 name :プリンタ001 price:50000
id:5 name :プリンタ002 price:150000
id:6 name :プリンタ003 price:60000
id:7 name :マウス001 price:3000
id:8 name :マウス002 price:5000
id:9 name :マウス003 price:7000

id:1 name :パソコン001 price:110000
id:2 name :パソコン002 price:222200
id:3 name :パソコン003 price:333300
id:4 name :プリンタ001 price:50000
id:5 name :プリンタ002 price:150000
id:6 name :プリンタ003 price:60000
 













PR

コメント

コメントを書く