PHPとMySQLでECサイトをフルスクラッチ開発⑦商品一覧、ページ遷移先指定画面の作成
2021-07-21
今回は、データベースを参照し、登録商品の一覧表示させる画面と、そこから修正、追加、詳細、削除、などのページへ値を渡しつつページ移動するページ遷移先指定画面を作成します。
星マークのページは前回までで作成済みになります。今回は雲マークのpro_list.php pro_branch.php pro_ng.php を作成します。
※あらかじめ、pro_add.phpにアクセスして各カテゴリ別で2つずつ位商品を登録しておいてください。
商品一覧画面
pro_list.php
<?php session_start(); session_regenerate_id(true); if(isset($_SESSION["login"]) === false) { print "ログインしていません。<br><br>"; print "<a href='staff_login.html'> ログイン画面へ</a>"; exit(); } else { print $_SESSION["name"]."さんログイン中"; print "<br><br>"; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <meta name="viewport" content= "width=device-width, initial-scale=1.0"> <title>商品一覧</title> <link rel="stylesheet" href="../style.css"> </head> <body> <?php try{ $dsn = "mysql:host=localhost; dbname=shop;charset=utf8"; $user = "root"; $password = ""; $dbh = new PDO($dsn, $user, $password); $dbh -> setAttribute (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "SELECT code,name,price FROM mst_product WHERE1"; $stmt = $dbh -> prepare($sql); $stmt -> execute(); $dbh = null; print "商品一覧<br><br>"; print "<form action= 'product_branch.php' method='post'>"; while(true) { $rec = $stmt -> fetch(PDO::FETCH_ASSOC); if($rec === false) { break; } print "<input type='radio' name='code' value='".$rec['code']."'>"; print $rec["name"]; print "---"; print $rec["price"]."円"; print "<br>"; } print "<br>"; print "<input type='submit' name='disp' value='詳細'>"; print "<input type='submit' name='add' value='追加'>"; print "<input type='submit' name='edit' value='修正'>"; print "<input type='submit' name='delete' value='削除'>"; } catch(Exception $e) { print "只今障害が発生しております。 <br><br>"; print "<a href='../staff_login/ staff_login.html'>ログイン画面へ</a>"; } ?> <br><br> <a href="../staff_login/ staff_login_top.php">管理画面TOPへ</a> </body> </html>
このページのプログラムが走れば下図のような表示になります。
以前作成したスタッフ一覧画面(staff_list.php)とほとんど同じ内容ですね。プログラムもほぼ同じです。
productフォルダ内にpro_list.phpを作成します。
このページでは、データベースに登録されている全ての商品を一覧表示させたいので、まずデータベースに接続をします。
SQLのSELECT文でmst_productテーブルからcode,name,price,を選択しています。レコードはWHERE1ですので、全てのレコードが対象になります。
$sql = “SELECT code,name FROM mst_staff WHERE1”; は、SELECT文です。WHERE1は全てのレコードを指定する事になるので、この場合は「mst_staffテーブルのすべてのレコードのcodeとnameカラムを選択」になります。
SQLを実行した後、データベースを閉じます。
この後、商品を一覧表示させるループ文に入るので、その前にhtmlのformタグを作成しておきます。
print “<form… 飛び先はpro_branch.php でpost送信。
ここから、画面にスタッフ全員を一覧表示させるプログラムに入ります。
while(true){}は、永久ループになります。
$rec = $stmt -> fetch(PDO::FETCH_ASSOC); は、SQLで取り出した全レコードの情報を、プライマリkeyの昇順に1つずつ抜き出し、$recに格納しています。
if($rec === false) { break; } は、つまり全てのレコードを取り出したあと、$recは空の値となるので、その場合はbreak;でループから抜け出すといったプログラムです。
したがって、$recに値がある(レコードの情報がある)場合、商品情報を表示させるプログラムが繰り返されます。
表示された商品を選択出来るようにするため、ラジオボタンを付けています。
input type=”radio”(ラジオボタン) name=”code”(sumitで渡す値の名前) value=”.$rec[‘code’].”(submitで渡す値) になります。したがって、今回のラジオボタンは、商品codeをpost送信するために付けています。
$rec[“name”]で商品名が表示されるので、ラジオボタンの隣にスタッフ名が表示される形になります。
$rec["price"]で商品価格が表示されるので、商品名の隣に商品価格が表示される形になります。
<br>で改行なので、ループすれば上図のような表示になります。
ループから抜け出した後、今後作成するスタッフ編集画面に飛ぶための4つのsubmitボタンを作成します。(詳細、追加、修正、削除)
submitにnameを付けていますが、これはページ移動後、押されたsubmitボタンの識別を付けるためです。
最後に、管理トップ画面のリンクを貼っておきます。
ページ遷移先指定画面
pro_branch.php
<?php session_start(); session_regenerate_id(true); if(isset($_SESSION["login"]) === false) { print "ログインしていません。<br><br>"; print "<a href='staff_login.html'> ログイン画面へ</a>"; exit(); } if(isset($_POST["add"]) === true) { header("Location:product_add.php"); exit(); } if(isset($_POST["disp"]) === true) { if(isset($_POST["code"]) === false) { header("Location:product_ng.php"); exit(); } $code = $_POST["code"]; header("Location:product_disp.php? code=".$code); exit(); } if(isset($_POST["edit"]) === true) { if(isset($_POST["code"]) === false) { header("Location:product_ng.php"); exit(); } $code = $_POST["code"]; header("Location:product_edit.php? code=".$code); exit(); } if(isset($_POST["delete"]) === true) { if(isset($_POST["code"]) === false) { header("Location:product_ng.php"); exit(); } $code = $_POST["code"]; header("Location:product_delete.php? code=".$code); exit(); } ?>
productフォルダ内にpro_branch.phpを作成します。
こちらのプログラムも、以前作成したstaff_branch.phpとほぼ同じ内容です。
このページは、リスト画面から4つのsubmitボタンのいずれかが押された際、指定作のページへ自動的に飛ぶようにプログラムされています。header(“location..があるので、htmlは記述せず、画面にはなにも表示されません。
※headerの命令文は、htmlの配下に記述出来ない仕様となっています。
一つ抜粋して説明すると、例えば商品修正のボタンを押したならば、isset($_POST[“edit”]) === true になるので、ここのif文のプログラムが実行されます。
続く if(isset($_POST[“code”]) === false) は、これはラジオボタンが押されたかどうかの確認になります。したがって、falseならスタッフが選択されていないので強制的にheaderでpro_ng.phpのページへ飛ばします。
ラジオボタンが押されていれば、$code = $_POST[“code”]; でスタッフコードを$codeに代入します。
その後、headerでstaff_edit.phpに飛ばしますが、ここがポイントで、urlの後に「?code=”.$code」と続いています。
これは、「get送信」しているのです。
このページでは、目に見えるボタンを装飾出来ないので、post送信ができません。($_SESSION[]で賄うこともできそうですが、、)しかし、urlに値を乗せる「GET送信」なら可能になります。
したがって、スタッフ情報の核となるスタッフコードを、headeのurlに乗っけてしまえばいいんですね。
パスワードなどの情報であれば、目に見えてしまうurlに乗せるget送信はいけませんが、スタッフコードであれば特段問題ないので、見えても良いような情報の場合、get送信も使います。
記述は、pro_edit.php?code=”.$code のように、飛び先のURLの?の後がGETの値になります。
code=は名前で、そこに.$code で値をつなげば、後のページで$_GET[“code”]で商品コードが受け取れます。
商品選択NG画面
pro_ng.php
<?php session_start(); session_regenerate_id(true); if(isset($_SESSION["login"]) === false) { print "ログインしていません。<br><br>"; print "<a href='staff_login.html'> ログイン画面へ</a>"; exit(); } else { print $_SESSION["name"]."さんログイン中"; print "<br><br>"; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <meta name="viewport" content= "width=device-width, initial-scale=1.0"> <title>商品選択NG</title> <link rel="stylesheet" href="../style.css"> </head> <body> 商品を選択して下さい<br><br> <a href="product_list.php">商品一覧へ</a> </body> </html>
productフォルダ内にpro_ng.phpを作成します。
商品リスト画面で、ラジオボタンにチェックなくsubmitボタンを押したときに表示される画面です。
商品が選択されていないので、その旨を伝えるだけのページですね。とくに説明はありません。
こちらもstaff_ng.phpと同じです。
ここまで作成できれば、ログイン後の商品管理トップページから商品追加画面へ飛べるようになるので、pro_add..のページのコメントアウトしておいたsessionの記述部分を解除しておいてください。
次回は商品の修正ページを作成します。