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

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

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

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

PHP

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

2回答

363閲覧

変数の表示についてです

toll_tree

総合スコア199

MySQL

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

PHP

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

1クリップ

投稿2019/05/04 09:29

編集2019/05/05 00:18

以下のコードにつきまして、お聞きしたいことがございます。

php

1<?php 2session_start(); 3include 'shop_class.php'; 4 5if(!isset($_SESSION['id'])){ 6 header('Location:login.php'); 7} 8 9$shop = new Shop('mysql:host=localhost;dbname=ec_website','root','12345'); 10$product_list = $shop->line_up_product(); 11$stock_list =$shop->display_quantity(); 12$success_msg = ''; 13 14 15 16if($_POST){ 17 // var_dump($_POST); 18 // exit(); 19 $user_id = intval($_SESSION['id']); 20 $product_name = $_POST['name']; 21 22 $img = $_POST['img']; 23 $price = $_POST['price']; 24 $product_id = intval($_POST['product_id']); 25 26 var_dump($product_id); 27 //exit(); 28 29 $item_check = $shop->cart_check($user_id,$product_id); 30 //var_dump($item_check); 31 32 33 34 35 if(!$item_check){ 36 // try{ 37 $shop->add_select_item($user_id,$product_id); 38 $shop->decrease_stock($product_id); 39 // }catch(PDOException $e){ 40 // echo $e->getMessage(); 41 // } 42 43 echo __LINE__; 44 $success_msg = 'カートに登録しました。'; 45 header('Location:top.php'); 46 //exit(); 47 48 }else{ 49 $shop->update($product_id); 50 $shop->decrease_stock($product_id); 51 echo __LINE__ . PHP_EOL; 52 $success_msg = 'カートに登録しました。'; 53 header('Location:top.php'); 54 //exit(); 55 } 56 57} 58 59?> 60 61 62<!DOCTYPE html> 63<html lang="ja"> 64<head> 65 <meta charset="UTF-8"> 66 <link type="text/css" rel="stylesheet" href="./css/top.css"> 67 <title>トップページ</title> 68</head> 69<body> 70 <header class="header_box"> 71 <a href="top.php" class="top_logo"> 72 <img class="logo" src="./images/logo.png" alt="CodeShop"> 73 </a> 74 75 <p class="user_name"> 76 ユーザー名:<?php echo $_COOKIE['name']; ?> 77 </p> 78 <a href="cart.php"> 79 <img src="./images/cart.png"> 80 </a> 81 <a href="logout.php" class="logout"> 82 ログアウト 83 </a> 84 </header> 85 <p><?=$success_msg ?></p> 86 <div class="content"> 87 88 <?php for($i = 0; $i < count($product_list); $i++): ?> 89 <?php 90 $list = $product_list[$i]; 91 $stock = $stock_list[$i]; 92 // var_dump($list['id']); 93 94 ?> 95 96 <div class="content_list"> 97 <img src="<?=$list['img']?>" width="300px" height="300px"> 98 <div class="wrap_content"> 99 100 <p class="item_name"><?=$list['name']?></p> 101 <!-- <?php var_dump($list['item_id']); ?> --> 102 103 <p><?=$list['price']?></p> 104 </div> 105 <?php if($stock['stock'] > 0): ?> 106 <form action="top.php" method="post"> 107 <input type="submit" value="カートに入れる" class="cart_send"> 108 <input type="hidden" name="name" value="<?=$list['name']?>"> 109 <input type="hidden" name="img" value="<?=$list['img']?>"> 110 <input type="hidden" name="price" value="<?=$list['price']?>"> 111 <input type="hidden" name="product_id" value="<?=$list['id']?>"> 112 <input type="hidden" name="user_id" value="<?=$_SESSION['id']?>"> 113 <?php else: ?> 114 <p class="err_msg"> 売り切れ</p> 115 <?php endif;?> 116 </form> 117 </div> 118 119 <?php endfor;?> 120 121 </div> 122 123 124</body> 125</html> 126

上記コードを実行した結果の画像が、下記になります。
イメージ説明
カートに入れるボタンを押す(POST)すると、「if($_POST){」移行の処理がなされ、データベース接続処理などを行っているのですが、F5の更新により、post処理が2重にされないため、データベース接続処理が終わった後、「header('Location:top.php');」を行っております。しかしheaderで飛ばしてしまうと、成功を表示する為の$success_msgの値がリセットされてしまい、成功メッセージが表示できません
上記の問題を解決するには、どうすれば良いでしょうか?
ご助言頂ければ幸いです。
よろしくお願いします。
追記です。
以下は自身へのリダイレクトを行った際のセッション変数へ成功メッセージを格納したコードです

php

1<?php 2session_start(); 3include 'shop_class.php'; 4 5if(!isset($_SESSION['id'])){ 6 header('Location:login.php'); 7} 8 9$shop = new Shop('mysql:host=localhost;dbname=ec_website','root','12345'); 10$product_list = $shop->line_up_product(); 11$stock_list =$shop->display_quantity(); 12$success_msg = ''; 13 14 15 16if($_POST){ 17 // var_dump($_POST); 18 // exit(); 19 $user_id = intval($_SESSION['id']); 20 $product_name = $_POST['name']; 21 22 $img = $_POST['img']; 23 $price = $_POST['price']; 24 $product_id = intval($_POST['product_id']); 25 26 var_dump($product_id); 27 //exit(); 28 29 $item_check = $shop->cart_check($user_id,$product_id); 30 //var_dump($item_check); 31 unset($_SESSION['success_msg']); 32 33 34 35 if(!$item_check){ 36 // try{ 37 $shop->add_select_item($user_id,$product_id); 38 $shop->decrease_stock($product_id); 39 // }catch(PDOException $e){ 40 // echo $e->getMessage(); 41 // } 42 43 echo __LINE__; 44 45 $_SESSION['success_msg'] = 'カートに登録しました。'; 46 47 48 49 header('Location:top.php'); 50 //exit(); 51 52 }else{ 53 $shop->update($product_id); 54 $shop->decrease_stock($product_id); 55 echo __LINE__ . PHP_EOL; 56 $success_msg = 'カートに登録しました。'; 57 $_SESSION['success_msg'] = $success_msg; 58 header('Location:top.php'); 59 60 //exit(); 61 } 62 63} 64 65?> 66 67 68<!DOCTYPE html> 69<html lang="ja"> 70<head> 71 <meta charset="UTF-8"> 72 <link type="text/css" rel="stylesheet" href="./css/top.css"> 73 <title>トップページ</title> 74</head> 75<body> 76 <header class="header_box"> 77 <a href="top.php" class="top_logo"> 78 <img class="logo" src="./images/logo.png" alt="CodeShop"> 79 </a> 80 81 <p class="user_name"> 82 ユーザー名:<?php echo $_COOKIE['name']; ?> 83 </p> 84 <a href="cart.php"> 85 <img src="./images/cart.png"> 86 </a> 87 <a href="logout.php" class="logout"> 88 ログアウト 89 </a> 90 </header> 91 92 <p><?php if(isset($_SESSION['success_msg'])){ echo $_SESSION['success_msg'];} ?></p> 93 <div class="content"> 94 95 <?php for($i = 0; $i < count($product_list); $i++): ?> 96 <?php 97 $list = $product_list[$i]; 98 $stock = $stock_list[$i]; 99 // var_dump($list['id']); 100 101 ?> 102 103 <div class="content_list"> 104 <img src="<?=$list['img']?>" width="300px" height="300px"> 105 <div class="wrap_content"> 106 107 <p class="item_name"><?=$list['name']?></p> 108 <!-- <?php var_dump($list['item_id']); ?> --> 109 110 <p><?=$list['price']?></p> 111 </div> 112 <?php if($stock['stock'] > 0): ?> 113 <form action="top.php" method="post"> 114 <input type="submit" value="カートに入れる" class="cart_send"> 115 <input type="hidden" name="name" value="<?=$list['name']?>"> 116 <input type="hidden" name="img" value="<?=$list['img']?>"> 117 <input type="hidden" name="price" value="<?=$list['price']?>"> 118 <input type="hidden" name="product_id" value="<?=$list['id']?>"> 119 <input type="hidden" name="user_id" value="<?=$_SESSION['id']?>"> 120 <?php else: ?> 121 <p class="err_msg"> 売り切れ</p> 122 <?php endif;?> 123 </form> 124 </div> 125 126 <?php endfor;?> 127 128 </div> 129 130 131</body> 132</html> 133

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

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

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

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

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

guest

回答2

0

セッションまたはクエリストリング
というか、二重送信防止対応する方が先ですね。

投稿2019/05/04 11:53

編集2019/05/04 11:56
m.ts10806

総合スコア80850

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

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

toll_tree

2019/05/04 12:27

ご回答ありがとうございます。 「tanishi_a」さんへの返信でも書かせて頂いたのですが、セッションにいれた場合ですと、postされて以降、再度更新した場合、postしていなくても、メッセージが残り続けてしまう点はどうにかしたい部分ではあるんですよね
m.ts10806

2019/05/04 20:31 編集

用が済んだら削除すれば良いかと。 メッセージが定型句なら渡すのはコードとかフラグにしておいてそこから引いてくるのが定石です。変わるかもしれない文章をそのままセッションに持っておくのはリスクでしかないですし。
toll_tree

2019/05/04 21:56

セッションに、heaerに飛ばす前に、「 $_SESSION['success_msg'] = $success_msg;」などとして、メッセージをセッションに格納するとして、どこのタイミングで削除すべきでしょうか?
m.ts10806

2019/05/04 23:35

heaerというのはないのでコメントとはいえ正確に記載してほしいものですが… 私は「用が済んだ後」と書いてます。その「用」がなにかはアプリの仕様なので自身で決められた「用」 が済んだタイミングで良いです。
toll_tree

2019/05/04 23:42

あ、もちろんそうなのですが、今回質問させて貰った場合ですと、header関数で飛ばす前に、セッション変数に格納していますが、header関数で飛ばした後に、セッション変数に格納したメッセージを表示すると、その後、再び、再読み込みを行った場合も、セッション変数に格納されたメッセージが表示されてしまいます。そうなると、成功メッセージが都度表示されてしまう形となるので、そこの部分を解決したいと思っているんですよね
m.ts10806

2019/05/04 23:46

unsetしてないからです。 せっかく手元に環境とコードがあるのでしたら試されてはと。 繰り返しますが「用が済んだら削除」なので、その「用」が何か、は自身で見極めてください。 一行追加するだけなのですから色々やってみてください。セッションについてはPHPマニュアルにもしっかりページを割かれて書かれているので必ず確認のこと。
toll_tree

2019/05/04 23:55

unsetは試しましたが、header関数によりセッション変数を削除した場合、成功メッセージは表示されなくなってしまう為、うまくいかなかったですね...
m.ts10806

2019/05/05 00:01

そのコードはどこにありますか? ※そもそも現在提示されてるコードもheaderの前に出力のある、構文エラーの出るコードなので微妙ですが
toll_tree

2019/05/05 00:09

unsetの位置を変えてみましたら、メッセージは表示されましたが、今度はpostしていなくても再読み込みを行うと、セッション変数が表示されてしまいますね。 コードは追記しました
m.ts10806

2019/05/05 00:14

補足説明追加しておいてください。 「自身へのリダイレクト」と。
toll_tree

2019/05/05 00:18

追記しておきました
m.ts10806

2019/05/05 00:19

自身ならリダイレクトの必要なさそうには思いますけど・・。 それこそトークンによる多重送信チェックで終わる話ではないでしょうか。
toll_tree

2019/05/05 00:25

更新された場合を考慮して、リダイレクト処理を書いたんですよね。
toll_tree

2019/05/05 00:26

トークンによるチェック方法は、分かりづらかったのですが、もう少し調べてみたいと思います
toll_tree

2019/05/05 00:47

トークンによる、チェック方法がいまいちつかめないのですが、今回の質問とは、別になってしまいますし、新たな質問を立てた方がよいですかね?
m.ts10806

2019/05/05 00:58 編集

いずれにしても「セッション」は持ち「回る」ために保持するものなので、変数に持たせる基準と同じく、使うタイミングが一度しか使わないもののために色々考慮しなければならない作りにするのは効率もメンテナンス性も悪いです。特に自身へのリダイレクトという点で。 別画面へ遷移させないのであればせめてクエリストリングつけて明確な分岐を持たせた方が良いですね。そしたらセッションに持たせる必要もないですし。メッセージだけが表示されてもただそれだけで何か処理が行われるわけではないです。 組んだようにしか動きませんし、プログラムはプログラムの仕様通りにしか動かないので、「やりたいように組む」より「プログラムとして自然な動きを組む」ほうがスッキリします。 ちなみに私であれば処理は全部Ajaxで処理させて結果受け取ってJavaScriptで結果表示させます。
m.ts10806

2019/05/05 00:55

トークンによるチェック、CSRF対策についてはすでに過去質問に何度も出ていますし、優良な記事もたくさんあるので、即質問するのはあまりよくないです。 自身でもっと試してから質問しないと、今の段階では丸投げでしかなくなりますよ。
toll_tree

2019/05/05 01:01

やはり、javascriptの知識は必要になってくるわけなんですね... 僕自身は、amazonのカートに入れた際に、別画面へ遷移させず、カートの中身だけが、ストックされるシステムを作成したかったんですよね。
toll_tree

2019/05/05 01:05

どのみちjavascriptの勉強は必要なことだとは思っていたので、この機会に勉強してみますかね。 やっぱり、webエンジニアを目指すなら、javascriptはできなければいけないでしょうしね
m.ts10806

2019/05/05 01:07

なら余計にajaxですね。 変わる箇所はカートのところだけなのに画面遷移させる必要はないです。 WebやるのにJavaScriptを避けて通れるものではないです。 特にフレームワークで役割分担をさせる場合、画面上でおきる描画などは全部JavaScriptで行って、サーバーサイドは画面出力を伴わない処理のみという作りもあります。 画面表示があるならhtml,CSSは当然必要な技術ですしね。
toll_tree

2019/05/05 01:11

正直今、javascriptを学ぶか、それとも、PHPのフレームワークを学ぶか、非常に迷っていますw PHPエンジニアとして、働いていきたいと思っているので、だったら、PHPのフレームワークを学んだ方が、良いのではないかとね。。。 まぁどのみちどっちともやらなければいけないのかもしれませんが...
m.ts10806

2019/05/05 01:19

基本的に、同時進行です。
toll_tree

2019/05/05 01:23

大変ですが、やっていくしかないんですね
m.ts10806

2019/05/05 01:45

文法に大きな違いがないのはどの言語もおなじですし、ロジックを組み立てる能力のほうが問われるので。 Webにほぼ特化しているPHPとの親和性は高いですしね。 逆に身に付けないと今後苦しくなってくるのは見えてます。 私も仕事柄、生きていくために必要であると身に付けたので特に大変とは思いませんでした。 トレーニングするにしてもあえてJavaScriptと連動させるような課題や設計にすることで使わないと成り立たないようにできます。
guest

0

F5 を押しても $success_msg の値を残したいということですか。
'id' と同じように、$_SESSION に入れれば良いように思いますが、どうでしょう。

消すタイミングは気をつける必要があると思いますが。

見当違いのことを言ってたらすみません

投稿2019/05/04 11:58

tanishi_a

総合スコア484

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

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

toll_tree

2019/05/04 12:25

いえいえ、ご回答頂きありがとうございます。 >F5 を押しても $success_msg の値を残したいということですか。 いえ、すみません。自分の質問の仕方が悪かったです。 カートに入れるを押す(post)したら、$success_msgの値を表示したいと考えております。 しかし、コード内で、postが送られた際の処理を終えた後に、headerにより再読み込みを行わなければ、リロードした際に、またpost処理が行われてしまうと思った為です。 仮に、「$_SESSION['success_msg'] = 'カートに登録しました';」のようにセッションに入れたとした場合、headerにより、再読み込みが行われた後、もう一度、F5などで、更新した場合も、$success_msgが残ってしまいます。そうなった場合のカートに追加していない場合にも、登録したとのメッセージが残ってしまう点をどうしようかなとは思っているんですよね...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問