PHPでショッピングカートを!【2.準備:商品修正・一覧】

PHP

前回、商品新規追加画面を作成しましたが、
動作確認を連続で行うため、[goods_list.php]
を簡易的に作成しました。

これは、商品一覧を表示するファイルです。

まず初めに先ほどの商品一覧を修正します。

商品一覧

ファイル名:goods_list.php

<記述例>

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>商品一覧</title>
    <style type="text/css">
<!--
table {margin: 10px;padding: 10px;}
table tr:nth-child(even) {background: cornsilk;}
table tr:nth-child(odd) {background: wheat;}
table tr th,td {border-bottom: 1px solid tan; padding: 2px 5px; text-align: center;}
table .right{text-align: right;}
.btn{background:lightsteelblue;border-radius: 10px;border: 3px solid darkslategray;padding: 6px 10px; margin-left: 120px;}
-->
    </style>
  </head>
  <body>
    <main>
      <section>

<?php

try
{

$dsn='mysql:dbname=fshop;host=localhost';
$user='root';
$password='';
$dbh=new PDO($dsn,$user,$password);
$dbh->query('SET NAMES utf8');

$sql='SELECT id,name,price FROM goods';
$stmt=$dbh->prepare($sql);
$stmt->execute();

$dbh=null;

print '<h3>商品一覧</h3>';
print '<table><tr>';
print '<td>商品ID</td><td>商品名</td><td>価格</td></tr>';

while(true)
{
  $rec=$stmt->fetch(PDO::FETCH_ASSOC);
  if($rec==false){break;}
  $id=$rec['id'];
  $name=$rec['name'];
  $price=$rec['price'];
  print '<tr><td class="right">'.$id.'</td>';
  print '<td>'.$name.'</td>';
  print '<td class="right">'.number_format($price).'</td>';
}
print '</tr></table>';

}
catch(Exception $e)
{
  print ' ただいま障害により大変ご迷惑をおかけしております。';
  exit();
}

?>
<button class="btn" onclick="location.href='goods_ctl.php'">商品管理へ</button>

      </section>
    </main>
  </body>
</html>

<表示例>

6~15行目にCSS(スタイルシート)を書きました。
CSSの書き方は、HTMLの head 内に、
<style></style>として書き
CSSの前後には、[<!–][–>]を書きます。

例:<style> <!– ここにCSSを記述 –> </style>

26~34行目はデータベース接続です。
36行目でデータベース切断しています。

SQLはSELECT文を使って goods テーブルのid,name,priceを
読み込んでいます。

42行目は、while文(ループ命令)です。

書式例:while(条件式){処理}

while文は、条件式の値が真(true)である間、
処理を繰り返すということです。

この42行目は while(true) と書かれてありますが、
これは無限ループを意味します。

無限ループつまり無限に処理を実行し続けるという
ことですなのですが、break で強制的にループを
抜けています。

ここでは、45行目に $rec == faise つまり、
$rec の値が空になったら、処理を終えます。

51行目number_format関数があります。

書式例:number_format(数値)

これは数値を3桁のカンマ区切りにする関数です。
ここでは、$price を価格がわかりやすいように
千円単位でカンマ区切りしています。

63行目ではボタンを作成するbuttonタグを使っています。

onclick属性はボタンをクリックしたときの処理を表します。

location.href は任意のページへの移動を表します。
ここでは、goods_ctl.php に移動するということです。

それから次に、商品の追加、修正、削除等をする場合、
トップページが必要です。

商品管理のトップページ

この商品一覧を使用して商品管理できる
とは思いますが、今回は別に
商品管理のトップページを作成します。

ファイル名:goods_ctl.php

<記述例>

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>商品管理</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style type="text/css">
<!--
      .top{background:tan;text-align: center;border: 3px solid saddlebrown;padding: 10px 20px;margin: 20px auto; display: inline-block;}
      .main{text-align: center;}
      .mainmenu{margin: 0 auto;}
      .mainmenu ul{list-style: none;}
      .mainmenu ul li{margin: 5px 50px 5px 10px;padding: 5px 10px;}
      .mainmenu button{background:palegoldenrod;border-radius: 6px;border: 2px solid saddlebrown;padding: 5px 10px; width: 140px; font-weight: bold;}
-->
</style>

  </head>
  <body>
    <main class="main">
      <h3 class="top">商 品 管 理</h3>
      <section class="mainmenu">
        <ul>
      <li><button onclick="location.href='goods_list.php'">商 品 一 覧</button></li>
      <li><button onclick="location.href='goods_add.php'">商 品 追 加</button></li>
      <li><button onclick="location.href='goods_mod.php'">商 品 修 正</button></li>
      <li><button onclick="location.href='goods_del.php'">商 品 削 除</button></li>
        </ul>
      </section>
    </main>
  </body>
</html>

<表示例>

24~27行目ではbuttonタグを使ってページ移動させています。

商品修正

次に、商品修正を作成します。

ファイル名:goods_mod.php

<記述例>

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>商品修正</title>
    <style type="text/css">
<!--
table {margin: 10px;padding: 10px;}
table tr:nth-child(even) {background: cornsilk;}
table tr:nth-child(odd) {background: wheat;}
table tr th,td {border-bottom: 1px solid tan; padding: 2px 5px; text-align: center;}
table .right{text-align: right;}
.btn{background:lightsteelblue;border-radius: 10px;border: 3px solid darkslategray;padding: 6px 10px; margin-left: 170px;}
-->
    </style>
  </head>
  <body>
    <main>
      <section>

<?php

