前回からの続きで、「UserテーブルのCRUD」のC(Create)の「プログラムコードと解説」の章についての掲載です。
掲載する内容は次の3つで、今回は3について掲載し、1と2については前回掲載しました。
- 画面の紹介(メニュー画面~新規作成画面)
- POSTリクエストの授受の方法
- プログラムコードと解説(今回掲載)
3. プログラムコードと解説
まず、最初に全体の構成を概観します。
をユーザーデータの「新規作成」機能の全体の構成を図にしました。

上記の構成を簡単に説明します。
- UserTestEntry.php
ブラウザのURLで指定されたスクリプトファイルです。
UserTestControllerクラス(2.)のインスタンスを作成し、run()メソッドを呼び出します。
コード掲載はこちら - UserTestController.php
「UserデータのCRUD」ページ(3.UserTestMenuView.html)の表示と当ページから送出されたリクエストの処理を行うコントローラークラスです。
1.で呼び出されたrun()メソッドでは「UserデータのCRUD」ページ(3.UserTestMenuView.html)へリダイレクトします。
「UserデータのCRUD」ページから送出されたPOSTリクエストは、handleRequest()メソッドで処理します。
当メソッドにおいてPOSTリクエストが「新規作成」と判定された場合、「Userデータの新規作成」ページ(5.UserTestCreateView.html)へリダイレクトします。
コード掲載はこちら - UserTestMenuView.html
2.のrun()メソッド内で呼び出される「UserデータのCRUD」ページです。
当ページで「新規作成」「更新」「削除」「照会」のいずれかのボタンが選択されると、Fromタグの送信先に指定されたUserTestReceiveRequest.php(4.)にリクエストが送信されます。
コード掲載はこちら - UserTestReceiveRequest.php
UserTestControllerクラス(2)のインスタンスを作成し、handleRequest()メソッドを呼び出します。
コード掲載はこちら - UserTestCreateView.html
「Userデータの新規作成」ページです。
ユーザーデータ入力後[登録]ボタンが押されると、入力チェックを行い、エラーがなければFromタグの送信先に指定されたUserTestCreateController.php(6.)にリクエストが送信されます。
入力エラーがある場合、エラーメッセージを表示し、リクエストの送信はしません。
コード掲載はこちら - UserTestCreateController.php
「Userデータの新規作成」ページ(5.UserTestCreateView.html)から送出されたリクエストの処理を行うコントローラークラスです。
また、UserTestCreateControllerクラスのインスタンスを作成し、handleRequest()メソッドを呼び出します。
当メソッド内でPDOModelインスタンス(7.)のinsert_user()メソッドを呼出し、入力データをUserテーブルに登録します。
コード掲載はこちら - PDOModel.php
データベースの接続やSQL文の発行を行うモデルクラスです。
コード掲載はこちら
コードの掲載
UserTestEntry.php
<?php
/*************************************************
* Enty point
* ブラウザからhttp://****.****.xdomain.jp/UserTestEntry.php
* で呼ばれる最初の起動プログラム
* コントローラー(PagingTestController.PHP)のrunメソッドを呼び出します
*/
require_once( __DIR__ . '/UserTestController.php');
$controller = new UserTestController();
$controller->run();
exit;
?>
UserTestController.php
<?php
/**
* Description of UserTestController
* UserデータCRUDのメニュー画面に対するコントローラーの役割
*
*/
class UserTestController{
//コンストラクター
public function __construct() {
}
/******************************************************
* 当メソッドはUserTestEntry.phpから呼ばれます
* UserデータCRUDのメニュー画面を表示します
*****************************************************/
public function run() {
header('Location: UserTestMenuView.html'); //UserデータCRUDのメニュー画面ページ(UserTestMenuView.html)へリダイレクトします
exit();
}
/******************************************************
* 当メソッドはUserTestRecieveRequest.phpから呼ばれます
* UserデータCRUDのメニュー画面で
* [新規作成]、[更新]、[削除]、[照会]、[戻る]ボタンが選択された時の
* POSTリクエストの処理を行います
*****************************************************/
public function handleRequest() {
//「戻る」ボタンのPOSTリクエストの処理
if (isset($_POST['back']) && $_POST['back'] == "戻る") {
//メニューページ(UserTestMenuView.php)へリダイレクトします
header('Location: UserTestMenuView.php');
//「新規作成」ボタンのPOSTリクエストの処理
} elseif (isset($_POST['create']) && $_POST['create'] == "新規作成") {
//Userデータ新規作成ページ(UserTestCreateView.html)へリダイレクトします
header('Location: UserTestCreateView.html');
//「次ページ」ボタンのPOSTリクエストの処理
} elseif (isset($_POST['next']) && $_POST['next'] == "次ページ≫") {
//次ページのページング情報を算出し、その情報を得ます
$this->paging_info = $this->paging_model->next($this->paging_info);
//次ページングのページング情報をセッションに保管します
$this->session_model->set_paging_info($this->paging_info);
//Userデータ表示ページ(PagingTestView.php)へリダイレクトします
header('Location: PagingTestView.php');
}
}
}
?>
UserTestMenuView.html
<HTML>
<HEAD>
<!-- スタイルシートのパス -->
<LINK REL="stylesheet" TYPE="text/css" HREF="style_menu.css">
<TITLE>{$title}</TITLE>
</HEAD>
<meta charset="utf-8">
<BODY>
<DIV CLASS="main">
<H1>UserテーブルのCRUD</H1>
<form action="UserTestReceiveRequest.php" method="post">
<table>
<tr>
<td></td>
<td><input type="submit" name="create" value="新規作成"></td>
<td></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="update" value="更 新"></td>
<td></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="delete" value="削 除"></td>
<td></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="reference" value="照 会"></td>
<td></td>
</tr>
<tr>
<td></td>
<td><input type="submit" name="end" value="終 了"></td>
<td></td>
</tr>
</table>
</form>
</DIV>
</BODY>
</HTML>
UserTestReceiveRequest.php
<?php
/*************************************************
* UserTestView.phpのPOSTリクエストを受取り、
* コントローラー(UserTestController.php)の
* handleRequest()メソッドを呼び出します
*/
require_once __DIR__ . '/UserTestController.php';
$controller = new UserTestController();
$controller->handleRequest();
exit;
?>
UserTestCreateView.html
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="style_Create.css">
<title>userデータの新規作成</title>
</head>
<body>
<div class="main">
<h1>userデータの新規作成</h1>
<form id="form" name="form" method="post" action="UserTestCreateController.php" onsubmit="return InputCheck(event)">
<table class="maxwidth">
<tr>
<td class="label">User ID</td>
<td>
<input type="text" name="userid" size="20">
<span id="UserIDErrorMessage" class="error" style="display: none;"></span>
</td>
</tr>
<tr><td colspan="3"><p></p></td></tr>
<tr><td colspan="3"><p></p></td></tr>
<tr>
<td class="label">パスワード</td>
<td>
<input type="text" name="password" size="20">
<span id="PasswordErrorMessage" class="error" style="display: none;"></span>
</td>
</tr>
<tr><td colspan="3"><p></p></td></tr>
<tr><td colspan="3"><p></p></td></tr>
<tr>
<td class="label">名 前</td>
<td>
<input type="text" name="name" size="40">
<span id="NameErrorMessage" class="error" style="display: none;"></span>
</td>
</tr>
</table>
<p></p>
<table id="button_erea">
<tr>
<td style="text-align: center"><input type="submit" name="create" value="登 録"></td>
<td style="text-align: center"><input type="submit" name="cancel" value="取消し"></td>
<td style="text-align: center"><input type="submit" name="back" value="戻 る"></td>
</tr>
</table>
</form>
</div>
</body>
<!-- 入力チェックのスクリプト -->
<script type="text/javascript">
function InputCheck(event) {
// 送信されたボタンの名前を取得
var submitButton = event.submitter.name;
// 「save」ボタンでない場合は桁数チェックをスキップ
if (submitButton !== "create") {
return true;
}
// 入力フィールドを取得
var userId = document.forms["form"]["userid"].value;
var password = document.forms["form"]["password"].value;
var name = document.forms["form"]["name"].value;
// エラーメッセージ表示領域を取得
var userIdError = document.getElementById("UserIDErrorMessage");
var passwordError = document.getElementById("PasswordErrorMessage");
var nameError = document.getElementById("NameErrorMessage");
// エラーメッセージをリセット
userIdError.style.display = "none";
passwordError.style.display = "none";
nameError.style.display = "none";
// User IDの入力チェック
var isValid = true;
if (userId.length < 5 || userId.length > 20) {
userIdError.innerText = "User IDは5桁以上20桁以内でなければなりません";
userIdError.style.display = "inline";
isValid = false;
}
// パスワードの入力チェック
if (password.length < 8 || password.length > 16) {
passwordError.innerText = "パスワードは8桁以上16桁以内でなければなりません";
passwordError.style.display = "inline";
isValid = false;
}
// 名前の入力チェック
if (name.length < 1 || name.length > 40) {
nameError.innerText = "名前は1桁以上40桁以内でなければなりません";
nameError.style.display = "inline";
isValid = false;
}
// フォームを送信しない
return isValid;
}
</script>
</html>
UserTestCreateController.php
<?php
/**
* Description of UserTestCreateController
* Userテーブルの新規作成画面に対するコントローラーの役割
*/
class UserTestCreateController{
// クラス変数を定義します
private $insert_user_data = []; // インサートする値を保持する連想配列
private $pdo_model; // PDOModelのインスタンスを保持
// コンストラクター
public function __construct() {
require_once(__DIR__ . '/PDOModel.php');
// Modelクラスのインスタンスを生成します
$this->pdo_model = new PDOModel();
}
/******************************************************
* 当メソッドはUserTestCreateView.htmlから呼ばれます
* [新規作成]、[取消し]、[戻る]ボタンが選択された時の
* POSTリクエストの処理を行います
*****************************************************/
public function handleRequest() {
// 「登録」ボタンのPOSTリクエストの処理
if (isset($_POST['create']) && $_POST['create'] == "登 録") {
// 画面入力の値を連想配列にセット
$insert_user_data = array(
'UID' => htmlspecialchars($_POST['userid'], ENT_QUOTES),
'password' => htmlspecialchars($_POST['password'], ENT_QUOTES),
'name' => htmlspecialchars($_POST['name'], ENT_QUOTES)
);
$this->pdo_model->db_connect(); // データベースに接続します
$this->pdo_model->insert_user($insert_user_data); // 画面入力の値をUserテーブルにインサート
// Userデータ表示ページ(UserTestCreateView.html)へリダイレクトします
header('Location: UserTestCreateView.html');
// 「取消し」ボタンのPOSTリクエストの処理
} elseif (isset($_POST['cancel']) && $_POST['cancel'] == "取消し") {
// Userデータ新規作成ページ(UserTestCreateView.html)へリダイレクトします
header('Location: UserTestCreateView.html');
// 「戻る」ボタンのPOSTリクエストの処理
} elseif (isset($_POST['back']) && $_POST['back'] == "戻 る") {
// メニューページ(UserTestMenuView.html)へリダイレクトします
header('Location: UserTestMenuView.html');
}
}
}
// コントローラーのインスタンスを作成し、handleRequestメソッドを呼び出す
/********************************************************
* クラスの外に記述されたコードは、PHPスクリプトが実行された際に
* コントローラーのインスタンスを作成し、
* リクエストの処理を行うためのメソッドを呼び出すためのものです。
* これにより、フォームのPOSTリクエストが適切に処理され、
* ユーザーが行ったアクションに応じて必要な処理が実行されます。
*********************************************************/
$controller = new UserTestCreateController();
$controller->handleRequest();
?>
PDOModel.php
<?php
/**
* Description of PDOModel
* データベースに係る処理を受け持つクラスです
*/
class PDOModel {
//クラス変数を定義します
protected $pdo; //PDOライブラリアプリのインスタンスを保持
protected $host; //ホスト情報
protected $dbname; //データベース名
protected $dbusr; //データベース接続ユーザー名
protected $dbpass; //データベース接続パスワード
protected $table_data = []; //userテーブルデータを保持する配列
//*****************************************************
// コンストラクター
//*****************************************************
public function __construct() {
// データベース接続情報を変数にセットします
$this->host = '****.***.xdomain.ne.jp';
$this->dbname = '****_receipt';
$this->dbusr = '********_kr';
$this->dbpass = '********';
}
//*****************************************************
// DB接続処理
//*****************************************************
public function db_connect() {
// DB接続処理
try {
$this->pdo = new PDO("mysql:host={$this->host};dbname={$this->dbname};charset=utf8", $this->dbusr, $this->dbpass);
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
} catch(PDOException $Exception) {
die('DB Connect Error: ' . $Exception->getMessage());
}
return;
}
//*****************************************************
// userテーブルへselect文発行
// 下記select文はuserテーブルからAI_Userの値が0~200のデータを取り出します
//*****************************************************
public function select_usertable() {
// select文を生成して実行します
try {
$sql= "SELECT * FROM user WHERE AI_User BETWEEN :AIFrom AND :AITo";
$stmh = $this->pdo->prepare($sql);
$stmh->bindValue(':AIFrom', 0, PDO::PARAM_INT);
$stmh->bindValue(':AITo', 200, PDO::PARAM_INT);
$stmh->execute(); //select文を実行します
// select文で抽出したデータを1行ずつ取出して$table_data[]にセットします
while($row = $stmh->fetch(PDO::FETCH_ASSOC)) {
$this->table_data[] = $row;
}
} catch (PDOException $Exception) {
die('DB select Error: ' . $Exception->getMessage());
}
// テーブルデータの配列($table_data[])を返します
return $this->table_data;
}
//*****************************************************
// Userデータインサート処理
//*****************************************************
public function insert_user($insert_user_data){
try {
$this->pdo->beginTransaction(); // トランザクション開始
$sql = "INSERT INTO user
(UID, password, name)
VALUES
(:UID, :password, :name)";
$stmh = $this->pdo->prepare($sql); // SQL文を解析し、準備ステートメントオブジェクト(PDOStatement)を生成
// インサートする値を紐づけ
$stmh->bindValue(':UID', $insert_user_data['UID'], PDO::PARAM_STR);
$stmh->bindValue(':password', $insert_user_data['password'], PDO::PARAM_STR);
$stmh->bindValue(':name', $insert_user_data['name'], PDO::PARAM_STR);
$stmh->execute(); // insert文を実行
$this->pdo->commit(); // コミット
return true;
} catch (PDOException $Exception) {
$this->pdo->rollBack();
print "エラー:" . $Exception->getMessage();
return false;
}
}
}
?>
スタイルシート(cssファイル)の掲載は省略しました。
CRUDのC(Create – データの新規作成)は、今回で完結とします。
次回はCRUDのR(Read – データの読み取り)を掲載する予定です。