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

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

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

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

Q&A

1回答

1065閲覧

[PHP]ショッピングカート機能で商品をうまく追加できない。

tamachin

総合スコア2

PHP

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

0グッド

0クリップ

投稿2021/12/16 02:46

編集2021/12/16 02:55

前提・実現したいこと

カートに入れるボタンを押した瞬間に指定のidの商品を追加できるようにしたい。

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

イメージ説明
イメージ説明

ボタンを押したら、追加はされました。

イメージ説明

しかし、順番通りに追加されます(ちがうidの商品も追加されます。) 同じ商品を複数追加を行うことができません。

イメージ説明

idカラムに設定してあるAUTO_INCREMENTが原因なのかと思って解除しましたが、

イメージ説明

今度は逆にidが0のレコードが作成されました。 (2回目以降は追加されません。)

該当のソースコード

PHP ソースコード functions.php function insert_cart($link) { if ($_SERVER['REQUEST_METHOD'] !== 'POST') { return; } if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_POST['sql_kind'] === 'cart') { $id_s = 0; $amount = 0; $name = ""; $new_time = date('Y-m-d H:i:s'); $sql = 'INSERT INTO cart_tb(id, name, amount, created_date, updated_date) VALUES(\''.$id_s.'\',\''.$name.'\',\''.$amount.'\',\''.$new_time.'\',\''.$new_time.'\')'; if ($result = mysqli_query($link, $sql) === TRUE) { $drink_id = mysqli_insert_id($link); } } } function update_item_id($link) { if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_POST['sql_kind'] === 'cart') { $sql = 'UPDATE cart_tb, item_tb SET cart_tb.name = item_tb.name where cart_tb.id = item_tb.id'; if ($result = mysqli_query($link, $sql) === TRUE) { $drink_id = mysqli_insert_id($link); } } } function update_cart($link) { if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_POST['sql_kind'] === 'cart') { if (isset($_POST['id_s']) === TRUE) { (int)$id_s = (int)$_POST['id_s']; $amount = +1; } $sql = 'UPDATE cart_tb SET amount = ' . $amount; if ($result = mysqli_query($link, $sql) === TRUE) { $drink_id = mysqli_insert_id($link); } } } item.php <?php require_once('../../include/model/functions.php'); require_once('../../include/conf/const.php'); $link = get_db_connect(); $data = do_sql($link); if (isset($_POST['cart'])) { $data = insert_cart($link); $data = update_item_id($link); $data = update_cart($link); // $complete_msg = complete_check_cart($link); } require_once('../../include/view/item2.php'); close_db_connect($link); item2.php <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>商品一覧ページ</title> </head> <body> <h1>商品一覧</h1> <form class="form" method="post" action="item.php"> <div class="cart_img"> <p class="margin"> <a href='../../mvc/cart.php'> <img src='../file/ショッピングカート.png'> </a> </p> </div> <div class="parent"> <?php if (!empty($data)) { foreach ((array)$data as $product) { ?> <? php print htmlspecialchars($product,ENT_QUOTES,'UTF-8'); ?> <?php if ((int) $product['status'] === 0) { ?> <?php } else { ?> <div class="product"> <div class="product_name"> <p class="margin"> <input type="hidden" name="name" value="<?= $product['name'] ?>" /> <?php { print $product['name']; }?> </p> <?php } ?> </div> <?php if ((int) $product['status'] === 0) { ?> <?php } else { ?> <div class="product_price"> <p class="margin"> <input type="hidden" name="price" value="<?= $product['price'] ?>" /> <?php { print $product['price']; }?> 円</p> <?php } ?> </div> <?php if ((int) $product['status'] === 0) { ?> <?php } else { ?> <div class="product_img"> <p class="margin"> <img src="<?php print $product['img']; ?>"> </p> </div> <?php if ((int) $product['status'] === 0) { ?> <?php } else { ?> <div class="product_buy"> <input type="hidden" name="stock" value="<?= $product['stock'] ?>" /> <?php { print $product['stock']; } if ((int) $product['stock'] === 0) { ?> <div class="sold_out"><?php print '売り切れ'; ?></div> <?php } else { ?> <input type="submit" name="cart" value="カートに入れる" /> <input type="hidden" name="sql_kind" value="cart"> <input name="id_s" type="hidden" value="<?php echo $product['id']; ?>"> <?php } ?> <?php } ?> <?php } ?> <?php } ?> <?php } ?> </div> </div> </div> </form> </body> </html>

試したこと

SQLなどのWHERE文の条件式などを変えてみたが、逆にレコードが作成できなくなったりした。

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

Cloud9

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

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

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

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

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

guest

回答1

0

DBのIDに主キー設定している(主キー設定しないと、編集アイコンが出ませんので、質問の写真でわかります)場合、必ずユニーク制御されますので、同じIDを投入することはできません。amountで数量を制御しているようですが、主キーがIDだけである限り、同じIDの値は複数入ることは絶対ありません(DBのユニーク制御違反)ので。

同じIDの商品を複数投げ込みたい場合は、シーケンスかタイムスタンプなどを用いて複合主キーを用いる必要があります。

そのため、商品マスタとは別に、買い物かごトランザクションを作成する必要があります。

追記
その質問の写真を見てわかったのですが、シーケンスで商品を登録しています(AUTO INCREMENTが表示されている)。それだと、どんな順番で入れてもそのシーケンスでしか入っていきませんので、1つ目の質問通り、どうやっても順番どおりの番号になります。なので、商品コードと買い物かごに入れる順番のID(制御用シーケンス)は別にしておく必要があります。

その場合はシーケンスだけを主キーとして、それとは別に商品コードを記述する必要があります(この場合は、主キー制御する必要はない)。

投稿2021/12/16 04:21

編集2021/12/17 00:53
FKM

総合スコア3647

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問