try
{

$dsn='mysql:dbname=fshop;host=localhost';
$user='root';
$password='';
$dbh=new PDO($dsn,$user,$password);
$dbh->query('SET NAMES utf8');

$sql='SELECT id,name,price FROM goods';
$stmt=$dbh->prepare($sql);
$stmt->execute();

$dbh=null;

}
catch(Exception $e)
{
  print ' ただいま障害により大変ご迷惑をおかけしております。';
  exit();
}

print '<h3>商品修正</h3>';
print '修正する商品を選択してください。<br>';
print '<table><tr>';
print '<td>選択</td><td>商品ID</td><td>商品名</td><td>価格</td></tr>';

while(true)
{
  $rec=$stmt->fetch(PDO::FETCH_ASSOC);
  if($rec==false){break;}
  $id=$rec['id'];
  $name=$rec['name'];
  $price=$rec['price'];
  print '<tr><td>';
  print '<form method="post" action="goods_mod_chk.php">';
  print '<input type="submit" value="選択"></td>';
  print '<td class="right"><input type="hidden" name="id" value="'.$id.'">'.$id.'</td>';
  print '<td><input type="hidden" name="name" value="'.$name.'">'.$name.'</td>';
  print '<td class="right"><input type="hidden" name="price" value="'.$price.'">'.number_format($price).'</form></td>';
}
print '</tr></table>';
?>
<button class="btn" onclick="location.href='goods_ctl.php'">商品管理へ</button>

      </section>
    </main>
  </body>
</html>

<表示例>

一覧から、修正する商品を選択します。

26~36行目はデータベース接続切断です。

61行目 inputタグで変数($name)を[goods_mod_chk.php]へ
渡しています。

表示させないように type=”hidden” で隠し、
value内に変数を書いています。

ここではPHPですが、
print文の表示は、シングルクォーテーション(‘)で囲い
変数をドット(.)で繋ぎます。
例:'<input value=”‘.$name.'”>’

HTMLだったら、<?php と ?> で print文で表示させます。
例:value=”<?php print $name ?>”

商品修正選択

選択した修正する商品を修正する処理です。

ファイル名:goods_mod_chk.php

<記述例>

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>商品修正</title>
    <style type="text/css">
<!--
form {background: lightcyan; margin:10px; padding:10px; border:6px solid royalblue; display: inline-block;}
input {margin:6px;}
.btn{background:lightsteelblue;border-radius: 10px;border: 3px solid royalblue;padding: 6px 10px; margin-left: 170px;}
-->
    </style>
  </head>
  <body>
    <main>
      <section>

<?php
$id=$_POST['id'];
$name=$_POST['name'];
$price=$_POST['price'];

$id=htmlspecialchars($id);
$name=htmlspecialchars($name);
$price=htmlspecialchars($price);
?>
<h3>商品修正</h3>
修正しましたら[修正する]をクリックしてください。<br><br>

<form method="post" action="goods_mod_end.php">
  <h3>商品修正</h3>
  商品名:<input type="text" name="name" value="<?php print $name ?>"><br>
  価 格:<input type="text" name="price" value="<?php print $price ?>"><br>
  <input type="hidden" name="id" value="<?php print $id ?>">
  <input type="submit" value="修正する" style="margin:10px 0 10px 40%;">
</form>
<br>
<button class="btn" onclick="location.href='goods_ctl.php'">商品管理へ</button>

      </section>
    </main>
  </body>
</html>

<表示例>

19~21行目で[goods_mod.php]から渡されたデータを
受け取り、23~25行目でサニタイズ処理をしています。

32行目 inputタグに変数($name)を表示させ
編集可能な状態にしています。

このvalue内の変数の書き方は、
ここではHTMLですが、<?php と ?> で囲い
print文で表示させます。
例:value=”<?php print $name ?>”

PHPだったら、print文表示をシングルクォーテーション(‘)で囲い
変数をドット(.)で繋ぎます。
例:'<input value=”‘.$name.'”>’

商品修正完了

商品修正を完了させます。

ファイル名:goods_mod_end.php

<記述例>

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>商品修正完了</title>
    <style type="text/css">
<!--
.btn{background:lightsteelblue;border-radius: 10px;border: 3px solid darkslategray;padding: 6px 10px;}
-->
    </style>
  </head>
  <body>
    <main>
      <section>

<?php

$id=$_POST['id'];
$name=$_POST['name'];
$price=$_POST['price'];

$id=htmlspecialchars($id);
$name=htmlspecialchars($name);
$price=htmlspecialchars($price);

try
{

$dsn='mysql:dbname=fshop;host=localhost';
$user='root';
$password='';
$dbh=new PDO($dsn,$user,$password);
$dbh->query('SET NAMES utf8');

$sql='UPDATE goods SET id=?,name=?,price=? WHERE id=?';
$stmt=$dbh->prepare($sql);
$data[]=$id;
$data[]=$name;
$data[]=$price;
$data[]=$id;
$stmt->execute($data);

$dbh=null;

print '商品名:'.$name.' 価格:'.$price.'<br>';
print ' 修正しました。<br>';

}
catch(Exception $e)
{
  print ' ただいま障害により大変ご迷惑をおかけしております。';
  exit();
}

?>
<br>
<button class="btn" onclick="location.href='goods_ctl.php'">商品管理へ</button>

      </section>
    </main>
  </body>
</html>

29行目からデータベース接続しています。
35行目のSQL文はUPDATE文を使っています。
データベース上にあるデータを更新します。

書式例:UPDATE テーブル名 SET カラム名1=値1,カラム名2=値2 WHERE 条件

以上で商品一覧の修正と商品修正を作成しました。

次回は、商品削除を作ります。

コメント

タイトルとURLをコピーしました