[PHP] 誕生日から満年齢を得る

ユーザの満年齢をチェックしたいときがある。

たとえば18禁のエロサイトとか、成人していることが条件の通販サイトとか。ユーザに誕生日を入力させて、現時点の満年齢をチェックしたい。

今日と誕生日の2つのDateTimeオブジェクトを作成して、その差を年単位で取得すれば満年齢が得られる。

参考サイト

PHP: DateTime – Manual
http://php.net/manual/ja/class.datetime.php

[PHP] 存在する日付かチェックする

ユーザに入力させた日付が実際に存在するかチェックしたいときがある。

たとえば30日しかない月なのに31日と入力されたり、うるう年でないのに2月29日と入力されたり。そういった不適切な入力を検知して、ユーザに再入力を促したい。そのためには入力された日付の妥当性を確認する必要がある。

日付の妥当性チェックはcheckdate関数で行える。

参考サイト

PHP: checkdate – Manual
http://php.net/manual/ja/function.checkdate.php

[PHP] 関数から複数の戻り値を返す

便利なPHPの言語仕様にの1つにlist構文がある。

list構文を使うことで、関すから複数の値を返すことができる。

参考サイト

PHP: list – Manual
http://php.net/manual/ja/function.list.php

PHP: 返り値 – Manual
http://php.net/manual/ja/functions.returning-values.php

[PHP] 文字列中に部分文字列が含まれるかチェックする

strpos関数を使う。マルチバイト文字列の場合はmb_strpos関数。

strpos関数は文字列中で部分文字列が最初に現れる位置を0ベースの整数値で返す。部分文字列が見つからない場合はFALSEを返すのでこれをチェック。

参考サイト

PHP: strpos – Manual
http://us2.php.net/manual/ja/function.strpos.php

PHP: mb_strpos – Manual
http://php.net/manual/ja/function.mb-strpos.php

[PHP] 比較演算子 == と === の違い

PHPには === (イコールが3個) という比較演算子がある。

C++やC#から来た人は意外に思うかも。僕も最初「なんだこれ?」と思った。

マニュアルを見て違いを押さえておく。

名前 結果
$a == $b 等しい 型の相互変換をした後で $a が $b に等しい時に TRUE。
$a === $b 等しい $a が $b に等しく、および同じ型である場合に TRUE 。

たとえば

  • $a = 123;
  • $b = ‘123’;

の場合、以下の結果となる

  • $a == $b はTRUE
  • $a === $b は型の違いによりFALSE

この否定の演算子もある。振る舞いは同様。

名前 結果
$a != $b 等しくない 型の相互変換をした後で $a が $b に等しくない場合に TRUE。
$a !== $b 等しくない $a が $b と等しくないか、同じ型でない場合に TRUE 。

参考サイト

PHP: 比較演算子 – Manual
http://php.net/manual/ja/language.operators.comparison.php

[PHP] 2つの日時の差を表示する

date_diff() 関数を使うと、2つの日時の差を得ることができる。

参考サイト

PHP: DateTime – Manual
http://php.net/manual/ja/class.datetime.php

[PHP] メールを送信する (Smarty)

メールを送信するサンプルコード。メール本文はSmartyで定義。

Smartyを使わないサンプルは以下。

[PHP] メールを送信する | プログラミング雑記
https://www.84kure.com/blog/?p=196

[PHP] メールを送信する

メールを送信するサンプルコード。

[PHP] ファイルをロックして書き込む (排他制御)

複数のプロセスが同じファイルに書き込むような場合には排他制御が必要になる。

しかし、書き込もうとしたファイルが既に別プロセスによってロックされていた場合に「ロックされていたので書けませんでした」と言われても困る。別プロセスがファイルのロックを解除するのを待って書き込んでもらわないと。

以下は、ファイルをロックできなかった場合には一定時間ウェイトしてからファイルへの書き込みを試行する、というリトライ付きのログ書き出し関数の例。

[PHP] Proxyサーバー経由のアクセス元IPアドレスを取得する

$_SERVER配列にセットされる情報は、Proxyサーバーを経由するかしないかで若干変わってくる。

Proxyサーバーを経由しない場合

  • $_SERVER[‘REMOTE_ADDR’] – アクセス元のIPアドレス
  • $_SERVER[‘SERVER_ADDR’] – WebサーバーのIPアドレス

しかし、Proxyサーバーを経由する場合

  • $_SERVER[‘HTTP_X_FORWARDED_FOR’] – アクセス元のIPアドレス
  • $_SERVER[‘REMOTE_ADDR’] – ProxyサーバーのIPアドレス
  • $_SERVER[‘SERVER_ADDR’] – WebサーバーのIPアドレス

以下に、現在利用しているサーバー(Nginx)における$_SERVER配列をダンプしておく。