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
コメント