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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

645閲覧

ページの遷移は行わず、成功メッセージを表示させる方法

toll_tree

総合スコア199

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2019/05/07 03:14

編集2019/05/07 07:59

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

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 45 $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 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 echo $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 id="cart_btn" 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 123 <?php endif;?> 124 </form> 125 </div> 126 127 <?php endfor;?> 128 129 </div> 130 131 132</body> 133 134</html> 135

上記コードを実行した結果は、下記の画像になります。
イメージ説明
カートにいれるボタンを押した後、$success_msgにより、「カートに登録しました」との表示を行いたいのですが、2重登録防止のために設定した、header関数の影響でうまくいきません。
セッション変数に成功メッセージを入れ、表示する方法も試したのですが、やはりうまくいきません。
そこで、javascriptの機能を使い、どうにかできないかと思っているのですが、上記問題を解決できる方法をご存じでしたら、教えて頂けないでしょうか。
ご教示いただけましたら、幸いです。
よろしくお願いします。
追記です。
ミニマムコードとともに、お聞きしたい部分をまとめた、質問を新たに立てさせて貰いました。

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

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

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

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

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

CHERRY

2019/05/07 03:20 編集

質問の本文が表示されていないようです。 質問を編集して、本文を記載していただけないでしょうか。 すいません。コメント後にリロードしたら修正されていたので、入れ違いだったようです。
toll_tree

2019/05/07 03:21

現状、自分のPCからは、見えているのですが、更新してもダメでしょうか?
退会済みユーザー

退会済みユーザー

2019/05/07 03:51

質問者さんのおかれている状況やトラブルの実態を、第三者が掌握して的確なアドバイスをしようにも、実データがあるわけでもなく断片的なphpコードを見せられているだけでは、正直よくわからんのですよ。だから当てずっぽうの当たり障りのない回答しか寄せられない。なのに、より具体的な解決方法をって、なんの無理ゲーですかと。質問者さんがもっと情報提供の工夫をする(データベースがなくても第三者が再現できるミニマルなコードを示すとか)しないと、解決に至らないですよ。
m.ts10806

2019/05/07 04:02

回答しておいてなんですが、「以下のコードについて聞きたい」と書きつつ実現手段を聞いているので最初と最後がかみ合っていない状態となっています。 あと「うまくいかない」は誰にも何も伝わらない表現方法なのでできるだけ使わないほうが良いです。 https://teratail.com/help/question-tips#questionTips3-4-1 >実際今何が起きていてどうなっているのかが書かれていない https://teratail.com/help/question-tips#questionTips3-5-2 >「わからない」「うまくいかない」と書いただけではあなたがどのステップまで進んだのか、他のユーザーにわかりません。 そのあたりは、自身で質問をゴリゴリ書くよりも質問テンプレートを使われたほうが読む側にやさしい内容になるので、工夫願います。
toll_tree

2019/05/07 04:04

分かりました。できるだけ、詳細に質問内容を記載するように気を付けたいと思います。
guest

回答2

0

Ajax

php側の処理はすべてajaxで、実行結果を受けとってJavaScriptで表示


実装するとなった場合の、具体的な処理方法

いきなり実装を考えるとAjaxでなくともパンクするのは熟練者でも同じです。
まずは手順を文章で書きだします。

  1. 入力値をAjaxでphpプログラムに送信する
  2. phpプログラムで送信された値を受け取る
  3. バリデーションを行う
  4. バリデーション結果、NGならエラーを出力として返す→JavaScriptに戻る
  5. バリデーション結果、OKなら登録処理を行う
  6. 登録処理結果、NGならエラーを出力として返す→JavaScriptに戻る
  7. 登録処理結果、OKなら成功を出力として返す→JavaScriptに戻る
  8. Ajaxの結果を受け取り、NG,OKを通知する

ここで「出力して返す」について何をどのように返すかは仕様なので決めるところです。
「NG,OKを通知する」についても同じですね。
一般的に採用されるのはJSONでのやり取りですが、JSONはあくまで汎用性が高く扱いやすいというだけで、
単に0が成功1がバリデーションエラー9がシステムエラーなどコード決め打ちで返すこともあります。
(バリデーションエラーの場合はエラーメッセージもセパレータで返したり)

