🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

2764閲覧

自動販売機の管理ページで商品を追加したい

turtle410

総合スコア13

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/01/29 08:36

前提・実現したいこと

以下の要件を満たすように、自動販売機の管理ページを作成しています。

・「ドリンク名」「値段」「在庫数」「公開ステータス」を入力し、商品を追加できる。
・商品を追加する場合、「商品画像」を指定してアップロードできる。
・追加した商品の一覧情報として、「商品画像」、「商品名」、「値段」、「在庫数」、「公開ステータス」のデータを一覧で表示する。
・商品の追加あるいは指定ドリンク情報(「在庫数」、「公開ステータス」)の変更が正常に完了した場合、完了のメッセージを表示する。
・商品を追加する場合、「商品名」「値段」、「在庫数」、「公開ステータス」「商品画像」のいずれかを指定していない場合、エラーメッセージを表示して、商品を追加できない。
・商品を追加する場合、「値段」、「在庫数」は、0以上の整数のみ可能とする。0以上の整数以外はエラーメッセージを表示して、商品を追加できない。
・商品を追加する場合、公開ステータスは「公開」あるいは「非公開」のみ可能とする。「公開」あるいは「非公開」以外はエラーメッセージを表示して、商品を追加できない。
・画像は「PNG」以外はエラーメッセージを表示して、商品を追加できない。
・商品一覧から指定ドリンクの在庫数を変更する場合、0以上の整数のみ可能とする。0以上の整数以外はエラーメッセージを表示して、変更できない。

作成するページは
販売するドリンクの追加・変更を行う「管理ページ」
ユーザがドリンクを購入する「購入ページ」
ユーザがドリンクを購入した結果情報を表示する「購入結果ページ」
の3つです。

商品を購入するまでの流れは以下のようになります。
「管理ページ(tool.php)」で、 販売する商品の追加をする。
「購入ページ(index.php)」で、購入する商品を選択し、金額を入力して購入する。
「購入結果ページ(result.php)」で、購入した結果を表示する。

商品を変更する部分はなんとかできましたが、追加する部分が分かりません。
ドリンクを追加するプログラムはどのように記述すればよいですか?

エラーメッセージ

該当のソースコード

PHP

