PHP データベースを利用したWebアプリケーションの開発【第四回】データの更新 update

前回、登録した情報一覧ページを作成しました。
今回は、一覧ページに設置した「詳細・更新」からedit.phpに遷移し会員情報の内容を更新するためのプログラムを開発します。

この記事の著者 ->S.E; です。
普段は、システム開発に必要なヒアリング、システムの要件定義、設計からプログラマとしてWebサイトやWebアプリケーションの開発、WordPressでのブログの執筆やサーバー運用・管理を行っています。
このページは「未経験の為のプログラミング講座 ゼロから始めるPHPプログラミング〜初級から実践編までを網羅〜」としてPHPの基本的な部分を【初級編】【中級編】【上級編】に分けて解説しています。最終的には簡単なフォームやシステム開発をフルスクラッチで行うことを目的としています。また、参考になる書籍なども紹介しています。
会員情報登録ページ「edit.php」を編集する
以前、会員情報登録のために作成した「edit.php」を利用し、更新の機能を実装します。
更新用のページを別途作成する方法もありますが、内容がほぼ同じなのでメンテナンス性も考慮し同じページを使い回したいと思います。
前回作成した「edit.php」のソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | <?php include 'class.Member.php'; $Member = new Member(); // エラー初期化 $error = array(); if( $_SERVER['REQUEST_METHOD'] == 'POST' ){ $Member->setTestName($_POST['test_name']); $Member->setTestAge($_POST['test_age']); $Member->setTestGender($_POST['test_gender']); $Member->setTestTel($_POST['test_tel01'],$_POST['test_tel02'],$_POST['test_tel03']); $error = $Member->checkError(); // 入力エラーがない場合 if( !$error['error'] ){ if( $Member->insertDB() ){ echo '登録が完了しました'; exit(); } else{ echo '登録に失敗しました'; exit(); } } } ?><!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>会員情報登録</title> </head> <body> <header> <h1>会員情報登録</h1> </header> <section> <form action="./edit.php" method="post"> <h2>会員名</h2> <?php if($error['test_name']) echo $Member::ERROR_STR01;?> <p><input type="text" name="test_name" value="<?php echo htmlspecialchars($Member->getTestName());?>"></p> <h2>年齢</h2> <?php if($error['test_age']) echo $Member::ERROR_STR01;?> <p><input type="number" name="test_age" value="<?php echo htmlspecialchars($Member->getTestAge());?>"> 歳</p> <h2>性別</h2> <?php if($error['test_gender']) echo $Member::ERROR_STR02;?> <p> <label><input type="radio" name="test_gender" value="1"<?php if($Member->getTestGender() == 1) echo ' checked="checked"';?>> 男性</label> <label><input type="radio" name="test_gender" value="2"<?php if($Member->getTestGender() == 2) echo ' checked="checked"';?>> 女性</label> </p> <h2>電話番号</h2> <?php if($error['test_tel']) echo $Member::ERROR_STR01;?> <p><input type="number" name="test_tel01" value="<?php echo htmlspecialchars($Member->getTestTel01());?>"> - <input type="number" name="test_tel02" value="<?php echo htmlspecialchars($Member->getTestTel02());?>"> - <input type="number" name="test_tel03" value="<?php echo htmlspecialchars($Member->getTestTel03());?>"></p> <p><input type="submit" value="送信"></p> </form> </section> </body> </html> |
一覧からIDを受け取り更新機能の処理を追加する
では、以前の「edit.php」に更新機能を追加します。
まず、一覧からIDを受け取り、そのIDから情報を取得するスクリプトを追加します。
$_GET[‘id’] でIDが送信されるので、受け取ったIDを セッター setTestID() にセットします。
IDをセットしたら getData() で、情報を取得し $memberData に格納します。
後は、各フォームに取得した情報を配置するためにセッターを利用しセットして完了です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <?php 〜省略〜 if( isset( $_GET['id'] ) ){ // 取得したIDをセット $Member->setTestID( $_GET['id']); // セットしたIDの情報を取得 $memberData = $Member->getData(); $Member->setTestName($memberData['test_name'][0]); $Member->setTestAge($memberData['test_age'][0]); $Member->setTestGender($memberData['test_gender'][0]); $Member->setTestTel($memberData['test_tel01'][0],$memberData['test_tel02'][0],$memberData['test_tel03'][0]); } ?> |
class.Member.phpに新しいメソッド、プロパティを追加
上記で利用した、setTestID() はまだ作成していないので「class.Member.php」に追記します。
また、IDをセットしgetData()で指定のIDの情報を取得する部分も追記します。
注意点としては setTestID() でIDをセットした場合、SELECT文に if( getTestID() ){〜}を記述し全件取得か1件取得かを条件分岐させるところです。
また、電話番号のセッター setTestTelはハイフンなしの番号3種を引数として渡すので、SELECT文で取得した電話番号をexplode()を利用し、あらかじめ分割しておきます。
explode()とは
explode関数は、指定の文字列で、元の文字列を分割するための関数です。
今回の場合は「000-1111-2222」の文字列を「–」で分割します。
$_data = explode( ‘-‘, ‘000-1111-2222’ ) の場合は分割された文字列が配列で返されます。
$_data[0] = 000、$_data[1] = 1111、$_data[2] = 2222 となります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | <?php // class.DBをインクルード include 'class.DB.php'; // DBクラスを継承しMemberクラスを作成 class Member extends DB{ private $_test_id; 〜省略〜 // セッターとゲッター public function setTestID( $val ){ $this->_test_id = $val; } public function getTestID(){ return $this->_test_id; } 〜省略〜 public function getData(){ try{ $PDO = parent::ConnectDB(); $query = "SELECT "; $query .= " test_id "; $query .= ",test_name "; $query .= ",test_age "; $query .= ",test_gender "; $query .= ",test_tel "; $query .= ",test_create "; $query .= ",test_update "; $query .= "FROM "; $query .= "test_table "; $query .= "WHERE "; $query .= "test_delete_key != 1 "; if( self::getTestID() ) $query .= "AND test_id = :test_id "; $stmt = $PDO->prepare($query); if( self::getTestID() ) $stmt->bindValue(':test_id', self::getTestID(), PDO::PARAM_INT); $stmt->execute(); while( $row = $stmt->fetch(PDO::FETCH_ASSOC) ) { $row = self::stripSlashesArray($row); $tmp = self::htmlSpecialCharsArray($row); $data['test_id'][] = $tmp['test_id']; $data['test_name'][] = $tmp['test_name']; $data['test_age'][] = $tmp['test_age']; $data['test_gender'][] = $tmp['test_gender']; $data['test_tel'][] = $tmp['test_tel']; $_tel_arr = explode('-',$tmp['test_tel']); $data['test_tel01'][] = $_tel_arr[0]; $data['test_tel02'][] = $_tel_arr[1]; $data['test_tel03'][] = $_tel_arr[2]; $data['test_create'][] = $tmp['test_create']; $data['test_update'][] = $tmp['test_update']; } $data['rows'] = $stmt->rowCount(); return $data; } catch( Exception $e ){ echo $e->getMessage(); exit(); } } 〜省略〜 ?> |
更新用のメソッドを追記
では更新用のメソッドを「class.Member.php」に追記します。
UPDATE文を利用し、更新するためのIDをWHERE句で指定すれば完了です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | public function updateDB(){ try{ $PDO = parent::ConnectDB(); $query = "UPDATE test_table SET "; $query .= " test_name = :test_name "; $query .= ",test_age = :test_age "; $query .= ",test_gender = :test_gender "; $query .= ",test_tel = :test_tel "; $query .= "WHERE "; $query .= "test_id = :test_id "; $stmt = $PDO->prepare($query); $stmt->bindValue(':test_id', self::getTestID(), PDO::PARAM_INT); $stmt->bindValue(':test_name', self::getTestName(), PDO::PARAM_STR); $stmt->bindValue(':test_age', self::getTestAge(), PDO::PARAM_INT); $stmt->bindValue(':test_gender', self::getTestGender(), PDO::PARAM_INT); $stmt->bindValue(':test_tel', self::getTestTel(), PDO::PARAM_STR); $stmt->execute(); return true; } catch( Exception $e ){ echo $e->getMessage(); exit(); } } |
更新のためのプログラムを埋め込む
更新用のメソッドが完成したので、「edit.php」に埋め込みます。
注意点としては、更新時も入力エラーの確認を行いかつ、IDがある場合は更新(updateDB)、IDがない場合は新規登録(insertDB)を実行する条件分岐です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | <?php include 'class.Member.php'; $Member = new Member(); // エラー初期化 $error = array(); if( $_SERVER['REQUEST_METHOD'] == 'POST' ){ $Member->setTestID($_POST['test_id']); $Member->setTestName($_POST['test_name']); $Member->setTestAge($_POST['test_age']); $Member->setTestGender($_POST['test_gender']); $Member->setTestTel($_POST['test_tel01'],$_POST['test_tel02'],$_POST['test_tel03']); $error = $Member->checkError(); // 入力エラーがない場合 if( !$error['error'] ){ if( $Member->getTestID() ){ if( $Member->updateDB() ){ echo '更新が完了しました'; exit(); } else{ echo '更新に失敗しました'; exit(); } } else{ if( $Member->insertDB() ){ echo '登録が完了しました'; exit(); } else{ echo '登録に失敗しました'; exit(); } } } } 〜省略〜 ?> 〜省略〜 |
データの更新を開発してみて
データの登録とほぼ同様の処理を行い、UPDATEとWHERE句で指定の情報を上書きする処理なので、登録用のページを流用することをお勧めします。
登録と更新で多少の違いがある場合などは条件分岐などを記述し振り分ければほぼほぼ同じソースを使いまわせるので修正時が非常に楽になります。
また、今回は更新完了後、メッセージを出して終了(exit)しますが、一覧に戻るように記述することもできます。
S.E->お勧め記事;
- PHPフレームワーク「Laravel」ディレクティブ-繰り返し処理(ループ処理)-
- PHP フレームワーク Laravel ディレクティブ – ループ変数 $loop –
- XSERVERにSSHを利用してLaravel環境を構築する
- PHPフレームワーク「Laravel」PHPテンプレートを利用する
- PHPフレームワーク「Laravel」MVCとコントローラを利用する
- PHPフレームワーク「Laravel」ディレクティブ-分岐処理(条件分岐)-
- macOS Monterey にアップデート後、composerやhomebrewでenv: php: No such file or directoryが出る
- PHPフレームワーク「Laravel」Bladeテンプレートを利用する
- PHPフレームワーク「Laravel」ルーティング Route::get()
S.E->PR;
チームのタスク管理ツール【backlog】
FREENANCE(フリーナンス)
S.E->Weekly Ranking;
S.E->プロフィール;