そこは決めるだけなので、決めてもらえば良いとして、
とりあえずは上記のような手順を自身で書きだして不足分は埋めて過剰分は抜いて「文章化」してください。
これはAjaxに限らず全てです。いきなり実装を考えると最初と最後でコードの質や整合性が保てずパンクして、
あっちを修正こっちを修正するうちにどんどんスパゲッティ(&ファット)コードになっていきます。
この「手順」は「詳細設計」にあたるものなので、これを考えることでロジックも身についていきます。
そして無駄なコードも減り、すべてが意味のあるコードになります。(自身でも説明できるコードになる)

もちろん、個々の手順も一気に実装するのではなく1つ1つ単体で確認していきます。
phpから返す情報も最初は固定値で、次に変数で、次に送信された情報で・・・とステップアップしていきます。
この方が着実で、実はいきなり実装に取り組むより早く済みます。
熟練者でもいきなり全実装にかかえる人はいないのではないでしょうか。(使える既存コードが手元にあるならともかく)

投稿2019/05/07 03:24

編集2019/05/07 04:29
m.ts10806

総合スコア80850

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

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

toll_tree

2019/05/07 03:26

Ajaxについては、調べたのですが、実装するとなった場合の、具体的な処理方法が分からなかったんですよね。。 もう少し、詳細に教えて貰えないでしょうか?
m.ts10806

2019/05/07 03:29

どこをどう調べたか質問本文に記載してください。 基本的にはgetかpostでphpに送信してロジック自体は同じで出力部分だけ気を付ければ良いはずです。 ミニマムコードを試すことからやると良いです(送信した値に固定文字列付け足して返すだけとか)
m.ts10806

2019/05/07 03:30

「php ajax」で調べれば優秀な記事は溢れてますし、詳細はそれで事足りる印象です。
m.ts10806

2019/05/07 03:37

あれ?なんで低評価。
退会済みユーザー

退会済みユーザー

2019/05/07 03:37

いきなりマネしようとしてもできないでしょうから、ミニマルなテストコードを書いて試してからにしたほうがいいよ。今の作りかけにいきなり組み込むのは危険。
toll_tree

2019/05/07 03:53

分かりました。まずは、ミニマムコードで、ajaxの処理など試してみたいと思います
toll_tree

2019/05/07 06:03

実は、ajax通信についての理解が出来ていないことが原因なのかもしれませんが、mtsさんにお聞きしたいことがあるのですが、mtsさんは、ajaxを使用し、今回質問させて貰った問題をどのように、解決できると判断されたのでしょうか?
m.ts10806

2019/05/07 06:10

「ページの遷移は行わず、成功メッセージを表示させる」というタイトルから、で十分に判断できます。 formタグによる送信=画面遷移が発生する、ので、結局のところ「画面遷移させずにサーバー側の処理をさせる」が命題となり、Ajaxが最も有用である手段であるからです。 というかWebをやっている人なら「ページ遷移を伴わなずにサーバー側で処理を行う」要件ならAjaxは筆頭手段となるものです。 Ajaxは非同期通信による処理です。非同期なので画面操作を奪うことなく処理が行われます。なので「画面遷移をさせずにサーバー側で処理を行う」ことができます。 あとは私が追記した手順でミニマムコードで部品を作って確認しつつ結合させていけば良いかと。
m.ts10806

2019/05/07 07:35

あのコードでどこがAjax…? 私の回答も、m6uさんが提示された記事も読んでない…?
toll_tree

2019/05/07 07:41

今回の質問させて頂いた内容が、詳細に伝わっていないとのご指摘を受けた為、ミニマムコードを作成し、お聞きしたい部分のみ、ピンポイントで質問させて貰った形です
m.ts10806

2019/05/07 07:43

で、あれば今回の質問に追記すべきでは? こちらではAjaxの提案をうけ、あちらでは同等のコードで別のアドバイスをうけ、では余計にコードの整合性がとれなくなると思いますが。 (こちらが中途半端な状態で浮いてしまって行き所もなくなるように思います)
toll_tree

2019/05/07 07:52

うまく、意図が伝わっていないとの指摘を受けた為、自分の解決したい問題がきっちりと伝わっているか分からなかった為、一度新たに質問を立て直した方が良いかと思いまして。。 こちらにも、追記しておきます。
guest

0

自己解決

こちらの質問にて、今回お聞きしたかった部分が解決されましたので、今回の質問は解決済みとさせて頂きます。

投稿2019/05/07 11:25

toll_tree

総合スコア199

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問