1<?php //tool.phpは追加、変更、表示の役割をする 2$drink_master = []; 3$err_msg = []; // エラーメッセージの格納先 4$complete_msg = []; 5$drink_id = ''; 6$stock = ''; 7$drink_name = ''; 8$price = ''; 9$status = ''; 10$img_dir = './drink_picture/'; 11$now_date = date('Y-m-d H:i:s'); 12//改行して初期化の部分とデータベース接続の部分に分ける 13$host = 'localhost'; //ホスト名 14$username = '445691'; //ユーザー名 15$password = '445691'; //パスワード 16$dbname = '445691'; //データベース名 17$charset = 'utf8'; 18$dsn = 'mysql:dbname='.$dbname.';host='.$host.';charset='.$charset; 19//date_default_timezone_set('Asia/Tokyo'); // タイムゾーン設定 20 21try { 22 // データベースに接続する 23 $dbh = new PDO($dsn, $username, $password, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4')); 24 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 25 $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 26 echo 'データベースに接続しました'; 27 if ($_SERVER['REQUEST_METHOD'] === 'POST') { 28 if (isset($_POST['stock_button']) === TRUE) { 29 if (isset($_POST['drink_id']) === TRUE) { 30 $drink_id = trim($_POST['drink_id']); 31 } 32 if (isset($_POST['stock']) === TRUE) { 33 $stock = trim($_POST['stock']); 34 } 35 if ($drink_id === '') { 36 $err_msg[] = '商品が選択されていません'; 37 } else if (preg_match('/^[1-9][0-9]*$/', $drink_id) !== 1) { 38 $err_msg[] = '商品が正しくありません'; 39 } 40 if ($stock === '') { 41 $err_msg[] = '在庫数が入力されていません'; 42 } else if (preg_match('/^[0-9]+$/', $stock) !== 1) { 43 $err_msg[] = '在庫数は0以上の整数で入力してください'; 44 } 45 if (count($err_msg) === 0) { 46 try { 47 $sql = 'UPDATE drink_stock 48 SET stock = ?, 49 update_datetime = ? 50 WHERE drink_id = ?'; 51 $stmt = $dbh->prepare($sql); 52 // SQL文のプレースホルダに値をバインドする 53 $stmt->bindValue(1, $user_name, PDO::PARAM_INT); //ここをPARAM_STRではなくてINTにかえる 54 $stmt->bindValue(2, $user_comment, PDO::PARAM_INT); 55 $stmt->bindValue(3, $user_comment, PDO::PARAM_INT); 56 // SQLを実行する 57 $stmt->execute(); 58 } catch (PDOException $e) { 59 $err_msg[] = 'データベース処理でエラーが発生しました。理由:' . $e->getMessage(); 60 } 61 } 62 } 63 // トランザクション開始 64 //トランザクションを使って商品情報と在庫情報を作成する 65 // $dbh->beginTransaction(); 66 // try { 67 // $now_date = date('Y-m-d H:i:s'); 68 // $sql = 'INSERT INTO drink_master(drink_name, price, status) VALUES(\'' .$drink_name . '\',' . $price . ',' . $status . ')'; 69 // $stmt = $dbh->prepare($sql); 70 // $stmt->execute(); 71 // $sql = 'UPDATE drink_stock SET stock;= ' . $update_stock . ' WHERE drink_id = ' . $drink_id; 72 // $stmt = $dbh->prepare($sql); 73 // $stmt->execute(); 74 // echo 'データが追加できました'; 75 // } catch(PDOException $e) { 76 // // ロールバック 77 // $dbh->rollback(); 78 // // 例外をスローする 79 // throw $e; 80 // } catch (PDOException $e) { 81 // echo 'データベース処理でエラーが発生しました。理由:'.$e->getMessage(); 82 // } 83 } 84 // SQL文を作成する 85 $sql = 'SELECT drink_master.drink_id, img, drink_name, price, status, stock 86 FROM drink_master 87 JOIN drink_stock 88 ON drink_master.drink_id = drink_stock.drink_id '; 89 // SQL文を実行する準備 90 $stmt = $dbh->prepare($sql); 91 // SQLを実行 92 $stmt->execute(); 93 // レコードの取得 94 $rows = $stmt->fetchAll(); 95 //var_dump($rows); 96} catch (PDOException $e) { 97 echo '接続できませんでした。理由:'. $e->getMessage(); 98} 99 100/*if ($sql_kind === '') { 101 $err_msg[] = '商品が追加されていません'; 102} 103if ($drink_id === '') { 104 $err_msg[] = '文字が入力されていません'; 105} else if (preg_match('/^[0-9]+$/',$drink_id) === 0) { 106 $err_msg[] = '文字は整数値で入力してください'; 107} 108if ($stock === '') { 109 $err_msg[] = '個数が入力されていません'; 110} else if (preg_match('/^[0-9]+$/',$stock) === 0) { 111 $err_msg[] = '個数は整数値で入力してください'; 112} 113if (preg_match('/^[01]$/',$status)===0) { 114 $err_msg[] = 'ステータス値が不正です'; 115} 116*/?> 117<!DOCTYPE html> 118<html lang="ja"> 119 <head> 120 <meta charset="UTF-8"> 121 <title>自動販売機の管理画面</title> 122 <style> 123 table,tr,th,td { 124 border:solid 1px; 125 } 126 </style> 127 </head> 128 <body> 129 <h1>自動販売機管理ツール</h1> 130<?php foreach ($err_msg as $value) { ?> 131 <p><?php echo $value;?></p> 132<?php }?> 133<?php foreach ($complete_msg as $value) { ?> 134 <p><?php echo $value;?></p> 135<?php }?> 136 <section> 137 <h2>新規商品追加</h2> 138 <form method="post" enctype="multipart/form-data"> 139 <p><label>名前<input type="text" name="drink_name"></label></p> 140 <p><label>値段<input type="text" name="price"></label></p> 141 <p><label>個数<input type="text" name="stock"></label></p> 142 <p><input type="file"></p> 143 <select name="new_status"><br> 144 <option value="0">非公開</option> 145 <option value="1">公開</option> 146 </select><br> 147 <input type="hidden" name="sql_kind" value="insert"> 148 <p><input type="submit" value="■□■□■商品追加■□■□■"></p> 149 </form> 150 </section> 151 <section> 152 <h2>商品情報変更</h2> 153 <caption>商品一覧</caption> 154 <table> 155 <tr> 156 <th>商品画像</th> 157 <th>商品名</th> 158 <th>価格</th> 159 <th>在庫数</th> 160 <th>ステータス</th> 161 </tr> 162<?php foreach ($rows as $value) { ?> 163 <tr class="status_false"> 164 <td><img src="<?php print htmlspecialchars($img_dir.$value['img'], ENT_QUOTES, 'UTF-8'); ?>" width=100 height=150></td> 165 <td><?php print htmlspecialchars($value['drink_name'], ENT_QUOTES, 'UTF-8'); ?></td> 166 <td><?php print htmlspecialchars($value['price'], ENT_QUOTES, 'UTF-8'); ?></td> 167 <td> <!--HTMLでは、=の前後をくっつける --> 168 <form method="post"> 169 <input type="hidden" name="drink_id" value="<?php print htmlspecialchars($value['drink_id'], ENT_QUOTES, 'UTF-8'); ?>"> 170 <input type="text" name="stock" value="<?php print htmlspecialchars($value['stock'], ENT_QUOTES, 'UTF-8'); ?>">171 <input type="submit" name="stock_button" value="変更"> 172 </form> 173 </td> 174 <td> 175 <form method="post"> 176 <input type="hidden" name="drink_id" value="<?php print htmlspecialchars($value['drink_id'], ENT_QUOTES, 'UTF-8'); ?>"> 177<?php if (htmlspecialchars($value['status'], ENT_QUOTES, 'UTF-8') === '0') { ?> 178 <input type="submit" name="status_button" value="非公開→公開"> 179 <input type="hidden" name="status" value='1' > 180 <style type="text/css"> 181 .status_false{ 182 background-color:#ccc; 183 } 184 </style> 185<?php } else {?> 186 <input type="submit" name="status_button" value="公開→非公開"> 187 <input type="hidden" name="status" value='0' > 188<?php }?> 189 </form> 190 </td> 191 </tr> 192<?php }?> 193 </table> 194 </section> 195 </body> 196</html>

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/01/29 09:32

