入力エラーチェック

入力エラーチェック


≪index.php

<?php
//初期化
$yname = '';
$yage = '';
$ytel = '';

// セッションの開始
session_start();

if(isset($_SESSION['your_name'])){
  $yname = $_SESSION['your_name'];
}
if(isset($_SESSION['your_age'])){
  $yage = $_SESSION['your_age'];
}
if(isset($_SESSION['your_tel'])){
  $ytel = $_SESSION['your_tel'];
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>POSTで送信</title>
</head>
<body>
<form action="check.php" method="post">
<p>お名前:<input type="text" name="your_name" value="<?php echo $yname; ?>"></p>
<p>年齢:<input type="text" name="your_age"  value="<?php echo $yage; ?>"></p>
<p>電話番号:<input type="text" name="your_tel"  value="<?php echo $ytel; ?>"></p>
<input type="submit" value="送信">
</form>
</body>
</html>


≪check.php

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

// セッションの開始
session_start();

// 入力値の取得
$yname = htmlspecialchars($_POST['your_name'], ENT_QUOTES, 'UTF-8');
$yage = htmlspecialchars($_POST['your_age'], ENT_QUOTES, 'UTF-8');
$ytel = htmlspecialchars($_POST['your_tel'], ENT_QUOTES, 'UTF-8');

// 入力値をセッション変数に格納
$_SESSION['your_name'] = $yname;
$_SESSION['your_age'] = $yage;
$_SESSION['your_tel'] = $ytel;

// 入力値のチェック
if (empty($_POST[ 'your_name' ])) {
  echo 'お名前を入力してください。';
  echo '<p><a href="index.php">入力画面へ戻る</a></p>';
  exit;
}
if (empty($_POST[ 'your_age' ])) {
  echo '年齢を入力してください。';
  echo '<p><a href="index.php">入力画面へ戻る</a></p>';
  exit;
}
if (empty($_POST[ 'your_tel' ])) {
  echo '電話番号を入力してください。';
  echo '<p><a href="index.php">入力画面へ戻る</a></p>';
  exit;
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>POSTで受信</title>
</head>
<body>
<p>お名前:<?php echo $yname ?></p>
<p>年齢:<?php echo $yage ?></p>
<p>電話番号:<?php echo $ytel ?></p>
</body>
</html>

セッション情報

セッション情報とは

  • サーバー側にデータを保存する仕組みです
  • クライアントを区別するためにランダムなIDを割り当て、そのIDに対応する保存域をサーバー側に作成します
  • セッション情報は、プログラムの実行環境やライブラリによって提供されます
  • Cookieは、クライアントに送信されるため、ユーザーに見せたくない内部情報などを保存するのに適しません
  • たとえば、Webでゲームを作っている場合、そのゲームで所持しているアイテムやお金などをCookieに保存するのは適切ではありません
  • これらの情報は、サーバー側に保存するのが適切です。そのような場面に使うのが、セッション機能です

サーバー側にデータを保存するセッション情報

  • プログラミング言語やライブラリによって提供されているセッション機能を使うと、サーバー上にユーザーに関するデータを保持できます
セッションIDで保存域を区別する
  • セッション機能は、プログラミング言語やライブラリによって提供される、「ユーザーごとに用意されるサーバー上のデータ保存領域」です
  • セッション機能に対応するプログラミング言語やライブラリでは、アクセスしてきたクライアントごとに、「セッションID」と呼ばれる
  • ランダムな文字列を渡して、クライアントごとに「セッションID」と呼ばれる
  • そしてセッションIDごとに、データの保存領域を当てます
  • つまり、クライアントの数だけサーバーに保存域を作り、そこにWebプログラムから自由に値を保存できるようにしたものがセッション情報です
  • セッション情報に保存する内容は、クライアントから見えないので偽装の心配がありません
CookieでセッションIDをやり取りする
  • 初回の接続では、Cookieをまだ持っていません
  • サーバー上に新しい保存領域が作られ、ランダムなセッションIDと結びつけられます
  • セッションIDは、クライアントにCookieとして送信します
  • 2回目以降のアクセスでは、クライアントは「セッションID」をCookieとして提示してきます
  • この時には、新しいセッション保存領域を作らずに、先に作成した保存領域を使うように構成します

セッションを使った実例

  • PHPでセッションを使うには、最初に「session_start関数」を呼び出す必要があります
<?php
  // セッションを開始する
  session_start();
  • 値を格納するには「$_SESSION」変数に代入します
<?php
    $ordervalue = $_POST[ 'order' ];
    $_SESSION[ 'order' ] = $ordervalue;
  • 値を削除した時には、「unset関数」を呼び出します
<?php
    // 選択されていないとき。削除する
    unset($_SESSION[ 'order' ]);


《order.php

<?php
  // セッションを開始する
  session_start();
  if (!isset($_POST[ 'order' ])) {
    // 選択されていないとき。削除する
    unset($_SESSION[ 'order' ]);
  } else {
    // 選択されているとき
    $ordervalue = $_POST[ 'order' ];
    $_SESSION[ 'order' ] = $ordervalue;
  }
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>セッション情報を使った例</title>
</head>
<body>
<p>商品を設定しました。</p>
<p><a href="settle.php">決済ページへ</a></p>
</body>
</html>
セッションから値を参照する
  • 読み取る場合も、最初に「session_start関数」を呼び出す必要があります


《settle.php

<?php
  // セッションを開始する
  session_start();
  if ((!isset($_SESSION[ 'order' ])) || ($_SESSION[ 'order' ] == '')) {
    echo '商品が選択されていません';
  } else {
    $ordervalue = $_SESSION[ 'order' ];
    echo $ordervalue . 'の購入手続きを進めます';
  }
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>セッション情報を使った例:決済ページ</title>
</head>
<body>
<p>決済ページ</p>
<p><a href="item.php">商品を選択し直す</a></p>
</body>
</html>

セッションIDを見る

  • session_start関数」を呼び出すと、セッションIDが生成され、この値はCookieによって送受信されます
  • 開発車ツールを使ってCookieを確認すると、アクセスした時には、「Set-Cookieヘッダ」が送信されてくることがわかります
  • PHPでは、「PHPSESSID」という名称でセッションIDを渡します(本来は見せてはいけないデータです)
セッションのタイムアウト
  • ブラウザが閉じられたタイミングでサーバー上のセッション情報も開放したいところですが、それはできません
  • なぜならWebサーバー側では、クライアントがWebブラウザを閉じたことを知る手段がないからです
  • そこで「一定時間利用しなかった保存領域は開放する」というタイムアウトをとります
  • PHPの場合は、タイムアウト時間は「3600秒(1時間)」に設定されています
セッションを使う場合の注意点
  • セッションハイジャック(第三者がセッションIDを盗むことで、なりすまし攻撃をすること)
  • セッションIDは盗まれるものだと諦め、重要な情報の前にはもう一度「ユーザー名」と「パスワード」を再入力させるようにする

セッションを終了させる

  • session_destroy関数を実行する
<?php
  session_destroy();
  $_SESSION = null;  // セッション変数を初期化
  setcookie( session_name(), null, 0, '/' );// セッション・クッキーを削除

入力された値の変数と型

  • intval関数(文字列を整数に変換する)- 小数点以下は切り捨て
  • ユーザーが入力したデータは「文字列型」です
  • 「文字列型」のまま四則演算ができないため「整数型」に変換します


《sum.php

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>変数と型</title>
</head>
<body>
<form action="result.php" method="post">
<p>数字1 <input type="text" name="val1"></p>
<p>数字2 <input type="text" name="val2"></p>
<p><input type="submit" value="結果"></p>
</form>
</body>
</html>


《result.php

<?php
$val1 = intval($_POST[ 'val1' ]);
$val2 = intval($_POST[ 'val2' ]);
$result = $val1 + $val2;
$sum = $val1 . ' + ' . $val2 . ' = ' . $result;
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>変数と型</title>
</head>
<body>
<h1><?php echo $sum; ?></h1>
</body>
</html>

isset()

  • 変数が存在しているかどうかの判別を行います


《inch_input.php

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>inchをcmに変換</title>
</head>
<body>
<form action="inch_output.php" method="post">
<p>インチの半角数字を入力してください。</p>
<p><input type="text" name="inch_unit"></p>
<p><input type="submit" value="変換"></p>
</form>
</body>
</html>


《inch_output.php

<?php
if ( !isset($_POST[ 'inch_unit' ]) ) {
  // 値が入力されていない場合(フォームを表示)
  header( 'Location:inch_input.php' );
  exit;
} else {
  $inch = $_POST[ 'inch_unit' ];
  $inch = floatval( $inch );  // 文字列から数値へ変換
  $cm   = 2.54 * $inch;  // インチからセンチへの変換
  $result = '結果 ' . $inch . ' inch = ' . $cm . ' cm';
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>inchをcmに変換</title>
</head>
<body>
<h1><?php echo $result; ?></h1>
</body>
</html>

PHPでリダイレクトをする

  • もし変数の値が入っていなかったら
  • header関数とLocation
  • 入力画面に戻す(確認画面からの閲覧ができないようにする)


注意点

  • 前後でechoを書いていないか
  • ファイル頭のphpタグの前に空白・改行が混じってないか
  • header関数を呼んだ後、すぐにexit関数で処理を終了しているか
<?php
if( !isset($_POST[ 'your_name' ]) ){
  header( 'Location: index.php' );
  exit;
}
?>


《check.php

<?php
if( !isset($_POST[ 'your_name' ]) ){
  header( 'Location: index.php' );
  exit;
}
$name = $_POST[ 'your_name' ];
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>確認ページ</title>
</head>
<body>
<h1>入力内容の確認</h1>
<p>あなたのお名前は、<?php echo $name; ?>ですね。</p>
</body>
</html>



入力された値を送信→受信

送信するために必要なこと

  • form要素でmethod属性を記述します
  • method属性には、送信方法を記述します
  • inputされた値を別のページに送信します
  • 入力された値の器に名前をつけて送信します
  • 送信するタイミングをinput要素のtype属性「submit」で、ボタンの表示で作ります

POSTメソッドとGETメソッド

  • リクエストメソッド
  • リクエストの種類を指定するもの
  • WebブラウザとWebサーバーとのやりとりは、HTTPプロトコルでおこないます
  • WebブラウザからリクエストがWebサーバーへ送信されます
  • リクエストを受けたWebサーバーはレスポンスを返します
  • レスポンスは「レスポンスヘッダー」と「レスポンスボディ」からなります
  • Webブラウザのアドレスバーに、URIを入力してアクセスする場合は「GET」
  • フォームからデータを入力する場合は、method属性で指定したリクエストになり「POST」
  • POSTメソッドの場合は、リクエストボディに入力データが送信されます
  • GETメソッドの場合は、URIの後ろに「?[名前1]=[値1]&[名前2]=[値2]...」という形式でデータが付加されます
  • このときにURIに付加されるデータを「クエリ文字列」と呼びます
  • クエリ文字列の[名前]は、フォーム部品のname属性の値です
ポストデータ(POST)とクエリ文字列(GET)
  • ポストデータ:封筒の中に収められた手紙の本文
  • クエリ情報:宛名の脇に添えられたメモ書き


クエリ情報

  • クエリ情報とは、URLの末尾に「〜?キー名=値」で表現できるシンプルなデータのことを言います
  • データサイズには限度がある
  • 使用できない文字がある
  • データが露出する
  • ブックマークができる

受信する方法

リクエスト情報を取得する
  • リクエスト情報:クライアントからサーバーに送信される情報のこと
  • HTTP(HyperText Transfer Trotocol)の手続きに沿って通信をおこなっている


HTTPプロトコルの構成
分類 項目 概要
リクエスト情報 HTTPメソッド サーバーに対する命令、要求するパス
リクエストヘッダ リクエストに関わる情報、クライアント情報
リクエストボディ(本体) フォームで入力されたデータ
レスポンス情報 HTTPステータス サーバーでの処理結果
レスポンスヘッダ コンテンツの構成情報、サーバー情報など
レスポンスボディ(本体) コンテンツ本体

スーパーグローバル変数

名前 機能
$GLOBALS スクリプト中で利用可能なすべての変数に対してのリファレンスを取得します
$_SERVER Webサーバーや実行中のスクリプトに関する情報を取得します
$_GET HTTPプロトコルのGETメソッドによりフォームからスクリプトに送信される値を取得します
$_POST HTTPプロトコルのPOSTメソッドによりフォームからスクリプトに送信される値を取得します
$_COOKIE HTTP Cookieによりスクリプトに送信されるクッキーを取得します
$_FILES フォームのHTTP POSTファイルアップロードによりスクリプトに送信される値を取得します
$_ENV 環境変数を取得します
$_REQUEST $_GET、$_POST、$_COOKIE、$_FILESの値を取得します
$_SESSION スクリプトのセッション変数に関する情報を取得します

htmlspecialchars()
  • formで送信されたデータは、Webさーばーで処理され結果を返します
  • 値は、スーパーグローバル変数に格納され処理されます
  • 処理されるデータは、HTMLに変換して返す必要があります
  • 危険なスクリプトなどがそのまま実行されないように処理するのが、htmlspecialchars()関数です
  • 変換した文字にクォートが含まれた場合の処理を「ENT_QUOTES」で、文字化けしないような処理を「'UTF-8'」で記述しています

テキストフィールド

GET送信

《input.php

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>フォームに入力した内容を取得する</title>
</head>
<body>
<h1>GETで出力</h1>
<form action="get.php" method="get">
<dl>
<dt><label for="name">お名前  :</label></dt>
<dd><input type="text" name="name" id="name" size="20" maxlength="10" value="" required></dd>
<dt><label for="mail">メールアドレス:</label></dt>
<dd><input type="text" name="mail" id="mail" size="50"  maxlength="50" value="" required></dd>
</dl>
<input type="submit" name="submit" value="送信">
</form>
</body>
</html>


《get.php

<?php
  $name = htmlspecialchars( $_GET[ 'name' ], ENT_QUOTES, 'UTF-8' );
  $mail = htmlspecialchars( $_GET[ 'mail' ], ENT_QUOTES, 'UTF-8' );
    echo '名前は、' . $name .' です<br>';
    echo 'メールアドレスは、' . $mail . 'です<br>';

POST送信

《input.php

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>フォームに入力した内容を取得する</title>
</head>
<body>
<h1>フォームに入力した内容を取得する</h1>
<form action="output.php" method="post">
<dl>
<dt><label for="name">お名前:</label></dt>
<dd><input type="text" name="name" id="name" size="20" maxlength="10" value="" required></dd>
<dt><label for="message">お問い合わせ内容:</label></dt>
<dd><textarea name="message" id="message" cols="50" rows="4" value="" required></textarea></dd>
</dl>
<input type="submit" value="送信する">
</form>
</body>
</html>


《output.php

<?php
$name = htmlspecialchars( $_POST['name'], ENT_QUOTES, 'UTF-8' );
$message = htmlspecialchars( $_POST['message'], ENT_QUOTES, 'UTF-8' );
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>変数を使って、同じプログラムが重なるのを防ぐ</title>
</head>
<body>
<h1>変数を使って、同じプログラムが重なるのを防ぐ</h1>
<dl>
<dt> お名前</dt>
<dd><?php echo $name; ?></dd>
<dt> メッセージ</dt>
<dd><?php echo $message; ?></dd>
</dl>
</body>
</html>

ラジオボタン

《input.php

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ラジオボタンなどの値を取得する</title>
</head>
<body>
<h1>ラジオボタンなどの値を取得する</h1>
<form action="output.php" method="post">
<dl>
<dt>性別:</dt>
<dd>
<input id="gender_male" type="radio" name="gender" value="男性"><label for="gender_male">男性</label>
<input id="gender_female" type="radio" name="gender" value="女性"><label for="gender_female">女性</label>
</dd>
</dl>
<input type="submit" value="送信する">
</form>
</body>
</html>


《output.php

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ラジオボタンなどの値を取得する</title>
</head>
<body>
<h1>ラジオボタンなどの値を取得する</h1>
<p>
<?php
echo ( '性別: ' . htmlspecialchars( $_POST[ 'gender' ], ENT_QUOTES, 'UTF-8' ) );
?>
</p>
</body>
</html>
まとめ

《input.php

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>フォームに入力した内容を取得する</title>
</head>
<body>
<h1>フォームに入力した内容を取得する</h1>
<form action="output66.php" method="post">
<dl>
<dt><label for="name">お名前:</label></dt>
<dd><input type="text" name="name" id="name" size="20" maxlength="10" value="" required></dd>
<dt><label for="mail">メールアドレス:</label></dt>
<dd><input type="text" name="mail" id="mail" size="50" maxlength="50" value="" required></dd>
<dt>性別:</dt>
<dd>
<input id="gender_male" type="radio" name="gender" value="男性" checked><label for="gender_male">男性</label>
<input id="gender_female" type="radio" name="gender" value="女性"><label for="gender_female">女性</label>
</dd>
<dt><label for="message">お問い合わせ内容:</label></dt>
<dd><textarea name="message" id="message" cols="50" rows="4" value="" required></textarea></dd>
</dl>
<input type="submit" value="送信する">
</form>
</body>
</html>


《output.php

<?php
$name = htmlspecialchars( $_POST[ 'name' ], ENT_QUOTES, 'UTF-8' );
$mail = htmlspecialchars( $_POST[ 'mail' ], ENT_QUOTES, 'UTF-8' );
$gender = htmlspecialchars( $_POST[ 'gender' ], ENT_QUOTES, 'UTF-8' );
$message = htmlspecialchars( $_POST[ 'message' ], ENT_QUOTES, 'UTF-8' );
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>変数を使って、同じプログラムが重なるのを防ぐ</title>
</head>
<body>
<h1>変数を使って、同じプログラムが重なるのを防ぐ</h1>
<dl>
<dt> お名前:</dt>
<dd><?php echo $name; ?></dd>
<dt> メールアドレス:</dt>
<dd><?php echo $mail; ?></dd>
<dt> 性別:</dt>
<dd><?php echo $gender; ?></dd>
<dt> メッセージ:</dt>
<dd><?php echo $message; ?></dd>
</dl>
</body>
</html>

ユーザーとの対話

ユーザーとの対話

  • 入力フォームに入力されたデータは、「$_GET[ 名称 ]」や「$_POST[ 名称 ]」取得できます
出力
  • ブラウザに表示


《例1》

  • 変数を{ }で囲む
  • Dreamweaverでは、変数の色にならないため判別しにくくなります
<?php
echo "あなたの名前は、{$name}ですね。";
?>


《例2》

<?php
echo 'あなたの名前は、' . $name . 'ですね。';
?>


《例3》

  • HTML要素の部分は、PHPの記述に含めない
  • 変数の値のみを出力する
<p>あなたのお名前は、<?php echo $name; ?>ですね。</p>
エラー
  • 正しく表示されない
  • 基本的には、綴りミスであることがほとんどです
  • 構文の記述にミスがない場合は、変数名の記述ミスです(他のページに変数の値を渡す処理の中で起こるミス)


var_dump()

  • 引数に指定した式に関しての型や値を含む構造化された情報を返します
  • print_r()よりも詳細な情報が含まれ、変数の数やそれぞれの変数に関する情報が表示されます
<?php
$name = $_POST[ 'your_name' ];

var_dump($name);
?>

GETメソッド

  • form要素のmethpd属性を「get」にします
  • GETメソッドで送信されたフォームの値は、$_GET[ 'フィールド名' ] で取得できます
  • GETメソッドの場合は、URLの後ろにデータがつきます(表示されます)
  • name属性「your_name」という名前をつけています
  • 入力フォームの内容をサーバーに送信するには、「submit」ボタンが必要です
  • 「submit」ボタンは、「value="送信"」で文字列「送信」が表示されます
  • 「submit」ボタンがクリックされたときに呼び出すプログラムは、action属性で指定します


《index.php

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>GETで送信</title>
</head>
<body>
<form action="check.php" method="get">
<p>お名前 <input type="text" name="your_name"></p>
<p><input type="submit" value="送信"></p>
</form>
</body>
</html>


《check.php

  • $_GETで入力されたデータを読み取り、echoで文字を出力する
<?php
$yname = $_GET['your_name'];
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>GETで取得</title>
</head>
<body>
<p>こんにちは、<?php echo $yname; ?>さん。</p>
</body>
</html>





入力フィールドに以下のように記述すると、プログラムが実行されてしまいます。




つまり、悪意のある第三者に、データを盗み出すプログラムなどが実行されてしまい、とても危険です。


クロスサイトスクリプティング(Cross Site Scripting XSS

  • HTMLエスケイプ処理をしていれば、「<script>」は「&lt;script&gt;」に置換されるので、実行されることはありません
  • CSSではなく「XSS」と書くのは、Cascading Style Sheetsと区別するため
PHPでHTMLエスケイプ
  • htmlspecialchars関数を使います
<?php
$yname = $_GET['your_name'];
$h = htmlspecialchars( $yname );
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>GETで取得</title>
</head>
<body>
<p>こんにちは、<?php echo $h; ?>さん。</p>
</body>
</html>

POSTメソッド

  • form要素のmethpd属性を「post」にします
  • POSTメソッドで送信されたフォームの値は、$_POST[ 'フィールド名' ] で取得できます
  • POSTメソッドの場合は、URLの後ろにデータがつかず、URLとは別にデータが送信されます
  • Webブラウザの「更新」ボタンをクリックしてリロードしようとすると、再送信するかどうかを尋ねる確認メッセージが表示されます


《index.php

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>POSTで送信</title>
</head>
<body>
<form action="check.php" method="post">
<p>お名前 <input type="text" name="your_name"></p>
<p><input type="submit" value="送信"></p>
</form>
</body>
</html>


《check.php

<?php
$yname = $_POST['your_name'];
$h = htmlspecialchars( $yname );
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>POSTで取得</title>
</head>
<body>
<p>こんにちは、<?php echo $h; ?>さん。</p>
</body>
</html>

PHPでカレンダー

PHPでカレンダー

<?php
//現在の「年月」を取得
$now_year = date( 'Y' );
$now_month = date( 'n' );

//1日(月初)のタイムスタンプから「曜日」を取得
$first_day = mktime( 0, 0, 0, $now_month, 1, $now_year );
$first_weekday = date( 'w' , $first_day );
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>今月のカレンダー</title>
</head>
<body>
<h3><?php echo $now_year; ?><?php echo $now_month; ?></h3>
<table border="1">
<tr>
<th class="sun"></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th class="sat"></th>
</tr>
<?php
echo '<tr>';  // 最初の<tr>
$weekday = 0; //曜日のカウンタ

//1日の曜日まで空欄必要
while( $weekday != $first_weekday ){
  echo ('<td>&nbsp;</td>');
  $weekday++;
}
for( $day = 1; checkdate( $now_month, $day, $now_year ); $day++ ){
  //土曜まで書いたなら日曜に戻して
  //行を変える
  if( $weekday > 6 ){
    $weekday = 0;
    echo ('</tr>' . "\n");
    echo ('<tr>');
  }

  //文字の色を決める
  switch( $weekday ){
    case 0 : //日曜
      $color = 'red';
      break;
    case 6 : //土曜
      $color = 'blue';
      break;
    default : //月曜~金曜
      $color = 'black';
  }
  //1マス表示
  echo ('<td><font color=' .$color. ">" .$day. '</td>');
  //曜日を進める
  $weekday++;
}
//最後の空欄作成
while( $weekday < 7 ){
  echo ('<td>&nbsp;</td>');
  $weekday++;
}
echo ('</tr>' . "\n");  // 最後の</tr>
?>
</table>
</body>
</html>

PHPで日時を扱う

タイムスタンプとは

  • PHPの日時に関する関数では、「1970年1月1日0時」から経過した秒数で表現する(UNIXタイムスタンプ)を使用します
<?php
echo time();

実行すると、今現在のタイムスタンプである秒数が表示されます。

date関数

  • date(日時の書式)
<?php
echo date( '今日は、Y年m月j日です。');
printf関数
  • printf('フォーマットの文字列', %変換指定子1の値, %変換指定子2の値, …)
  • 書き出す文字列の形式を先に指定して、後で実際の値を指定します


printf関数で今日の日付を表示

  • 変換指定子
  • 文字列なら「%s」、変数なら「%d」
<?php
$form = '%s%d年%d月%d日です。';
printf ( $form, '今日は、', date('Y'), date('m'), date('j'));

日付/時間関数

  • 日付/時間を扱う標準関数

日付/時間関数の種類

  • time()
  • mktime()
  • strtotime()
<?php

// 日付や時間に関する関数

// Unixタイムスタンプ(1970/1/1 00:00:00からの経過秒数)

var_dump(time());
var_dump(mktime(7,55,0,6,7,2012)); // 2012/6/7 7:55:00
var_dump(strtotime("2012/6/7 7:55:00"));
var_dump(strtotime("last Sunday"));
var_dump(strtotime("+2 day"));
date関数
  • date関数は、指定した日付のフォーマットで文字列を変換する関数です

日付フォーマットに変換された文字列 = date( 日付フォーマット, 【タイムスタンプ】);

<?php

// 日付や時間に関する関数

// Unixタイムスタンプ(1970/1/1 00:00:00からの経過秒数)

var_dump(time());
var_dump(mktime(7,55,0,6,7,2012)); // 2012/6/7 7:55:00
var_dump(strtotime("2012/6/7 7:55:00"));
var_dump(strtotime("last Sunday"));
var_dump(strtotime("+2 day"));

echo date("z", strtotime("last Sunday"));


フォーマット文字列

  • 「2013/09/25」のような日付の表示を指定する

指定値 説明 戻り値の例
Y 年(4桁) 2012
y 年(2桁) 12
m 月(2桁) 04
n 4
d 日(2桁) 09
j 9
g 時(12時間単位) 4
G 時(24時間単位) 16
h 時(12時間単位で2桁) 04
H 時(24時間単位日2桁) 16
i 分(2桁) 06
s 秒(2桁) 46
a 午前または午後(小文字) pm
A 午前または午後(大文字) PM
L うるう年かどうか 1:うるう年 0:うるう年以外
t 月の日数 28から31
U UNIXタイムスタンプ 1335768642
w 曜日(数値) 0:日曜~6:土曜
W 1年で何週目か 11
z 1年で何日目か 11

<?php
  print date ( 'Y/m/d H:i:s' );
  print '<br>';

  print date ( 'Y/m/d H:i:s', time() );
  print '<br>';

  print date ( 'Y年m月d日 H時i分s秒' );
  print '<br>';

  print date ( 'y-n-j Ah時i分s秒' );
  print '<br>';
  
  $week = array ( '日曜日', '月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日' );
  print '今日は' . $week[date ( 'w' )] . 'です';
mktime関数
  • mktime関数は、現在から一週間後、二ヵ月後 等の日付時刻を取得したい場合に使用する関数です
  • この関数で取得した値をdate関数の引数【タイムスタンプ】として設定することにより、過去・未来の日付時刻が取得できます

タイムスタンプ = mktime ( 時間, 分, 秒, 月, 日, 年 );

<?php
  // 現在日付時刻を設定
  $year = date ( 'Y' );
  $month = date ( 'm' );
  $day = date ( 'd' );
  $hour = date ( 'G' );
  $minute = date ( 'i' );
  $second = date ( 's' );

  // 一週間後を設定
  $OneWeekLater = mktime ( 0, 0, 0, $month, $day + 7, $year );
  print '一週間後は' . date ( 'Y/m/d', $OneWeekLater ) . 'です<br>';
  
  // このように書いても同じ結果です
  print '一週間後は' . date ( 'Y/m/d', mktime ( 0, 0, 0, date ( 'm' ), date ( 'd' ) + 7, date ( 'Y' ) ) ) . 'です<br>';

  // 今年の7月末日を設定
  // (引数の「日」に0を設定すると、前月の末日が自動設定されます。)
  $JulyLast = mktime ( 0, 0, 0, 8, 0, $year );
  print '今年の7月末日は' . date( 'y年m月d日', $JulyLast ) . 'です<br>';

  // 5日後の1時間前を設定
  $Before = mktime ( $hour - 1, $minute, $second, $month, $day + 5, $year );
  print '5日後の1時間前は' . date ( 'y年m月d日 H時i分s秒', $Before ) . 'です<br>';