My Web道

WEB制作科 受講記録 …とその後も続くWEB制作に関する活動・学習記録です。

6/13 [PHP] 商品管理データベース(try catchステートメント/ログイン情報の照合)

  • [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;
}