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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

241閲覧

submitしてもsessionの変数をサーバーが取得して処理しない

SugiuraY

総合スコア317

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2019/06/20 04:03

編集2019/06/20 06:35

下記のように

  1. でpostの値を受け取り、その内容に問題がなければ
  2. $_SESSION['name']=$username;を格納し
  3. ページがリフレッシュされ、$_SESSION['name']が!is_nullではないのでb.phpに遷移する、一方で受け取った内容にエラーがあれば_SESSION['name']=$usernameされないので、 $_SESSION['name']=$username;画されず、a.php上でエラーメッセージが表示される

ということを期待してコードを書いたのですが、実際にはb.phpには遷移をしてくれません。
またエラー表示もされずに同じa.phpが表示されるのですが、そこからページをリロードすると
b.phpに遷移されます。

ここから考えられることはsubmitされてページが再度読み込まれた時点では

<?php session_start(); if(!is_null($_SESSION['name'])){//ログイン済みの場合はリダイレクト header('Location:b.php'); exit; } ?>

が実行されていないということなのですが、この原因を解決方法についてアドバイスをいただけますでしょうか。
よろしくお願い申し上げます。

a.php

php

1<?php 2session_start(); 3 if(!is_null($_SESSION['name'])){//ログイン済みの場合はリダイレクト 4 header('Location:b.php'); 5exit; 6 } 7 8//POSTが成功した場合の処理 9if($_POST['category']==="posting_a" && $_POST['token']===$_SESSION['token']){ 10 //(中略)POSTされたデータの判定処理、もしエラーが含まれる場合には$error[]にエラーコードを格納 11 if(empty($error)){ 12 //(中略)ポストされたデータにエラーがなければの処理 13 //$username = $_POST['username']でユーザから受け取ったusernameをここでMYSQLに格納する処理をしています 14 $_SESSION['name']=$username;//ここで格納している 15 } 16 17} 18?> 19 20<form method="POST" id="posting" action=""> 21 <input type="text"> 22 <input type="hidden" name="category" value="posting_a"> 23 <input type="hidden" name="token" value="<?php echo $_SESSION['token']?>"> 24 <button form="posting" type="submit"></button> 25</form> 26 27<div class="err_message"> 28 <?php if(!empty($error)):?> 29 <!--htmlでエラーメッセージの出力--> 30 <?php endif;?> 31</div> 32

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

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

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

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

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

m.ts10806

2019/06/20 04:10

$_SESSIONをvar_dump()で確認した結果を追記してください
SugiuraY

2019/06/20 04:21

コメントありがとうございます。 <?php session_start(); var_dump($_SESSION['name']) if(!is_null($_SESSION['name'])){//ログイン済みの場合はリダイレクト header('Location:b.php'); exit; } ?> で名前が出力されたはず(当然その後のリダイレクトはされなくなりますが)なのですが いまランチ休憩が終わって職場に戻ってしまったので、夕方に改めて検証して正確な情報を追記させて頂きます。 宜しくお願い申し上げます。
m.ts10806

2019/06/20 04:29

いえ、$_SESSION['name']ではなく$_SESSIONです。 あとそこで処理を止めて確認したい情報のみ出るようにする必要があります(他はノイズなので) var_dump($_SESSION);exit; としてください。
m.ts10806

2019/06/20 04:31

というかb.phpへのリダイレクトを冒頭に書いてるのでしたら $_SESSION['name']への保管がそれより後なのでb.phpに遷移しないのは当然と言えば当然ですが・・・
m.ts10806

2019/06/20 04:34

あと if(empty($error)){//ポストされたデータにエラーがなければの処理 } となっていて、エラーないときに何も処理が書かれていません。
SugiuraY

2019/06/20 04:44 編集

コメントありがとうございます。 具体的には if(empty($error)){//ポストされたデータにエラーがなければの処理 //ここでPOSTの値をMYSQLに格納 }//また$_SESSION['name']に値が入力されないため、リダイレクトされずに 以下の離れた場所に、エラーがあった場合の処理という構造にしております。 <div class="err_message"> <?php if(!empty($error)):?> <!--htmlでエラーメッセージの出力--> <?php endif;?> </div>
m.ts10806

2019/06/20 04:45

コードの流れを分かりやすく整理いただけますか? <?php ~ ?> の外に //a.php のように書いても画面にそのまま表示されるだけですし、 もしファイルがちがうのでしたら コードブロックをわけていただいたほうが分かりやすいです なるべくコードだけを入れて補足は外に書いてください。
SugiuraY

2019/06/20 05:01 編集

申し訳ございません。少し修正をしてみたのですが、ご意図を汲み取れていたなければ改めてご指摘願えますでしょうか、このようなご指摘も初学者の私にはとても勉強になります。 *コメントアウト自体をコードの中には入れるべきではないということであれば削除します。 また、上記のコード自体がa.phpであり成功して遷移させたいのがb.phpなのですが、teratail様はファイルには種類しか名前をつけれないため、a.phpが今回のコードの対象になっているという点を質問本文に記載することとしました。良かれと思っての配慮だったのですが、やはり普段見慣れている方からすると見づらいのですね、、
m.ts10806

2019/06/20 05:41 編集

私の場合はよくこうやって書きます。 a.php ```php ``` b.php ```php ``` なるべくコードブロックの近くにあったほうがいいですね。 ちょっと離れるのは離れるので「画面出力に関わらないように」という配慮では下記でしょうか。 ```php <?php //a.php ``` ```php <?php //b.php ```
SugiuraY

2019/06/20 06:04

コメントありがとうございます。 確かに見通しがよいですね。アドバイスに基づき、修正をさせていただきました。 宜しくお願いもうしあげます。
m.ts10806

2019/06/20 06:05

そういえば、$usernameってどこでどのように設定されるのでしょうか。 今の作りだと$errorがあってもなくても入っています。
SugiuraY

2019/06/20 06:36

誠に申し訳ございません。 $_SESSION['name']=$username;はif(empty($error))の条件式の中に記載すべき内容であったためコードを修正しました。 最も記載を待ちがっってはいけない場所でした。。改めてお詫びいたします。
m.ts10806

2019/06/20 06:39

おおなるほど。 $_POST['username']のような記述がないのでどこからどう設定されるんだろう・・と思ってはいました。 ということはa.php自体も別のプログラムから実行されるのでしょうか。
SugiuraY

2019/06/20 06:56

いえ、、a.php自体がユーザー登録画面ページそのもので、なにか他のプログラムをトリガーにして実行されるものでありません。 ユーザー登録ページ上で  ●正しく情報が登録されれば、$_SESSION['username']に値が格納される→submitで自分自身のページがリフレッシュされる→リフレッシュされれば!is_null($_SESSION['username'])でtrue判定になるのでリダイレクトされる  ●正しく情報がとうろくされなければ、$_SESSION['username']に値が格納されない→submitで自分自身のページがリフレッシュされる→リフレッシュされても!is_null($_SESSION['username'])でfalse判定になるので、リダイレクトされずにそのまま処理が流れていき、if(!empty($error))でtrueになるので同じ登録ページ上でエラーが表示される という仕組みを一つのページで構築していました。 従って、リダイレクト先でb.php等を便宜上記載しておりますが、あまり本件においては意味をもって記載させて頂いたわけではなく、すべてa.phpの中だけの話でお問い合わせをさせていただいたつもりでした。 そもそも構造的にあまりそのようなことはしない等のご指摘もあるかもしれませんが、宜しくお願い申し上げます。
m.ts10806

2019/06/20 07:29

なるほど。そういうことですね。おおよそ分かりました。 不都合ないような作りにできるのでしたら1ページでやろうと機能毎にページをわけようと使っている方としては問題ないと思います。 頑張れば一覧、登録、編集、削除を1ファイルで対応することも可能ですしね。 本来はもう少し突っ込んだほうが良さそうとは思いますが、「ちょっとやってみて」レベルの回答をひとまず置いておきます(時間に余裕ができれば追記します)
guest

回答1

0

ベストアンサー

コメントで若干触れましたが、タイミングとしては「入力チェックOK」のタイミングでセッションに格納されているからだと思います。

格納した後、自身に対してリダイレクトするようにしてはいかがでしょうか。

php

1 if(empty($error)){ 2 3 //中略 4 5 $_SESSION['name']=$username; 6 header('Location:'.$_SERVER['REQUEST_URI']); 7 exit; 8 }

そうすることでセッションに格納された状態で冒頭から処理が流れるのでif(!is_null($_SESSION['name'])){も通ると思います。

投稿2019/06/20 07:34

m.ts10806

総合スコア80850

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

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

SugiuraY

2019/06/20 08:04

コメントを頂き誠にありがとうございます。あと一時間で定時で帰れるので、すぐに動作を試してみたいです。また、お仕事中の時間であろうと思うのに、お付き合いを頂き、本当に申し訳ございません。 さて、本来試してからお尋ねすべきなのですが、どうしても違和感を感じてしまうのですが、 ①入力チェックのタイミングせ$_SESSION['name']に格納する ②submit(HTML)の標準機能(action)でページがリフレッシュされまたスクリプトが上から、サーバーサイトでも解釈される ③すると当然<code>if(!is_null($_SESSION['name']))</code>にかかってリダイレクトか否か分岐される という流れを予想していたのですが、なぜこの位置で$_SESSIONに格納するとsubmitのリフレッシュの段階ではサーバーは処理をしてくれないのでしょうか? 恐らくですが当たり前かもしれない頂いたコメントの "「入力チェックOK」のタイミングでセッションに格納されているからだと思います。 の点が理解できていないからだと思うのですが、ご教示いただけると嬉しいです。 宜しくお願い申し上げます。
m.ts10806

2019/06/20 08:21

若干流れ読めてないかもしれませんが、画面表示するだけで何も実行してませんよね? ボタンを押すとかJavaScriptでsubmitするとかいう操作がどこにもないように見えます。
SugiuraY

2019/06/20 08:56

今仰っている意味がわかったかもしれません、サーバーでエラー判定されてから、上に戻るトリガーがないですね。。 実はリダイレクト処理をご指摘の箇所に入れなかったのは、header関数が改行等もそれ以前に入ることが許されず、うまく処理できないと思ったからなんですが、だから頭に持っていくという点が軽率でした。 なにも実行されてないですね。 有難うございます!
SugiuraY

2019/06/20 23:32

無事、意図した通りに動作させることができました。 今後はもっとコードの流れと実際の動きを順番を追って整理しながらコードを書いていきたいと思います。 お助けをいただき、誠にありがとうございました。
m.ts10806

2019/06/21 00:07

解決されたようでなによりです。 コードに組み込む前に軽くフローを書いてみたらいいかもしれませんね。そうすると机上で気づけることもあるかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問