このシリーズの目的
体系的なwebコーディングの訓練ができるようになるために、PHPの初学のきっかけかつ、PHPでログインフォームやフォームを実装することができるようになるために
上記のチュートリアルを進めているのでその備忘録。
内容
今回のチュートリアル
PHP Tutorial: How To Pass Variables In PHP Using Sessions And Get Method
やったこと
PHPでGET及びSESSIONメソッドを使って変数をやりとりし、複数のウェブサイトにする。
成果物
<?php
session_start();
// session_destroy();
// unset($_SESSION['username']);
if(isset($_SESSION['username'])) { // すでに別の誰かがフォームに入力した名前を使ってる場合に任意のページにリダイレクトする
$url = "page1.php";
header('location: '.$url);
exit();
} else if(isset($_POST['username'])) {
$username = $_POST['username'];
// echo $username;
$_SESSION['username'] = $username;
$url = "page1.php";
header('location: '.$url);
exit();
}
?>
<!DOCTYPE html>
<html>
<head>
<title>How To Pass Variables In PHP</title>
</head>
<body>
<form action="home.php" method="post">
<input type="text" name="username" placeholder="What Is Your Name?">
<input type="submit" value="SUBMIT">
</form>
</body>
</html>
<?php
session_start();
if(!isset($_SESSION['username'])) {
header("location: home.php");
exit();
}
$username = $_SESSION['username'];
$url = "page2.php?username=".$username;
echo "Hello $username, do you want to go to <a href= $url> page2?</a>";
?>
<?php
session_start();
if(!isset($_SESSION['username'])) {
header("location: home.php");
exit();
}
$username = $_SESSION['username'];
$url = "page1.php?username=".$username;
echo "Hello $username, do you want to go to <a href= $url> page1?</a>";
?>
今回のチュートリアルの肝
1.リダイレクト処理を知る
→コード注釈の欄で後述する。
2.なぜSESSIONメソッドで行うのか?
→ 単にHTTPリクエストを行うだけであれば、GETで事足りるのであるが、GETメソッドではリクエストの際にそのパラメータのキーと値がURLに付加されて明らかになってしまう(これをクエリストリンクという)上に、送信するデータが他人に見られる場合がある。
例えば会員登録サイトにて
http://haruki.com/where?name=value
このようなURLがあったとして、「?name=value」この部分がクエリストリングに相当するのだがこの場合、キーと値が明らかになっているので、valueの部分を改変すれば他人のページを閲覧することができてしまうことになる。
その問題への解決のアプローチとして、今回のチュートリアルではGETは使わずSESSIONメソッドやり取りをしている。
SESSIONメソッドはhome.phpを見ればわかるように、すでにセッションが完了していた場合、及びフォームに任意の値が入力されそれがPOSTされている場合、直接任意のページにリダイレクトするようになっていて、かつこの状態でデータがセッションに保存されているので、変数usernameの値は変更することができないため、page1,page2共々先程のようにvalueを改変しても自分のページにリダイレクトされるだけで他人のページを閲覧することはできなくなる。
リダイレクト処理と合わせて、会員サイトを作る際の基本的な考え方の1つなのだろうとやっていて感じた。
今回のコードの注釈
header("location: ");
exit();
/*HTTPのヘッダ情報をやり取りするための関数の一つの書き方で、この場合はリダイレクト処理を行うことができる。
location:以後に任意のURLやPHPファイルを指定することでそこにページをリダイレクトする。exit();は必ず書いておかないと、処理が延々に実行されてしまうので注意。
前述したとおり、会員サイトでのログイン処理やエラー等々の場面で使用されることが第一に想定されやすいのではないだろうか。*/
<?php
session_start();//セッションスタート
$_SESSION['mail'] = 'support@wepicks.net';//セッション変数に登録
echo $_SESSION['mail'];//セッション変数の呼び出し
/*session_start関数をコールし、$_SESSIONを記述するのが基本的な形。
上記例のようにecho等でセッション変数を呼び出したりすることができる。
登録したセッションの内容は基本的にはブラウザを閉じるまで生きていて、ページ遷移などでをしても呼び出しは可能である。
故に、今回のチュートリアルのような処理が起こるということになる。
他にも
session_destroy();
unset($_SESSION['']);
で、任意のセッションを取り消すことができるなど、使い方はかなりあるので後述の参考サイト等を見て随時勉強をしなければならない。
*/
?>
参考
PHP $_SESSION(セッション変数)のすべて!【初心者向け基本】
[【PHP】header()関数]
(https://www.deep-blog.jp/engineer/archives/12665)
[HTTPとPOSTとGET]
(https://qiita.com/Sekky0905/items/dff3d0da059d6f5bfabf)
[GETとPOSTの使い分け方法]
(https://php-junkie.net/beginner/reserved_variables/get_post/)