質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
HTML5

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

phpMyAdmin

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

PHP

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

Q&A

0回答

809閲覧

同一のユーザー、同一商品があればカート数量をカウントアップしたい

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/02/23 09:28

前提・実現したいこと

以下の条件を満たす処理(カートに入れるボタン)を追加したいです。
・同一のユーザー、同一商品があればカート数量をカウントアップする
・もしなければ、新規カートを追加する

cartテーブル(ユーザがカートに追加した商品の情報)が
cart_id, user_id, item_id, amount, create_date, update_date

productテーブル(商品情報)が
id, name, price, img, create_date, update_date

item_stockテーブル(在庫情報)が
stock_id, item_id, stock, create_date, update_date

になります。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

PHP

1<?php 2//商品一覧トップページ 3 4session_start(); 5$err_msg = []; //エラーエッセージの格納先 6$msg = []; 7$item_id = ''; 8$date = date('Y-m-d H:i:s'); 9//データベース接続関連 10$host = 'localhost'; //ホスト名 11$username = '45699'; //ユーザー名 12$password = '45699'; //パスワード 13$dbname = '45699'; //データベース名 14$charset = 'utf8'; 15$dsn = 'mysql:dbname='.$dbname.';host='.$host.';charset='.$charset; 16 17if(isset($_SESSION['customer']['id']) === FALSE) { //もしログインされてない場合は、ログイン画面に 18//強制ジャンプするようにする 19 header('Location: login.php'); 20 exit(); 21} 22 23if (isset($_SESSION['customer']) === TRUE) { //最初にログインしているかをチェックする。 24 $user_id = $_SESSION['customer']['id']; 25 $user_name = $_SESSION['customer']['name']; //ログインページから飛んでくる情報 26} 27 28try { 29 $dbh = new PDO($dsn, $username, $password, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4')); 30 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 31 $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 32 33 if ($_SERVER['REQUEST_METHOD'] === 'POST') { 34 if (isset($_POST['item_id']) === TRUE) { 35 $item_id = trim($_POST['item_id']); //trim関数でスペースを削除する。文字列の先頭と末尾にある空白文字を取り除く。 36 } 37 if ($item_id === '') { 38 $err_msg[] = '商品を選択してください。'; 39 } else if (preg_match('/^[1-9][0-9]*$/', $item_id) !== 1) { 40 $err_msg[] = '商品が正しくありません。'; 41 } 42 if (count($err_msg) === 0) { //エラーがないときだけ実行する 43 try { 44 $sql = 'INSERT INTO cart(user_id, item_id, amount, create_date, update_date) 45 VALUES(?, ?, ?, ?, ?)'; 46 $stmt = $dbh->prepare($sql); 47 $stmt->bindValue(1, $user_id, PDO::PARAM_INT); 48 $stmt->bindValue(2, $item_id, PDO::PARAM_INT); 49 $stmt->bindValue(3, 1, PDO::PARAM_INT); 50 $stmt->bindValue(4, $date, PDO::PARAM_STR); 51 $stmt->bindValue(5, $date, PDO::PARAM_STR); 52 $stmt->execute(); 53 $msg[] = 'カートに追加しました!'; 54 } catch (PDOException $e) { 55 $err_msg[] = 'カートに追加できませんでした。'; 56 } 57 } 58 } 59 60 $sql = 'SELECT product.id, name, price, img, status, stock 61 FROM product 62 JOIN item_stock 63 ON product.id = item_stock.stock_id 64 WHERE status = 1'; 65 // ステータスが1の商品のみを表示 66 67 // prepareでSQL文を実行する準備 68 $stmt = $dbh->prepare($sql); 69 // SQLを実行 70 $stmt->execute(); 71 //レコードを取得する 72 $rows = $stmt->fetchALL(); 73// print_r($rows); 74//print_rで中身を確認する 75// exit(); 76 //1行ずつ結果を配列で取得 77} catch (PDOException $e) { 78 echo '予期せぬエラーが発生しました。管理者へお問い合わせください。理由:'.$e->getMessage(); 79} 80 81// 商品一覧ページ (top.php) 82// カートに入れるボタンの処理 83// 同一ユーザー、同一商品があればカート数量をカウントアップする 84// なければ、新規カートを追加する 85// // 商品のステータスが「公開」の商品情報(「商品名」「値段」「画像」)を一覧で表示する。 86// 商品の在庫が0の場合、「カートに入れる」ボタンは表示せず、「売り切れ」などの情報を表示する。 87// 「カートに入れる」ボタンをクリックした場合、指定の商品をカートに入れる。 88// 「ショッピングカートページに遷移する。 89?> 90<!DOCTYPE html> 91<html lang="ja"> 92 <head> 93 <meta chartset="UTF-8"> 94 <title>商品一覧</title> 95 <style> 96 .soldout { 97 color: #f00; 98 font-weight: bold; 99 } 100 .name { 101 color: #87cefa; 102 font-weight: bold; 103 text-align: center; 104 } 105 .price { 106 text-align: center; 107 } 108 </style> 109 </head> 110 111 <body> 112 <h1>商品一覧</h1> 113 114 <p>ようこそ、<?php echo $user_name; ?>さん。</p> 115 <a href="admin.php">商品管理</a> 116 <a href="cart.php">カート</a> 117 <a href="logout.php">ログアウト</a> 118<?php foreach ($err_msg as $value) { ?> 119 <p><?php echo $value; ?></p> 120<?php } ?> 121<?php foreach ($msg as $value) { ?> 122 <p><?php echo $value; ?></p> 123<?php } ?> 124 <table> 125<?php foreach ($rows as $item) { ?> 126 <tr> 127 <td><img src="./product_picture/<?php echo $item['img']; ?>" width=400 height=400></td> 128 </tr> 129 <tr> 130 <td class="name"><?php echo $item['name']; ?></td> 131 </tr> 132 <tr> 133 <td class="price"><?php echo $item['price']; ?> 134<?php if ($item['stock'] > 0) { ?> 135 136 <form method="post"> 137 <input type="hidden" name="item_id" value="<?php echo($item['id']) ?>"> 138 <input type="submit" value="カートに追加"> 139 </form> 140 141<?php } else { ?> 142 <input type="radio" name="item_id" value="<?php echo $item['id']; ?>"> 143 <p class="soldout">大変申し訳ございません。現在、売り切れです。</p> 144 </td> 145<?php } ?> 146 </tr> 147<?php } ?> 148 </table> 149 </body> 150</html> 151 152 153

試したこと

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

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

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

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

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

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

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

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

m.ts10806

2021/02/23 09:29

回答ついている質問の放置はマナー違反かと。 解決したくないならお好きにどうぞ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問