- [PHP] 商品管理データベース
[PHP] 商品管理データベース
商品登録データベースを作成します。
【機能】
- 認証(ログイン・ログアウト)機能
- 登録商品一覧画面
- 新規商品登録
- 登録内容修正
- 登録商品削除
【作業・確認事項】
[作業の流れ]
1. テーブル作成(phpMyAdmin)
1-1. usersテーブル作成
1-2. itemsテーブル作成
2. 画面遷移を作成 → HTML/PHPファイル作成
2-1. トップページ作成(index.html)
2-2. 環境設定ファイル作成(init.php)
2-3. ログイン処理用ファイル作成(login_check.php)
2-4. 登録商品一覧画面作成(item_list.php)
[確認事項]
▼ try catchステートメントについての確認
1. try catch 挿入後、正常表示されるか
2. ログイン情報の設定が間違っていたとき、try catchによるエラー表示が予定通り行われるか
トップページ 《index.html》
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>ログインフォーム</title> </head> <body> <h1>ログインフォーム</h1> <form action="login_check.php" method="post"> <table> <tr> <th>ユーザーID:</th> <td><input type="text" name="user_id" id="user_id" size="30"></td> </tr> <tr> <th>パスワード:</th> <td><input type="text" name="user_pass" id="user_pass" size="30"></td> </tr> </table> <input type="submit" value="送信"> </form> </body> </html>
ログイン処理用PHPファイル 《login_check.php》
<?php require_once dirname(__FILE__).'/init.php'; $user = $_POST['user_id']; $pass = $_POST['user_pass']; //databaseに接続 try{ //DB_HOST localhost $dsn = 'mysql:dbname='.DB_NAME.'; host=localhost; charset=utf8;'; $db_user = DB_USER; //DB_USER $db_pass = DB_PASS;//DB_PASS //以下、データベースアクセス時のユーザーID、パスワードは、別のファイルに記述 //$db_user = 'root'; //$db_pass = 'root'; $dbh = new PDO($dsn,$db_user, $db_pass); }catch (Exception $e){ print 'システムエラーが発生しました'; exit; } //var_dump($dbh); $sql= 'SELECT * FROM users WHERE user_id =:user_id;'; $stmt = $dbh -> prepare($sql); $stmt -> bindParam(':user_id', $user); $stmt -> execute(); $rec = $stmt -> fetch(PDO::FETCH_ASSOC); //var_dump($rec); $r = password_verify($pass,$rec['user_pass']); //var_dump($r); ob_end_flush(); exit;
try catchステートメントを挿入し、データベース接続の際の例外処理を記述
//databaseに接続 try{ $dsn = 'mysql:dbname='データベース名'; host=localhost; charset=utf8;'; $db_user = 'ユーザー ID'; $db_pass = 'ユーザーパスワード'; $dbh = new PDO($dsn,$db_user, $db_pass); }catch (Exception $e){ print 'システムエラーが発生しました'; exit; }
▼try catchステートメント
参照:
http://www.php.net//manual/ja/language.exceptions.php
▼SQL文
where (Where句)
SQL条件をどう使うか記述
この演習でのポイント:
ログイン時、ID、パスワード照合をどのように行うか
1. 特定のユーザーのパスワード情報を取得
(例) idが123であるユーザーのパスワードを取得
SELECT password FROM users WHERE id='123'
2. パスワードをハッシュ化させて変数に格納
$pass=password_hash($pass, PASSWORD_DEFAULT);
PASSWORD_DEFAULT ← 定数
▼MD5
md5 — 文字列のmd5ハッシュ値を計算する
参照:
http://www.php.net//manual/ja/function.md5.php
▼ハッシュ(hash)
参照:
http://www.php.net//manual/ja/faq.passwords.php
環境設定文書(init.php)を作成
目的:データベース接続設定情報を環境設定文書に集約するため
(以後変更が生じても、これにより値の更新は、init.php内での修正のみで済む)
《init.php》
1. 基本となる情報は、以前メールフォームの実習で作成したinit.phpを使用する。
(mailフォルダ直下のinit.phpをコピーして、loginformフォルダ直下に貼り付ける)
2. 1.でコピーしたファイルを開いて編集する
文末に以下の記述を追加
(変更前の item_list.phpで直書きしていたデータベース名:ユーザー名:パスワードの情報をdefine()内に記述)
define('DB_NAME','任意のデータベース名'); define('DB_HOST','localhost'); define('DB_USER','任意のユーザー名'); define('DB_PASS','任意のパスワード');
登録商品一覧画面作成 《item_list.php》
<?php //databaseに接続 require_once dirname(__FILE__).'/init.php'; if(!$_SESSION['login_data']['error']){ header('Location:index.html'); exit; } try{ //DB_HOST localhost $dsn = 'mysql:dbname='.DB_NAME.'; host=localhost; charset=utf8;'; $db_user = DB_USER; //DB_USER $db_pass = DB_PASS;//DB_PASS //$db_user = 'root'; //$db_pass = 'root'; $dbh = new PDO($dsn,$db_user, $db_pass); }catch (Exception $e){ print 'システムエラーが発生しました'; exit; } //var_dump($dbh); $sql='SELECT * FROM items WHERE 1;'; //以下から //SQLの実行 $rec = $dbh ->query($sql); ?> <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>登録商品一覧</title> <style> th { font-weight: bold; background: #F0E68C; } td { padding: 0 10px; /* width: 50px;*/ } .code { text-align:center; background:#FFE4B5; /*width: 80px;*/ } </style> </head> <body> <h1>登録商品一覧</h1> <a href="logout.php">ログアウト</a> <div id="container"> <div id="content"> <table border="1"> <tr> <th>コード</th><th>商品名</th><th>価格</th><th>修正</th><th>削除</th> </tr> <?php foreach($rec as $v){ print '<tr>'; print '<td class="code">'; print h($v['item_code']); print '</td>'; print '<td>'; print h($v['item_name']); print '</td>'; print '<td>'; print h($v['item_price']); print '</td>'; print '<td>'; print '<a href="update.php?item_code='.h($v['item_code']).'">修正</a>'; print '</td>'; print '<td>'; print '<a href="delete_confirm.php?item_code='.h($v['item_code']).'">削除</a>'; print '</td>'; print '</tr>';}?> </table> <a href="entry.php">新規商品登録</a> </div><!--content--> </div><!--container--> </body> </html>
phpMyAdminで作成したDBを「登録商品一覧」(item_list.php)に反映する
<?php foreach($stmt as $rec){ print '<tr>'; print '<td>'; print $rec['item_code']; print '</td>'; print '<td>'; print $rec['item_name']; print '</td>'; print '<td>'; print $rec['item_price']; print '</td>'; print '<td>'; print '</td>'; print '<td>'; print '</td>'; print '</tr>';} ?>
item_list.phpで以下部分を書き換える
(以下データベース接続情報を環境設定文書(init.php)に移動する)
【変更前】
//databaseに接続 try{ $dsn = 'mysql:dbname=entry; host=localhost; charset=utf8;'; $db_user = 'root'; $db_pass = 'root'; $dbh = new PDO($dsn,$db_user, $db_pass); }catch (Exception $e){ print 'システムエラーが発生しました'; exit; }
【変更後】
require_once dirname(__FILE__).'/init.php'; try{ //DB_HOST localhost $dsn = 'mysql:dbname='.DB_NAME.'; host=localhost; charset=utf8;'; $db_user = DB_USER; //DB_USER $db_pass = DB_PASS;//DB_PASS $dbh = new PDO($dsn,$db_user, $db_pass); }catch (Exception $e){ print 'システムエラーが発生しました'; exit; }