あーる学習帳

自分が勉強したことや気になることなど、99%自分用です。コードを書いてるのでPCから閲覧を推奨。

PHP入門:例外処理、POSTとクッキーとセッション

今日も頑張るぞ。

 

#27

例外処理について。

何らかの処理をしていて予期しない結果が発生したとき、適切に処理をしていく方法のことである。

function div($a,$b){

  echo $a / $b ;

 $aを$bで割った答えを表示させる。

div(7,2);

div(5,0); 

0除算はできない。こういう意地悪をするとどうなるか。 

画面には7/2の解である3.5しか表示されない。このとき、サーバー側に「PHP Warning: Division by zero」というエラーが表示されている。

Warningを発生させず、代替となる処理を自分で作ることができる。上のコードを書き換え。

function div($a,$b){

  try{

    if ($b===0) {

      throw new exception("Cannot divide by 0 !!");

    }

    echo $a / $b ;

  } catch (Exception $e) {

    $e->getMessage();

  }

div(7,2);

div(5,0); 

こうすることで、「3.5」のあとに自分で決めたエラーメッセージ「Cannot divide by 0 !!」が表示される。サーバー側でもエラーが出ていない。

今回はおまじないのように列記しただけになったが、覚えておこう。

 

#28

フォームからのデータを継承しようという話。

まずはindex.phpにhtmlのコードを書き、名前の入力欄を作る。

<?php

 

?>

<!DOCTYPE html>
 <html lang="ja">
 <head>
  <meta charset="utf-8">
  <title>Check UserName</title>
 </head>
 <body>
  <form action="" method="POST">
   <input type="text" name="username" placeholder="user name">
   <input type="submit" value="Check!">
  </form>
 </body>
</html>

 f:id:R_de_aru:20180615214427p:plain

上のコードを入れるとこうなった。すごいぞhtml。

今回はPOST形式でusernameが渡ってくる。actionというところが空欄になっているので、他のファイルに渡すのではなくindex.php内で処理されるとのこと。

上のコードはphpのところが空白であり、html部分も書き換えが必要なので以下のようにする。

<?php

$username="";

if ($_SERVER['REQUWST_METHOD'] === 'POST'){

  $username=$_POST['username'];

  $err=false;

  if (strlen($username)>8){

    $err=true;

  }

}

?> 

 

<!DOCTYPE html>
 <html lang="ja">
 <head>
  <meta charset="utf-8">
  <title>Check UserName</title>
 </head>
 <body>
  <form action="" method="POST">
   <input type="text" name="username" placeholder="user name"

   values="<?php echo htmlspecialchars($username,ENT_QUOTES,'utf-8'); ?>">
   <input type="submit" value="Check!">

   <?php if ($err) { echo "TooLong!"; } ?>
  </form>
 </body>
</html>

$_SERVERという定義済みの変数について、REQUEST_METHODというものの値がPOSTだったら何かが投稿されたということになる。

$usernameという変数を定義するが、定義済み変数である$_POSTで名前を渡す。こうするとPOSTされた内容を$usernameに渡すことができる。

$usernameの文字の長さが8より大きければエラーを返すというようにしたい。$errという変数を初期値falseの状態であらかじめ作成しておき、8文字より大きいことがわかれば値をtrueにする。$errがTrueの場合、画面では「TooLong!!」と表示するようにする。

また、チェックボタンを押すたびに入力した値が消えてしまうので、htmlspecialcharsという設定方法を用いる(今回はおまじない扱いであまり触れないが、これを使うと$usernameに入れた値が初期値として維持される)。

この状態で「2222」と入力すると…

f:id:R_de_aru:20180615220851p:plain

画面には特別な表示などでないが、サーバーでもエラーが出ていないので処理は成功。

次に「2222abcdefg」と入力すると…

f:id:R_de_aru:20180615220945p:plain

このように、「Too Long!!」と表示される。

定義済みの変数やエスケープ(htmlspecialcharsのこと?)についても覚えておこう。

 

#29

Cookieについて。

アクセスしてきたユーザーのブラウザにデータをセットすることができる。

以下のコードを作成。

setCookie("username","yamada") ;

これで実行するとクッキーがセットされたことになる。

次回以降の実行の際には、usernameというキーでyamadaという値(Value)を持つようになる。以下のようにすると、値の確認ができる。

// 今回はsetCookieは外しておく

// setCookie("username","yamada"); 

echo $_COOKIE['username'];

これで実行すると、画面には「yamada」と表示される。この値についてはphpではなくブラウザそのものに保存されるので、別ファイルからも呼び出すことが可能。

試しにtestcookie.phpという別ファイルを作成し、上のecho部分だけを書いて呼び出すと…

f:id:R_de_aru:20180615222151p:plain

このように、yamadaと表示される(さらっと別ファイルを呼ぶ方法もやっちゃった)。

複数のページにわたって値を持ちたいときに有効。

また、setCookieには第3引数として有効期限をつけることができる。

setCookie("username","yamada",time()+60*60);

こうすることで、関数time()で取得した現在日時に60秒×60=1時間の起源を持たせることになる。期限を明示的に設定しない場合の有効期限は「ブラウザを閉じるまで」となるので注意。

また、クッキーを削除する場合は第3引数に過去の日時を与えればよい。

setCookie("username","yamada",time()-60*60); 

こうすることで、「現在の1時間前=過去」となりクッキーが削除される。

 

#30

セッションを使ってみようという話。

クッキーと同じようにデータを保存する仕組みだが、こちらはブラウザではなくサーバーにデータを保存する仕組みである。

セッションを始める場合は必ず以下のおまじないを書く。

session_start(); 

そして今回はコードを以下のように書く。

session_start();

$_SESSION['username']="yamada";

定義済みの変数である$_SESSIONについて、usernameというキーに対してyamadaという値を持たせる。この状態で実行すると$_SESSIONにyamadaという値がセットされ、次回以降は$_SESSION['username']でyamadaを出すことができる。

session_start();

echo $_SESSION['username'];

クッキーと同じようにサーバーでデータを保存しているので、他のファイルからも呼び出すことができる。testsession.phpというファイルを作り、session_startとechoを書くと…

session_start();

echo $_SESSION['username'];

f:id:R_de_aru:20180615230315p:plain

このように表示される。別ファイルでも必ずsession_startを書くこと。

セッションの削除については以下のように書く。

session_start();

unset($_SESSION['username']);

これで実行するとusernameが消える。なお、このあとにechoでusernameを出そうとするとサーバーでは「PHP Notice: Undefined index: username」という注意書きが出る。usernameなんか知らんがなという意味(画面は真っ白)。

クッキーとセッションをうまく使い分けられるようにしよう。

クッキーは気軽に使える一方、ブラウザ側にデータを保存するので改ざんの可能性ややろうと思えば中身が見えてしまうという危険性も持っている。

セッションはサーバーにデータを保存するので大きなデータを保存できる上、改ざんされにくい、中身が見られないという特徴がある。

 

今回でドットインストールのPHP入門、全30回を終えました!!!!

特に後半はおまじない要素が増えてきていたのでしんどいところもありましたが、別の教材で復習や発展的な学習を進めていこうと思います。

お疲れ様自分!!!!