調べて何も出てこなかったのでしょうか。
退会済みユーザー

退会済みユーザー

2021/01/29 11:29 編集

phpMyAdminはデータベース管理ツールであって、データベースそのものではありません。代わりにmysqlを質問タグに添えるべきではないかと。で、在庫数を増やしたいということでUPDATE文に注目したのはいいけれど、どう書いていいかわからない? 足し算はわかりますか? クエリ上で足し算しますよ。そして更新日時は、PHP側から与えなくても、データベースも時計を持っているので自動で日時を入れるような書き方もできますよ。
kai0310

2021/02/04 16:25

BAもリアクションも何もついていないのもありますよね。。 ただ、答えが欲しくてコードを書いて欲しいならそれなりの対価を支払って他のサービスを利用されて見ては?
guest

回答1

0

ベストアンサー

MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.11 UPDATE 構文
から、使えそうな例文を引用します。

UPDATE t1 SET col1 = col1 + 1;

これは、テーブルt1のカラムcol1に、現在のcol1の値に+1した値で更新する、というものです。
WHERE句がないので、テーブルt1の全部の行に対して、col1が+1されます。
WHERE句で対象のidを指定すれば、1行だけ更新とかできます。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.7 日付および時間関数
からも引用します。

SELECT NOW();

これは、現在日時をTIMESTAMP型で得られるものです。
更新日時のデータ型がTIMESTAMP型であれば、NOW()を与えることで
データベース上で現在日時が求められて更新用に使えるというわけです。
だったら、UPDATE文のSET句で、UPDATE テーブル名 SET カラム名 = NOW()とか書けば、
指定のカラムに対して現在日時で更新される、というふうに類推できますよね。

投稿2021/01/29 11:25

編集2021/01/29 11:36
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問