読者です 読者をやめる 読者になる 読者になる

Webデザインの勉強 | フェリカテクニカルアカデミーWebサイト制作科サポートブログ

フォーム実践(2)入力内容のチェック

PHP

入力内容のチェック

  • 受け取った内容に不備がないか調べる
  • 例えば、入力欄に記入漏れがあった場合の処理
安全面のチェック
  • $_POSTの値は安全な値に加工してから使う
  • 危険な値を安全にする作業を「エスケイプ処理」と呼びます
  • htmlspecialchars関数を使って「安全な文字列」に加工するのが一般的です
PHPの関数を使って$_POSTの内容をチェックする
  • 「index.php」からの遷移ではなく「check.php」を表示しようとする場合、「index.php」に強制的に戻す処理
<?php
//issetは変数の中に値があるか、もしくは変数自体が存在するか確認する関数
if (!isset( $_POST[ 'uname' ] ) || !isset( $_POST[ 'email' ] )||!isset( $_POST[ 'message' ] )){
  // 'Location:パス(path)でその場所に遷移する'
  header( 'Location:index.php' );
  exit;
}
  • 強制的にフォームの画面ではない「処理終了」という文字を表示してしまう場合
<?php
// フォームデータが空の場合は処理終了
if (empty($_POST)) {
    echo '処理終了';
    exit;
}
未入力があった場合、メッセージを表示
  • このとき「index.php」に戻って入力しなおしてもらいますが、このままでは入力した内容まで消えています


《check.php

<?php
//issetは変数の中に値があるか、もしくは変数自体が存在するか確認する関数
if (!isset( $_POST[ 'uname' ] ) || !isset( $_POST[ 'email' ] )||!isset( $_POST[ 'message' ] )){
  // 'Location:パス(path)でその場所に遷移する'
  header( 'Location:index.php' );
  exit;
}

// 入力値のチェック
if (empty($_POST[ 'uname' ])) {
  echo 'お名前を入力してください。';
  exit;

}
if (empty($_POST[ 'email' ])) {
  echo 'メールアドレスを入力してください。';
  exit;
}
if (empty($_POST[ 'message' ])) {
  echo 'メッセージを入力してください。';
  exit;
}

// 入力値の取得・加工
$uname = htmlspecialchars( $_POST[ 'uname' ], ENT_QUOTES, 'UTF-8' );
$email = htmlspecialchars( $_POST[ 'email' ], ENT_QUOTES, 'UTF-8');
$message = htmlspecialchars( $_POST[ 'message' ], ENT_QUOTES, 'UTF-8' );

// セッションの開始
session_start();
$_SESSION[ 'uname' ] = $uname;
$_SESSION[ 'email' ] = $email;
$_SESSION[ 'message' ] = $message;
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>メールフォーム</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1>確認画面</h1>
<p>内容を確認してください。</p>
<form action="submit.php" method="post">
<table>
<tr>
<td>お名前</td><td width="300"><?php echo $uname; ?></td>
</tr>
<tr>
<td>メールアドレス</td>
<td width="300"><?php echo $email; ?></td>
</tr>
<tr>
<td>メッセージ</td>
<td width="300"><?php echo nl2br($message); ?></td>
</tr>
<tr>
<td align="right" colspan="2">
<input type="submit" name="sub1" value="送信する">
</td>
</tr>
</table>
</form>
</body>
</html>
index.phpを修正
<?php
//初期化
$uname = '';
$email = '';
$message = '';

session_start();
if(isset($_SESSION['uname'])){
  $uname = $_SESSION['uname'];
}
if(isset($_SESSION['email'])){
  $email = $_SESSION['email'];
}
if(isset($_SESSION['message'])){
  $message = $_SESSION['message'];
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>フォーム実践</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1>入力画面</h1>
<p>必要事項を入力して「確認する」ボタンをクリックしてください。</p>
<form method="post" action="check.php">
<table>
<tr>
<th>お名前</th><td><input type="text" name="uname" size="30" value="<?php echo $uname; ?>"></td>
</tr>
<tr>
<th>メールアドレス</th><td><input type="text" name="email" size="30" value="<?php echo $email; ?>"></td>
</tr>
<tr>
<th>メッセージ</th><td><textarea rows="5" cols="30" name="message" value="<?php echo nl2br($message); ?>"></textarea></td>
</tr>
<tr>
<td colspan="2"><input type="submit" name="sub1" value="確認する"></td>
</tr>
</table>
</form>
</body>
</html>


まだ、入力された文字列のエラーチェックはできていませんが、それは実践で。
HTML5新要素のフォームのエラーチェック(必須項目 required)は、最初から記述するとPHPのエラーチェックができなくなるため、最終段階で記述することにします。

PHP関数の短縮形
  • 1文字の関数名でユーザー定義関数を作成する
<?php
function h( $a ) {
    return htmlspecialchars( $a, ENT_QUOTES, 'UTF-8' );
}
$b = h( $a );