【PHP入門講座】 ユーザーに挨拶してみよう

**【2021/10/15 追記】**
**この記事は更新が停止されています。<font color="red">PHP を分かった気になって書いていた不正確な内容が多いため，過去の情報として参考程度にご覧ください。</font>また，完成にたどり着けなかったことをお詫びします。原則的には，[公式マニュアル](https://www.php.net/manual/ja/index.php)の参照をおすすめします。**


### [目次に戻る](http://qiita.com/mpyw/items/752e19a578cf7d96fc5f)

# `form.php` の作成

いよいよ実際にフォームを作成してみます。テキストエディタで 

```html+php
<?php 
// Content-Typeヘッダー送信
header('Content-Type: application/xhtml+xml; charset=utf-8');
?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja">
<head>
  <title>サンプルフォーム</title>
</head>
<body>
  <form method="get" action="welcome.php">
    お名前： <input type="text" name="my_name" value="" />
    <input type="submit" value="送信" />
  </form>
</body>
</html>
```

と入力した後、`form.php` としてルートディレクトリに保存してください。
そして、`http://localhost/form.php` にアクセスして

![ss (2013-11-25 at 10.01.02).png](https://qiita-image-store.s3.amazonaws.com/0/25060/82b19786-2d59-cfe2-f738-6a37db79e047.png)

と表示されれば成功です。表示に失敗した場合はXHTMLの構文を誤っている可能性があります。

# 入力フォーム作成のポイント

## 開始タグと終了タグの構造が正しい必要がある

HTMLでは、例えばリスト生成において

```html
<ul>
<li>あ
<li>い
<li>う
</ul>
```

のように終了タグを省略できるケースがありましたが、XHTMLでは一切の省略は認められません。

```html
<ul>
<li>あ</li>
<li>い</li>
<li>う</li>
</ul>
```

## 空要素タグには `/` が必要

HTMLでは

```html
<br>
<hr>
```

のようなタグは「開始タグのみを持つもの」として書いていましたが、XHTMLでは

```html
<br />
<hr />
```

とする必要があります。

## `meta` タグよりも `header` 関数

```html
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
```

```html
<meta charset="utf-8">
```

といった記述は見慣れている方が多いと思いますが、metaタグは本来 **「ブラウザに直接Content-Typeヘッダを送れないときのための補助手段」** として存在するものであり、PHPを利用しているのであれば

```php
<?php 
header('Content-Type: application/xhtml+xml; charset=utf-8');
?>
```

として直接ブラウザへの送信が可能となっているので、こちらを活用しましょう。HTMLのMIMEタイプは `text/html` でしたが、XHTMLでは `application/xhtml+xml` となります。 **`IE6` `IE7` `IE8` とかいう<del>糞ブラウザ</del>はXHTMLに対応していません** が、<del>見捨てることにします</del>。

## `xmlns` 属性が必須

XHTMLでは決まり文句です。

```html
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja">
```

## `form` 要素直下にインライン要素を置いても良い

```html:HTML4.01
<form method="get" action="welcome.php">
  <label>お名前： <input type="text" name="my_name" value=""></label>
  <label><input type="submit" value="送信"></label>
</form>
```

```html:XHTML1.0とXHTML1.1
<form method="get" action="welcome.php">
  <label>お名前： <input type="text" name="my_name" value="" /></label>
  <label><input type="submit" value="送信" /></label>
</form>
```

従来は `form` タグの下にそのままインライン要素である `input` タグを置くことは禁止されていました。しかし、新しい規格では

```html:HTML5
<form method="get" action="welcome.php">
  お名前： <input type="text" name="my_name" value="">
  <input type="submit" value="送信">
</form>
```

```html:XHTML5
<form method="get" action="welcome.php">
  お名前： <input type="text" name="my_name" value="" />
  <input type="submit" value="送信" />
</form>
```

と書くことが認められています。もちろん従来通りの記述でも構いませんが。

# `welcome.php` の作成

次はリクエストを受け取って処理するページを作成してみます。テキストエディタで 

```html+php
<?php

/**
 * HTML特殊文字をエスケープする関数
 */
function h($str) {
    return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}

// Content-Typeヘッダー送信
header('Content-Type: application/xhtml+xml; charset=utf-8');

?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja">
<head>
  <title>Hello!!</title>
</head>
<body>
  <p>こんにちは、<?=h($_GET['my_name'])?>さん！</p>
</body>
</html>
```

と入力した後、`welcome.php` としてルートディレクトリに保存してください。
`http://localhost/form.php` から送信を行ってうまく動けば成功です。

# リクエスト処理のポイント

## フォームに入力された内容を受け取る

先ほどの例では `action` 属性は **`get`** 、`name` 属性は **`my_name`** として送信を行ったので、

```php
$_GET['my_name']
```

というように受け取ります。 `action` 属性は **`get`** **`post`** の2種類があります。

|   | **`GET`** | **`POST`** |
|:---|:-----|:----|
| ブラウザ上から一目で確認出来るかどうか | 出来る | 出来ない |
| (ブラウザ側が)情報をセットする場所 | URLの `?` より後ろの部分 | ポストフィールド |
| (PHP側が)情報をセットする変数 | **`$_GET`** | **`$_POST`** | 

「スーパーグローバル変数」の項で詳しく触れますが、簡単に言えばこのような違いがあります。また、通常フォーム送信においては<ins> `GET` よりも `POST` の方がよく用いられます</ins>が、敢えてここでは後で説明したい問題があるがために `GET` を選択しました。

## 必ず `h` 関数を通す

必ず `h` 関数を通しましょう。
必ず `h` 関数を通しましょう。
必ず `h` 関数を通しましょう。

大事なことなので4回言いました。