masimaro blog

menu

home > WEBアプリ開発:ECサイト > PHPとMySQLでECサイトをフルスクラッチ開発⑨商品詳細、削除画面の作成

PHPとMySQLでECサイトをフルスクラッチ開発⑨商品詳細、削除画面の作成


ECサイト
2021-07-21


今回は登録した商品の詳細画面と、削除をする画面の作成をします。

☆のマークは作成済みのファイルです。今回は雲マークのpro_disp.php pro_delete.php pro_delete.done.php ファイルを作成します。

今回で商品管理画面は終了です。

 

商品情報詳細画面

pro_disp.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{
    
$code = $_GET["code"];

$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 category, code, name, 
price, gazou, explanation 
FROM mst_product WHERE code=?";
$stmt = $dbh -> prepare($sql);
$data[] = $code;
$stmt -> execute($data);
    
$dbh = null;
        
$rec = $stmt -> fetch(PDO::FETCH_ASSOC);
        
}
catch(Exception $e) {
    print "只今障害が発生しております。
<br><br>";
    print "<a href='../staff_login/
staff_login.html'>ログイン画面へ</a>";
}
?>
    
商品詳細<br><br>
商品コード<br>
<?php print $rec["code"];?>
<br><br>
カテゴリー<br>
<?php print $rec["category"];?>
<br><br>
商品名<br>
<?php print $rec["name"];?>
<br><br>
画像<br>
<?php if(empty($rec["gazou"]) === true) {
    $disp_gazou = "";
} else {
    $disp_gazou = "<img src='
./gazou/".$rec['gazou']."'>";
};?>
<?php print $disp_gazou;?>
<br><br>
詳細<br>
<?php print $rec["explanation"];?>
<br><br>    
<form>
<input type="button" 
onclick="history.back()" value="戻る">
</form>

</body>
</html>

htdocsフォルダのproductフォルダにpro_disp.phpを作成します。

このページでは、商品コードをもとに商品の詳細情報を表示させたいので、データベースに接続し、SQLでスタッフ情報のレコードを取り出す必要があります。ここまでに作成したページの応用なので、簡単です。

まず、pro_branch.phpからget送信されたスタッフコードを受けとるため、$_GETでcodeを受け取ります。

その後db接続し、SQLのSELECT文でスタッフコードを渡し、該当するスタッフ情報のレコードから表示させたいカラムを選択し、SQLの実行をします。

もうSQLは使わないのでここでdbを切断。

後は fetch で先ほど選択したレコードの情報を取り出して、printするだけです。

画像を表示させるif文は、前回説明したとおりgazouカラムが「空」であれば、そのままprintすればimgファイルが無い表示(小さい四角)が出るので、一度「””」で空白を代入します。

空でなければ、img srcで画像の格納場所を指定し、変数に代入します。

このif文があれば、その後にprint $disp_gazou で画像があれば画像が表示され、無ければ空白で表示されます。

商品削除確認画面

pro_delete.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{
    
$code = $_GET["code"];

$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, 
gazou FROM mst_product WHERE code=?";
$stmt = $dbh -> prepare($sql);
$data[] = $code;
$stmt -> execute($data);
    
$dbh = null;
        
$rec = $stmt -> fetch(PDO::FETCH_ASSOC);
        
$gazou = $rec["gazou"];
    
if(empty($gazou) === true) {
    $disp_gazou = "";
} else {
    $disp_gazou = "<img src='
./gazou/".$gazou."'>";
}
               
}
catch(Exception $e) {
    print "只今障害が発生しております。
<br><br>";
    print "<a href='../staff_login/
staff_login.html'>ログイン画面へ</a>";
}
?>
    
商品詳細<br><br>
商品コード<br>
<?php print $rec["code"];?>
<br><br>
商品名<br>
<?php print $rec["name"];?>
<br><br>
価格<br>
<?php print $rec["price"];?>
円<br>
<br>
画像<br>
<?php print $disp_gazou;?>
<br><br>
上記情報を削除しますか?<br><br>
<form action="product_delete_done.php" 
method="post">
<input type="hidden" name="code" 
value="<?php print $rec['code'];?>">
<input type="hidden" name="gazou" 
value="<?php print $gazou;?>">
<input type="button" onclick="history.back()" 
value="戻る">
<input type="submit" value="OK">
</form>

</body>
</html>

productフォルダ内にpro_delete.phpを作成します。

このページではpro_branch.phpからget送信されたスタッフコードを元に、データベースからスタッフ情報を取り出して表示させ、削除するか確認するページになります。

pro_branchから$_GETでスタッフコードを受け取り、db接続、SQLのSELECTでスタッフ情報を選択、fetchで選択したレコードの情報を取り出し、画像有無のif文で空白の処置を施してからprintで表示、と、先ほどのpro_disp.phpとほぼ同じです。

異なるのは、この後スタッフ情報を「削除」するので、次のページに値をpost送信するところですね。

スタッフコードさえあれば、削除するスタッフのレコードが分かりますので、codeをformのhiddenでpost送信します。画像については、gazouフォルダの画像ファイルを削除する必要があるため、こちらもhiddenでpostします。

商品情報を確認させて、削除実行する場合はOKをクリックして、pro_delete_done.phpに飛びます。

商品削除実行画面

pro_delete_done.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{
    
require_once("../common/common.php");
    
$post = sanitize($_POST);
$code = $post["code"];
$gazou = $post["gazou"];
        
if(empty($gazou) === false) {
    unlink("./gazou/".$gazou);
}
        
$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 = "DELETE FROM mst_product 
WHERE code=?";
$stmt = $dbh -> prepare($sql);
$data[] = $code;
$stmt -> execute($data);
    
$dbh = null;
        
  
}
catch(Exception $e) {
    print "只今障害が発生しております。
<br><br>";
    print "<a href='../staff_login/
staff_login.html'>ログイン画面へ</a>";
}
?>
    
商品を削除しました。<br><br>
<a href="product_list.php">商品一覧へ</a>

</body>
</html>

productフォルダ内にpro_delete_done.phpを作成します。

このページでは、選択した商品の削除を実行し、データベース上から削除する画面になります。また、画像が登録されていれば保存先のgazouフォルダから画像も消去させます。

postでデータを受け取り後、画像の有無のif文で「画像が存在する場合だけunlinkで消去」しています。

画像がなければ消去できないので、このif文が無ければエラーとなるはずです。(参照先のデータが無いため)

db接続後のSQLに「DELETE文」があります。これはスタッフ削除ページと同じく、

“DELETE (削除)FROM mst_staff(削除したいテーブル名) WHERE code=?(削除したいレコード)”;

となります。

したがって、商品コードを$data[]で渡してやれば、execute($data);の実行時に、指定したレコードが削除されます。

dbを閉じて、削除が完了したコメントを載せて、商品一覧へのリンクを貼っておきます。

データベースとgazouフォルダを確認して、指定した商品と画像が削除されているか確認しましょう。

今回で商品管理画面の作成は完了です。

次回からはいよいよ、メインである「ECサイト」の作成に入りたいと思います!

コメントを残す

お名前

コメント



コメント一覧

コメントはまだありません
MENU