|
|
|
| Ответ 010 на задачу N 3.
С условиями задачи можно ознакомится по ссылке.
<?php
# скрипт index.php к задаче N3
# Гончаров, Александр, Саня
#####################################################
# Внимание! Данный скрипт предназначен для тех задач,
# даты которых вписываются в рамки юниксовой метки
# времени (с 1970-01-01 по 2037-12-31)
# З. Ы. Я немного ограничил максимальную дату
#####################################################
# имя файла с датой
$filename = "date.txt";
# проверка существования файла
if ( file_exists($filename) ) {
# проверка читаемости файла
if ( is_readable($filename) ) {
# если файл можно прочесть - прочтём
$file = file_get_contents($filename);
# если файл не пустой
if ( !empty($file) ) {
# получим массив с датой из файла
$date = getdate($file);
} else {
# если файл пустой -
# получим массив с текущей датой
$date = getdate();
}
} else {
# если файл нельзя прочитать -
# получим массив с текущей датой
$date = getdate();
} # конец проверки читаемости файла
} else {
# если файла не существует - получим массив с текущей датой
$date = getdate();
} # конец проверки существования файла
?>
<!-- этот ява-скрипт не даст ввести в поля не цифры -->
<script language="JavaScript">
function checkNumericInput(field) {
if ( field.value.match(/D/) ) {
field.value = field.value.replace(/D/g, '')
}
}
</script>
<form action="handler.php" method="post">
Формат даты:<br />
YYYY-MM-DD hh:mm<br /><br />
<!-- для того, чтобы добавить ведущие нули
к MM, DD, hh и mm используется форматный вывод -->
<input type="text" size="3" maxlength="4"
name="y" value="<?= $date['year'] ?>"
onkeyup="checkNumericInput(this)"/> –
<input type="text" size="1" maxlength="2"
name="mon" value="<?= sprintf('%02d', $date['mon']); ?>"
onkeyup="checkNumericInput(this)" /> –
<input type="text" size="1" maxlength="2"
name="d" value="<?= sprintf('%02d', $date['mday']); ?>"
onkeyup="checkNumericInput(this)" />
<input type="text" size="1" maxlength="2"
name="h" value="<?= sprintf('%02d', $date['hours']); ?>"
onkeyup="checkNumericInput(this)" /> :
<input type="text" size="1" maxlength="2"
name="m" value="<?= sprintf('%02d', $date['minutes']); ?>"
onkeyup="checkNumericInput(this)" />
<br /><input type="submit" />
</form>
<!-- end -->
<?php
# скрипт handler.php к задаче N2
# имя файла с датой
$filename = "date.txt";
# эмулируем работу "register_globals = On"
extract($_POST);
# переменная с ошибками
$error = "";
# проверяем пустоту полей
if ( !empty($y) && !empty($mon) && !empty($d) &&
(!empty($h) || $h === 0) && (!empty($m) || $m === 0) ) {
# формируем две строки: с датой и временем
# для проверки на правильность заполнения
$date = $y.":".$mon.":".$d;
$time = $h.":".$m;
# регулярные выражения для проверки даты и времени
$regexp_date = "/^([d]{1,4}):([d]{1,2}):([d]{1,2})+$/";
$regexp_time = "/^([d]{1,2}):([d]{1,2})+$/";
# проверяем дату и время отдельно друг от друга
$date_valid = preg_match($regexp_date, $date) ? "true" : "false";
$time_valid = preg_match($regexp_time, $time) ? "true" : "false";
# если дата заполнена правильно
if ( $date_valid == "true" ) {
# проверяем, попадает ли она в пределы unix'овой метки времени:
# с 01-01-1970 по 19-01-2038
if ( ($y < 1970) || ($y >= 2038)) {
$error .= "<b>Недопустимое значение даты и времени.</b><br />";
} else {
# если дата попадает в рамки нужной,
# проверяем её реальное существование
if ( !checkdate($mon, $d, $y) ) {
$error .= "<b>Такой даты не существует.</b><br />";
}
}
} else {
# иначе пишем ошибку
$error .= "<b>Неверный формат даты.</b><br />";
} # конец $date_valid = "true"
# если время заполнено правильно
if ( $time_valid == "true" ) {
# проверим временные рамки:
# часы от 0 до 23, минуты от 0 до 59
if ( ($h > 23) || ($m > 59) ) {
$error .= "<b>Такого времени не существует.</b><br />";
}
} else {
$error .= "<b>Неверный формат времени.</b><br />";
}
} else {
$error .= "<b>Должны быть заполнены все поля.</b><br />";
} # конец проверки пустоты полей
if ( empty($error) ) {
# если ошибок нет
# формируем временную метку
$result = mktime($h, $m, 0, $mon, $d, $y);
# откроем файл (предыдущая метка будет стёрта)
$file = fopen($filename, "w");
# "залачиваем" файл
flock($file, LOCK_EX);
# пишем данные
fwrite($file, $result);
# "разлачиваем файл"
flock($file, LOCK_UN);
# закрываем файл
fclose($file);
# направляем юзера на путь истинный :)
header("Location: index.php");
} else {
# если есть ошибки, выводим их и делаем редирект "на путь истинный"
# через одну секунду (чтобы он успел прочитать сообщение об ошибке)
echo("<html><head>");
echo('<meta http-equiv="refresh" content="1; url=index.php" />');
echo("</head><body>");
echo($error."</body></html>");
}
?>
|
http://www.softtime.ru/info/task.php?id_article=73 | |
|
|
|
|
|
|
|
для: SoftTime
(04.02.2006 в 22:56)
| | Немного громоздко и сложно проверяется корректность, в результате чего дата вида 2006 02 05 23:39 - которую мне файл сам предлагает сохранить отказывается принимать - говорит "Неверный формат даты.". Выпадающие списки позволили бы значительно снизить сложность и упростить проверку. | |
|
|
|
|
|
|
|
для: SoftTime
(04.02.2006 в 22:56)
| | Ничего личного, это только мое скромное мнение. Вы вправе не согласится с ним, и я тоже могу ошибаться.
1. Мудренная логика в начале, не прозрачно.
2. extract($_POST);
Сразу нет. Могут быть проблемы если файл "встраивают" в другой проект.
3. использование getdate и checkdate - хорошо.
4. Блокировка - тоже хорошо.
5. В целом ничегго лишнего нет. | |
|
|
|
|
|
|
|
для: Artem S.
(06.02.2006 в 09:44)
| | Ответ 010
Должны быть заполнены все поля.
|
Это и все что мне сказал скрипт (файла data.txt не существовало) | |
|
|
|