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

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

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

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

Q&A

解決済

2回答

4315閲覧

ショッピングカートの合計金額を表示したい。

schuloco

総合スコア3

PHP

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

0グッド

1クリップ

投稿2020/11/15 06:55

前提・実現したいこと

ショッピングカートの合計金額を表示したい。

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

ショッピングカート画面で、カートに入れたそれぞれの商品の商品名、数量、各商品の小計を表示するまではテキストを参考にして出来ています。それに追加して、最後にすべての合計金額を表示したいのですが、テキストには合計金額の表示は言及していなかったので、自分なりに調べながら、一応自分で何をしているか理解できている(と思う)範囲でコードを書き、合計金額も表示されました。それがコードとして正しいのかを見て頂けますでしょうか。また、もっと端的な良い方法があると思うのですが、何か別のコードの書き方があればご教示ください。

エラーメッセージ

該当のソースコード

PHP <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Shop</title> <link rel="stylesheet" href="shop.css" class="css"> </head> <body> <?php $cart=$_SESSION['cart']; /*カートに入った各商品のcodeが配列で入っている*/ $qty=$_SESSION['qty']; /*カートに入った各商品の数量が配列で入っている*/ $max=count($cart); /*カートに入った商品点数*/ $dsn='mysql:dbname=shop;host=localhost;charset=utf8'; $user='root'; $password=''; $dbh=new PDO($dsn,$user,$password); $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); foreach($cart as $key => $val) { $sql='SELECT name,price FROM table WHERE code=?'; $stmt=$dbh->prepare($sql); $data[0]=$val; $stmt->execute($data); $rec=$stmt->fetch(PDO::FETCH_ASSOC); $pro_name[]=$rec['name']; $pro_price[]=$rec['price']; } $dbh=null; ?> <?php for($i=0;$i<$max;$i++) { ?> 商品名: <?php print $pro_name[$i]; ?><br> 価格: <?php print $pro_price[$i]; ?>円<br> 数量: <?php print $qty[$i]; ?><br> 小計: <?php print $pro_price[$i]*$qty[$i]; ?>円<br> <?php } ?> <!--以下、合計金額を出すために、自分なりに考えたコードです。--> <?php for($i=0;$i<$max;$i++) { $sum[]=0; $sum[$i]=$pro_price[$i]*$qty[$i]; $total[]=array_sum($sum); } ?> 合計: <?php print $total[--$max];?> </body> </html>

試したこと

コードを見て頂ければ分かるように、forループで回して小計の配列を$sumという変数に入れ、配列の値を合計してくれるarray_sum()という関数を見つけたので、それを使って合計の値を$total[]という配列に入れ、配列の中の一番最後の値が合計金額になるはずなのでそれを取り出せばいいと思い(例えば商品が5つであれば、添え字が4になるように)、商品点数が入った$maxから1を引き(--$max)、$total[--$max]を表示させたところ、目的の合計金額が出ました。

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

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

改良点を挙げるなら、以下のポイントでしょうか。

1. ループの効率化

php

1for($i=0;$i<$max;$i++){...}

という同じものを2度回していますが、一つにまとめられます。

php

1<?php 2$total = 0; 3 4for($i=0;$i<$max;$i++) { 5 $sub_total = $pro_price[$i]*$qty[$i]; 6 $total += $sub_total; 7?> 8 商品名: <?php print $pro_name[$i]; ?><br> 9 価格: <?php print $pro_price[$i]; ?><br> 10 数量: <?php print $qty[$i]; ?><br> 11 小計: <?php print $sub_total; ?><br> 12<?php } ?> 13 合計: <?php print $total;?>

2. データベースとのやりとりはhtmlの表示とファイルを切り分ける
データベースからデータを取得したり、データの挿入・削除・更新などはファイルを切り分けてそれ用のclassを作成し、必要に応じて呼び出すという構成にした方が何かエラーが起きた際も原因が突き止めやすくなり保守がしやすくなります。
もし実際に運用することを前提とされている場合はセキュリティの観点からも既存のPHPフレームワークを使うことをお勧めしますが、その前に簡単なMVCモデルを自前で構築してみるのも勉強になると思います。

投稿2020/11/15 10:55

cerfweb

総合スコア1899

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

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

schuloco

2020/11/16 03:31

ご回答有難うございます。 $total += $sub_totalでスッキリと簡単に出すことが出来るのですね。データベースとのやりとりとhtmlの表示を別々のファイルに切り分けた方が良いというアドバイスも有難うございます。セキュリティの重要性は素人なりに認識しています。もしこの先実際に運用するようであれば、細心の注意を払いたいと思います。
guest

0

合計金額は小計とは異なり「1つ」だけなので、わざわざ配列にする必要はないかと思われます。
forループの前で変数を定義(初期化)しておき、ループの中で小計を加算すると整理できます。

(定義)$total = 0;

「forループ内の修正」
(現在)$total[] = array_sum($sum);
(修正)$total += $sum[$i];

投稿2020/11/15 10:48

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

schuloco

2020/11/16 03:33

ご回答有難うございます。 上記のcerfwebさんと基本的に同じ方法ですね。これがオーソドックスなコードなのですね。変数はforループの前に定義すべきという指摘も有難うございます。お二人をベストアンサーにしたいのですが、先に回答を下さったcerfwebさんに贈らせて頂きます。有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問