PHP データベースを利用したWebアプリケーションの開発【第二回】データの登録 insert
【第一回】ではデータベース接続部分をクラス化するところまで進みました。
今回は、会員情報を登録するフォームページとデータベースに会員情報登録の為のクラスファイルを作成します。
この記事の著者 ->S.E; です。
普段は、システム開発に必要なヒアリング、システムの要件定義、設計からプログラマとしてWebサイトやWebアプリケーションの開発、WordPressでのブログの執筆やサーバー運用・管理を行っています。
このページは「未経験の為のプログラミング講座 ゼロから始めるPHPプログラミング〜初級から実践編までを網羅〜」としてPHPの基本的な部分を【初級編】【中級編】【上級編】に分けて解説しています。最終的には簡単なフォームやシステム開発をフルスクラッチで行うことを目的としています。また、参考になる書籍なども紹介しています。
登録フォームをHTMLでコーディングする
それでは会員情報を登録するためのフォームページを作成します。
会員情報のテーブルの内容は下記になります。フォームから登録するのは
- 名前 = input type=”text”
- 年齢 = input type=”number”
- 性別 = input type=”radio”
- 電話番号 = input type=”number”
となります。それ以外の項目
- プライマリキー
- 登録日
- 更新日
- 削除キー
に関してはフォームページからの操作はできない仕様で開発します。
項目 | カラム名 | 内容 |
---|---|---|
プライマリキー | test_id | 個別のIDを自動連番で登録 |
名前 | test_name | ユーザーの名前 |
年齢 | test_age | ユーザーの年齢 |
性別 | test_gender | ユーザーの性別 1 or 2で登録(1 => 男性、2 => 女性) |
電話番号 | test_tel | ユーザーの電話番号 |
登録日 | test_create | yyyy-mm-dd hh:ii:ss形式で登録 |
更新日 | test_update | 更新時自動でyyyy-mm-dd hh:ii:ss形式で登録 |
削除キー | test_delete_key | 0 or 1を登録( 0 => 有効、1 => 削除) |
データ登録用edit.phpのコーディングとフォームの仕様
まず、edit.php ファイルを作成します。
会員情報登録用のフォームを用意し、name属性の値はテーブルのカラム名とします。
電話番号は「-(ハイフン)」の有無を統一するため入力エリアを3個用意しname属性の値は、test_tel01、test_tel02、test_tel03とします
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 | <!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> <p><input type="text" name="test_name" value=""></p> <h2>年齢</h2> <p><input type="number" name="test_age" value=""> 歳</p> <h2>性別</h2> <p> <label><input type="radio" name="test_gender" value="1"> 男性</label> <label><input type="radio" name="test_gender" value="2"> 女性</label> </p> <h2>電話番号</h2> <p><input type="number" name="test_tel01" value=""> - <input type="number" name="test_tel02" value=""> - <input type="number" name="test_tel03" value=""></p> <p><input type="submit" value="送信"></p> </form> </section> </body> </html> |
これでHTMLのコーディングは完了です。
会員情報登録用のクラスを作成する
次に、会員情報をデータベースに登録する際のプログラムのクラスファイル「class.Member.php」を作成します。クラス名は「Member」で先に作成している「class.DB.php」を継承して作成したいと思います。
1 2 3 4 5 6 7 8 9 10 | <?php // class.DBをインクルード include 'class.DB.php'; // DBクラスを継承しMemberクラスを作成 class Member extends DB{ } ?> |
DBクラスを継承するため「class.DB.php」をincludeします。
クラスを継承するには「extends クラス名」を記述します。クラスを継承することによって継承元(DBクラス)のクラスをインスタンスせずに継承先(Memberクラス)でメソッドやプロパティを利用することができます。
会員情報登録用のクエリを記述
次に、formからPOSTされた情報をデータベースに登録するためのメソッドを作成します。
まず、クラス内定数として入力エラーの文言を定義します。
次に、各inputから送信された情報を取得すセッターとセットした情報出力するゲッターのプロパティーとメソッドを用意します。
checkError() は入力された情報を確認し入力の漏れがないかをチェックするメソッドです。
insertDB() はセットされたデータをデータベースに登録するためのメソッドです。
DBクラスを継承しているのでデータベースへの接続は「parent::ConnectDB()」で完了します。接続後は、登録用のSQL文を用意します。
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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | <?php // class.DBをインクルード include 'class.DB.php'; // DBクラスを継承しMemberクラスを作成 class Member extends DB{ const ERROR_STR01 = '入力してください'; const ERROR_STR02 = '選択してください'; private $_test_name; private $_test_age; private $_test_gender; private $_test_tel; private $_test_tel01; private $_test_tel02; private $_test_tel03; public $_test_gender_arr = array( 1 => '男性', 2 => '女性' ); // セッターとゲッター public function setTestName( $val ){ $this->_test_name = $val; } public function getTestName(){ return $this->_test_name; } public function setTestAge( $val ){ $this->_test_age = $val; } public function getTestAge(){ return $this->_test_age; } public function setTestGender( $val ){ $this->_test_gender = $val; } public function getTestGender(){ return $this->_test_gender; } public function setTestTel( $val01, $val02, $val03){ if($val01 && $val02 && $val03) $this->_test_tel = $val01.'-'.$val02.'-'.$val03; else $this->_test_tel = ''; $this->_test_tel01 = $val01; $this->_test_tel02 = $val02; $this->_test_tel03 = $val03; } public function getTestTel(){ return $this->_test_tel; } public function getTestTel01(){ return $this->_test_tel01; } public function getTestTel02(){ return $this->_test_tel02; } public function getTestTel03(){ return $this->_test_tel03; } // 入力エラーチェック public function checkError(){ $error = array(); $error['error'] = false; $error['test_name'] = false; if( !self::getTestName() ) $error['error'] = $error['test_name'] = true; $error['test_age'] = false; if( self::getTestAge() == '' ) $error['error'] = $error['test_age'] = true; $error['test_gender'] = false; if( !self::getTestGender() ) $error['error'] = $error['test_gender'] = true; $error['test_tel'] = false; if( !self::getTestTel() ) $error['error'] = $error['test_tel'] = true; return $error; } public function insertDB(){ try{ $PDO = parent::ConnectDB(); $query = "INSERT INTO test_table ( "; $query .= " test_name "; $query2 = " :test_name "; $query .= ",test_age "; $query2 .= ",:test_age "; $query .= ",test_gender "; $query2 .= ",:test_gender "; $query .= ",test_tel "; $query2 .= ",:test_tel "; $query .= ",test_create "; $query2 .= ",now() "; $query .= ")VALUES( "; $query .= $query2; $query .= ") "; $stmt = $PDO->prepare($query); $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(); } } } ?> |
HTMLにスクリプトを埋め込む
edit.phpとclass.Member.phpができたので、edit.phpでプログラムが動作するようスクリプトを埋め込みます。
class.Member.phpをインクルードし、Memberクラスをインスタンスします。
フォームからデータが送信された時に各動作を行うので「$_SERVER[‘REQUEST_METHOD’] == ‘POST’」内に各種セッターなどを設定します。
checkError()で true ならデータ登録、 false ならエラー表示し再入力を促します。
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> |
データベースにデータを登録してみて
HTMLやPHPのスクリプトは比較的簡素に記述しましたが、処理はクラス内のメソッドに全て任せればフロントがではセットし結果のみ取得する流れとなり、コードが非常に簡素になり、メンテナンス性が増します。
S.E->お勧め記事;
- PHP フレームワーク Laravel ディレクティブ – ループ変数 $loop –
- PHPフレームワーク「Laravel」ディレクティブ-繰り返し処理(ループ処理)-
- PHPフレームワーク「Laravel」PHPテンプレートを利用する
- PHPフレームワーク「Laravel」MVCとコントローラを利用する
- PHPフレームワーク「Laravel」Bladeテンプレートを利用する
- PHPフレームワーク「Laravel」ディレクティブ-分岐処理(条件分岐)-
- XSERVERにSSHを利用してLaravel環境を構築する
- PHPフレームワーク「Laravel」ルーティング Route::get()
- macOS Monterey にアップデート後、composerやhomebrewでenv: php: No such file or directoryが出る