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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

Q&A

解決済

1回答

1223閲覧

ECsite作成中、ショップ内の商品をカートに入れる際の「UPDATE」について

Utada

総合スコア1

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

0グッド

1クリップ

投稿2020/10/03 05:12

ECsite作成中、ショップ内の商品をカートに入れる際の「UPDATE」について

ここに質問の内容を詳しく書いてください。

はじめまして、現在スクールにてECsiteフォームの作成をおこなっております。

商品一覧ページにて
SQLにて管理している商品の一覧をWHILEで表示しており、
各商品下の「カートに入れる」ボタンを押下すると、データベースcartがUPDATEされ、
ログインしている人の「user_id」、カートに入れた商品の「drink_id」、カートに入れた個数「amount」がデータベースに
入る仕組みを作っております。

エラーメッセージ
実際に行ってみるとsql「cart」内に入れた「drink_id」が必ず「49」になってしまいます。
どこが誤っているか回答いただければ幸いです。

該当のソースコード

<?php $host = 'localhost'; // データベースのホスト名又はIPアドレス ※CodeCampでは「localhost」で接続できます $username = ''; // MySQLのユーザ名 $passwd = ''; // MySQLのパスワード $dbname = ''; // データベース名 $db=mysqli_connect($host,$username,$passwd,$dbname)or die(mysqli_connect_error()); mysqli_set_charset($db,'utf8'); $recordSet=mysqli_query($db,'SELECT * FROM drink_table,stock_table WHERE drink_table.drink_id=stock_table.drink_id'); //error_reporting(E_ALL & ~ E_DEPRECATED & ~ E_USER_DEPRECATED & ~ E_NOTICE); ?> <?php session_start(); $host = 'localhost'; // データベースのホスト名又はIPアドレス ※CodeCampでは「localhost」で接続できます $username = 'codecamp38173'; // MySQLのユーザ名 $passwd = 'codecamp38173'; // MySQLのパスワード $dbname = 'codecamp38173'; // データベース名 $db=mysqli_connect($host,$username,$passwd,$dbname)or die(mysqli_connect_error()); mysqli_set_charset($db,'utf8'); if(isset($_SESSION['id'])&& $_SESSION['time']+3600>time()){ //ログインしている $_SESSION['time']=time(); $sql2=sprintf('SELECT * FROM members WHERE id=%d',mysqli_real_escape_string($db,$_SESSION['id'])); $record2=mysqli_query($db,$sql2)or die(mysqli_error($db)); $member=mysqli_fetch_assoc($record2); }else{ //ログインしていない header('Location: ../login/login.php'); exit(); } ?> <?php //「カートに入れる」を選択した商品をSQLテーブル「cart」に加える $host = 'localhost'; // データベースのホスト名又はIPアドレス ※CodeCampでは「localhost」で接続できます $username = 'codecamp38173'; // MySQLのユーザ名 $passwd = 'codecamp38173'; // MySQLのパスワード $dbname = 'codecamp38173'; // データベース名 $db=mysqli_connect($host,$username,$passwd,$dbname)or die(mysqli_connect_error()); mysqli_set_charset($db,'utf8'); if(!empty($_POST)){ $sql2=sprintf('INSERT INTO cart SET user_id=%d,drink_id=%d,amount=%d', mysqli_real_escape_string($db,$_POST['id']), mysqli_real_escape_string($db,$_POST['drink_id']), mysqli_real_escape_string($db,1)); mysqli_query($db,$sql2)or die(mysqli_error($db)); //ON DUPLICATE KEY UPDATE drink_id=VALUES(drink_id),amount=amount+1', }?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>shopping</title> <style> table,tr,th,td{ border:solid 1px; } </style> </head> <body> <h1>shop</h1> <p><a href="cart.php">カートへ移動</a></p> <table> <div style="text-align:right"><a href="../login/logout.php">ログアウト</a></div> <?php $i=1 ?> <form method='POST' action="index.php"> <!---画像を表示---> <tr> <?php while($table=mysqli_fetch_assoc($recordSet)){ ?> <td><img width="100" height="100" name="product_image" src="../tool/<?php print($table['product_image']) ?>"> <br> <?php echo $table['drink_name'];?> <br> <?php echo $table['value'];?> <?php $drink_id= print(htmlspecialchars($table['drink_id'])) ?> <input type="hidden" name=$drink_id value=<?php print($table['drink_id']); ?>> <input type="hidden" name="id" value=<?php print($_SESSION['id']) ?>> <?php print(htmlspecialchars($table['drink_id'])); ?> <?php if((int)$table['stock']===0){?> <p>売り切れ</p> <?php }else{ ?> <input type='submit' name="selected_drink" value="カートに入れる"> <?php } ?> <?php } ?></td> </tr> <input type="hidden" name="value" value=<?php print(htmlspecialchars($table['value'])) ?>> <input type="hidden" name="stock" value=<?php print(htmlspecialchars($table['stock'])) ?>> </form> </table> </body> </html>

試したこと

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

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

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

name=$drink_id
本当にこう書いてありますか?
これだと$_POST['drink_id']では取れないのでは。

ただname=drink_idだったとしても、whileでループさせているので、同じnameが並んでいることになります。
同じnameの場合は最後の情報しか送信されません。

同じnameのままでいきたいのでしたら、formをwhileの中に入れてdrinkの数だけformを定義するようにしてください。


ただ、おかしい実装が沢山あります。HTML的にもPHP的にも
全体的に見直されたほうが良いかと思います。

html的なところ・・・
tableタグの中に置いてはいけないタグがある。
基本的にtd、thの中以外に要素を置いてはいけない

など。

PHP的なところ・・・
DB接続回り全般。
DB接続部分参考:PHPでデータベースに接続するときのまとめ

$drink_id= print(htmlspecialchars($table['drink_id']))
意味がない。
printは出力を行うし、返却値は常に1
name=$drink_idここを変数展開していたらすべてname=1になるけど問題ない?

など。

全部挙げるとほぼすべて書き直しになるくらいなのでこのあたりで。

投稿2020/10/03 05:39

編集2020/10/03 05:41
m.ts10806

総合スコア80875

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

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

kai0310

2020/10/03 06:19

これは質問者が考えたコードなのかそれともスクールで行ってる教材的なコードなのだろうか。何が言いたいかというとスクールでドキュメントの読み方は教えてもらないという点。
m.ts10806

2020/10/03 07:35

スクールの方がまだマシなはずなので(変数の付け方とか)、ツギハギコードでしょうね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問