下記のように
- でpostの値を受け取り、その内容に問題がなければ
- $_SESSION['name']=$username;を格納し
- ページがリフレッシュされ、$_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
$_SESSIONをvar_dump()で確認した結果を追記してください
コメントありがとうございます。
<?php
session_start();
var_dump($_SESSION['name'])
if(!is_null($_SESSION['name'])){//ログイン済みの場合はリダイレクト
header('Location:b.php');
exit;
}
?>
で名前が出力されたはず(当然その後のリダイレクトはされなくなりますが)なのですが
いまランチ休憩が終わって職場に戻ってしまったので、夕方に改めて検証して正確な情報を追記させて頂きます。
宜しくお願い申し上げます。
いえ、$_SESSION['name']ではなく$_SESSIONです。
あとそこで処理を止めて確認したい情報のみ出るようにする必要があります(他はノイズなので)
var_dump($_SESSION);exit; としてください。
というかb.phpへのリダイレクトを冒頭に書いてるのでしたら
$_SESSION['name']への保管がそれより後なのでb.phpに遷移しないのは当然と言えば当然ですが・・・
あと
if(empty($error)){//ポストされたデータにエラーがなければの処理
}
となっていて、エラーないときに何も処理が書かれていません。
コメントありがとうございます。
具体的には
if(empty($error)){//ポストされたデータにエラーがなければの処理
//ここでPOSTの値をMYSQLに格納
}//また$_SESSION['name']に値が入力されないため、リダイレクトされずに
以下の離れた場所に、エラーがあった場合の処理という構造にしております。
<div class="err_message">
<?php if(!empty($error)):?>
<!--htmlでエラーメッセージの出力-->
<?php endif;?>
</div>
コードの流れを分かりやすく整理いただけますか?
<?php ~ ?> の外に //a.php のように書いても画面にそのまま表示されるだけですし、
もしファイルがちがうのでしたら コードブロックをわけていただいたほうが分かりやすいです
なるべくコードだけを入れて補足は外に書いてください。
申し訳ございません。少し修正をしてみたのですが、ご意図を汲み取れていたなければ改めてご指摘願えますでしょうか、このようなご指摘も初学者の私にはとても勉強になります。
*コメントアウト自体をコードの中には入れるべきではないということであれば削除します。
また、上記のコード自体がa.phpであり成功して遷移させたいのがb.phpなのですが、teratail様はファイルには種類しか名前をつけれないため、a.phpが今回のコードの対象になっているという点を質問本文に記載することとしました。良かれと思っての配慮だったのですが、やはり普段見慣れている方からすると見づらいのですね、、
私の場合はよくこうやって書きます。
a.php
```php
```
b.php
```php
```
なるべくコードブロックの近くにあったほうがいいですね。
ちょっと離れるのは離れるので「画面出力に関わらないように」という配慮では下記でしょうか。
```php
<?php
//a.php
```
```php
<?php
//b.php
```
コメントありがとうございます。
確かに見通しがよいですね。アドバイスに基づき、修正をさせていただきました。
宜しくお願いもうしあげます。
そういえば、$usernameってどこでどのように設定されるのでしょうか。
今の作りだと$errorがあってもなくても入っています。
誠に申し訳ございません。
$_SESSION['name']=$username;はif(empty($error))の条件式の中に記載すべき内容であったためコードを修正しました。
最も記載を待ちがっってはいけない場所でした。。改めてお詫びいたします。
おおなるほど。
$_POST['username']のような記述がないのでどこからどう設定されるんだろう・・と思ってはいました。
ということはa.php自体も別のプログラムから実行されるのでしょうか。
いえ、、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の中だけの話でお問い合わせをさせていただいたつもりでした。
そもそも構造的にあまりそのようなことはしない等のご指摘もあるかもしれませんが、宜しくお願い申し上げます。
なるほど。そういうことですね。おおよそ分かりました。
不都合ないような作りにできるのでしたら1ページでやろうと機能毎にページをわけようと使っている方としては問題ないと思います。
頑張れば一覧、登録、編集、削除を1ファイルで対応することも可能ですしね。
本来はもう少し突っ込んだほうが良さそうとは思いますが、「ちょっとやってみて」レベルの回答をひとまず置いておきます(時間に余裕ができれば追記します)
回答1件
あなたの回答
tips
プレビュー