вторник, 11 августа 2009 г.

PHP: определение возраста

Проблема: На сайте могут регистрироваться только совершеннолетние пользователи. При регистрации нового пользователя спрашивается его дата рождения. Необходимо определить достиг пользователь совершеннолетия или нет?

Решение.
В начале необходимо обработать данные, введенные пользователем. В данном случае пользователь вводит дату в формате DD.MM.YYYY, иными словами имеем
$date="11.08.1984";

Ту часть кода, которая проверяет введенные данные пользователем на соответствие формату, я опущу. Непосредственно сама обработка данных выглядит следующим образом:

$arr = explode('.',$date);
$day = $arr[0];
$month = $arr[1];
$year = $arr[2];

Функция explode() используется для разделение строки на элементы по разделителю (первый параметр). В данном примере разделитель - точка.
Далее формируем строку, которую можно было бы передать функции strtotime(), которое возвращает метку времени в Unix.

$date1 = arr[2].'-'.arr[1].'-'.arr[0];

И вот кульминация :) На многочисленных сайтах в сети расписываются сложные функции, которые пытаются подсчитать количество високосных лет, делят, умножают... Я это сделал красиво
echo (gmdate('Y', time() - strtotime($date1)) - 1970);


З.Ы. Камень в M$ :)
PHP Manual: gmdate

The valid range of a timestamp is typically from Fri, 13 Dec 1901 20:45:54 GMT to Tue, 19 Jan 2038 03:14:07 GMT. (These are the dates that correspond to the minimum and maximum values for a 32-bit signed integer). However, before PHP 5.1.0 this range was limited from 01-01-1970 to 19-01-2038 on some systems (e.g. Windows).

А если почитать что писали в мануале к PHP4, например, из данного учебника.

Замечание: В семействе ОС Microsoft Windows системные библиотеки, реализующие эту функцию, содержат ошибки, поэтому функция gmdate() на этих системах не поддерживает отрицательные значения аргумента timestamp.

В операционных системах Unix/Linux эта проблема не возникает, так как системные библиотеки в этих системах реализованы корректно.

PHP не может исправить ошибки в системных библиотеках. Для решения этой и подобных проблем обращайтесь к производителю операционной системы.


Последний абзац приятно улыбнул)))

Реализация проверки даты на сайте (попросил расшарить один человек)

if (isset($_GET['bday'])) {
if (!eregi('^[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{4}$', $_GET['bday'])) {
$message = 'Некорректный формат даты.
';
$message .= 'Введите пожалуйста Вашу дату рождения в формате дд.мм.гггг (например, 29.11.1985).';
} else {
$arr = explode('.',$_GET['bday']);
$day = $arr[0];
$month = $arr[1];
$year = $arr[2];

$bday = $arr[2].'-'.$arr[1].'-'.$arr[0];
if ( $bday=strtotime($bday) ) {
$bday = (gmdate('Y', time() - $bday) - 1970);
} else {
$valid = 'false';
$message = 'Некорректный формат даты.
';
$message .= 'Введите пожалуйста Вашу дату рождения в формате дд.мм.гггг (например, 29.11.1985).';
echo "[{val:'$valid',msg:'$message'}]"; exit;
}
if ( $bday>=18 ) {$valid = 'true'; $message='';
} else {
$valid='false';
$message = 'Извините, но согласно правилам регистрироваться на сайте могут только совершеннолетние.';
}
}
}


Подразумевается, что после выполнения данной проверки будет сформирован ответ в формате json, вида [{val:'$valid',msg:'$message'}]. На самом деле без полного кода проверки формы регистрации этот кусок кода нельзя просто взять и использовать. Но если кому-нибудь лень написать элементарное регулярное выражение, то можете скопировать с моей реализации :)

Читать дальше...