元ニート中卒派遣30代ブサメン童貞のブログ

みんなが存在に疑問を感じている「元ニート、中卒、派遣、30歳超えのブサメン童貞」が実際に生息し、そして「どうやって生きてるか」を晒していくブログ

フォームを作る

はじめてのPHP

引き続きアスラドットインストール先生にお世話になっています。解析したい文字列はフォームで取得するのでHTML入門でform要素について、PHP入門で配列の仕様とif文、foreach文、$_SERVER$_POSThtmlspecialchars()の動画を視聴。

そうすると、form.phpが作れます。

<?php

$ma = "";

// POSTされたデータか確認
if ($_SERVER['REQUEST_METHOD'] === "POST") {
  $ma = $_POST['ma'];
}

?>
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>フォームのテスト</title>
</head>
<body>
  <h1>フォームのテスト</h1>
  <form action="" method="POST">
    <input type="text" name="ma" value="解析したい文章を入力">
    <input type="submit" value="送信">
  </form>
  <h2>出力するテスト</h2>
  <?php echo htmlspecialchars($ma, ENT_QUOTES, "utf-8"); ?>
</body>
</html>

作れちゃいました。これで履歴書に「HTMLとPHPができます」って書けます!ドットインストール先生、ありがとう!!ちなみに、$_SERVER["REQUEST_METHOD"] === "POST"の意味がよくわからなかったのですが、ググったらわかりやすい説明があるページを見つけました。

フォームなどでサンクスページに重要な処理を記述していた場合、ダイレクトにサンクスページにアクセスされたら不都合もありますね。そこで、フォームからPOST経由でアクセスされたかを確認する方法です。

PHP($_SERVER)サーバー変数一覧と実用例

なるほど。そういうことなら、ある意味では決まり文句みたいなものかもしれません。今回はPOST送信後に別URLに遷移するわけではないので、「ブックマークなどから最初にアクセスされた場合」と理解してもよさそうです。ついでに、フォームからPOST送信された中身が空だった場合の分岐も考えてみます。

<?php

$ma = "";

// POSTされたデータか確認
if ($_SERVER['REQUEST_METHOD'] === "POST") {
  // maの中身の確認
  if ($_POST['ma'] === "") {
    $ma = "空だゾ?";
  } else {
    $ma = $_POST['ma'];
  }
} else {
  $ma = "ようこそ!";
}

?>

こうするとPOST経由でアクセスしてない場合は「ようこそ!」、POST送信された中身がない場合は「空だゾ?」を変数に代入してくれます。実際に使うかどうかは別として、挙動の確認のために書いてみました。

isset()が動かないよ

ちなみに、はじめはisset()で中身の確認をしようと思っていたのですが、何回やっても、何回やっても、フォームの中身が空なのにtrueが返ってきます。嘘だッ!!!1時間くらい悩んで、さらに1時間くらいかけて調べた結果、またもや天才的にわかりやすい説明を発見。

$_POST変数はarray配列のため、POST送信されていないときは、要素が0個のarray配列となり、その場合、isset関数ではnullではないのでtrueとなり、要素が1個以上の場合もtrueとなってしまいます。

PHPの入力値確認ではなぜisset関数ではなくempty関数を使うのか - nicson (@_@) IT漂流記

eyeからscale。isset()のことを単純に中身がある・なしの判断をするものだと思い込んでしまったことからはじまったミスでした。君のこと、誤解してたみたい。今でも微妙にしっくりきていないのですが、要素が0個の配列というのはとても重要らしく、ググるといろいろな言語で要素=サイズ=長さが0の配列についての説明があります。ビールのように、大人になったらわかるのかも。

広告を非表示にする