|
|
|
| Ответ 001 на задачу N 3.
С условиями задачи можно ознакомится по ссылке.
Здравствуйте. Вот мое решение задачи №3.
index.php
<html>
<head>
<title>Задача N3</title>
<head>
<body>
<?php
// устанавливаем сразу текущие значения даты
$year = date('Y');
$month = date('n');
$day = date('j');
$hour = date('G');
$minute = date('i');
// проверяем существования файла: если существует, то открываем для чтения
if (file_exists('date.txt'))
{
$fp = fopen('date.txt', 'r'); // открываем date.txt
if (!$fp)
{
echo 'Не удалось открыть файл!<br><br>Попробуйте позднее.';
exit;
}
$d = fgets($fp); // считываем значение из файла
if ($d)
{
// считываем значения даты
list($year, $month, $day, $hour, $minute) = explode("|", $d);
echo 'Дата считана из файла.';
}
else
{
echo 'Файл пуст. Установлена текущая дата.';
}
}
else
{
echo 'Файл не существует. Установлена текущая дата.';
}
echo '
<form action="handler.php" method="post">
Год <input type="text" name="year" value='.$year.'><br>
Месяц <input type="text" name="month" value='.$month.'><br>
День <input type="text" name="day" value='.$day.'><br>
Час <input type="text" name="hour" value='.$hour.'><br>
Мин <input type="text" name="minute" value='.$minute.'><br><br>
<input type="submit" value="ОК"> <input type="reset" value="Сброс">
</form>';
?>
</body>
</html>
|
handler.php
<?php
$year = trim($_POST['year']);
$month = trim($_POST['month']);
$day = trim($_POST['day']);
$hour = trim($_POST['hour']);
$minute = trim($_POST['minute']);
// проверяем чтобы введенные в форме значения были числовыми
if (ereg('[^0-9]', $year.$month.$day.$hour.$minute))
{
echo 'Год, месяц, день, час и минута должны быть числовыми значениями!';
exit;
}
if ($month < 1 or $month > 12)
{
echo 'Номер месяца должен быть в диапазоне от 1 до 12.';
exit;
}
if ($hour < 0 or $hour > 23)
{
echo 'Час должен быть в диапазоне от 0 до 23.';
exit;
}
if ($minute < 0 or $minute > 59)
{
echo 'Минуты должны быть диапазоне от 0 до 59';
exit;
}
// день должен быть в пределах 1 - 31 если в месяце 31 день
if (($day < 1 or $day > 31) and ($month == 1 or $month == 3 or $month == 5 or $month == 7 or $month == 8 or $month == 10 or $month == 12))
{
echo 'День должен быть в диапазоне от 1 до 31.';
exit;
}
// день должен быть в пределах 1 - 30 если в месяце 3 дней
if (($day < 1 or $day > 30) and ($month == 4 or $month == 6 or $month == 9 or $month == 11))
{
echo 'День должен быть в диапазоне от 1 до 30.';
exit;
}
// день должен быть в пределах 1 - 28 если месяц февраль и год не високосный
if (($day < 1 or $day > 28) and $month == 2 and $year%4 != 0)
{
echo 'День должен быть в диапазоне от 1 до 28.';
exit;
}
// день должен быть в пределах 1 - 29 если месяц февраль и год високосный
if (($day < 1 or $day > 29) and $month == 2 and $year%4 == 0)
{
echo 'День должен быть в диапазоне от 1 до 29.';
exit;
}
// объединяем значения массива $_POST, разделенные | в строку для записи в файл
$dt = implode("|", $_POST);
$fp = fopen('date.txt', 'w+');
if (!$fp)
{
echo 'Не удалось открыть файл!';
exit;
}
$f = fwrite($fp, $dt);
if (!$f)
{
echo 'Не удалось записать дату в файл!';
exit;
}
echo 'Дата записана в файл';
?>
|
http://www.softtime.ru/info/task.php?id_article=73 | |
|
|
|
|
|
|
|
для: SoftTime
(05.02.2006 в 17:48)
| | Ничего личного, это только мое скромное мнение. Вы вправе не согласится с ним, и я тоже могу ошибаться.
1. Нет проверки в handler'e на отправку данных. Т.к. это обработчик это делать не обязательно, но я бы сделал, a eсли кто-то случайно зайдет (из любопыства ради)?. Но все же за ошибку не считаю.
2. Конструкця
if (ereg('[^0-9]', $year.$month.$day.$hour.$minute))
мне кажется излишней. вполне хватит и !is_numeric и понятна будет человеку не знакомому с regexp'aми
3. if ( ... ) { echo '...'; exit; }
Выход после каждой ошибки. Т.е. чтобы увидеть все ошибки пользователю придеться по очередно править форму до победного результата. Может завести для этого переменную $error ?
Что-то вроде
$error = false;
if (...) { $error = true; $error_str[] = "..."; }
if (...) { $error = true; $error_str[] = "..."; }
if (...) { $error = true; $error_str[] = "..."; }
if (!$error) {
echo "<ul>";
foreach ($error_str as $err) { echo "<li>".$err."</li>";}
echo "</ul>";
exit;
}
4. $dt = implode("|", $_POST);
Таит в себе опасность.
а) Не видно в каком порядке "собираются" переменные
б) помимо формы можно "специально" послать и другие переменные.
5. Файл не был закрыт. Хотя это не обязательно, но рекомендуется.
6. Месяц представлен как число. Это несколько не удобно.
7. Излишнее кол-во "логов". | |
|
|
|
|
|
|
|
для: SoftTime
(05.02.2006 в 17:48)
| | Код умерено громоздкий, но зато проверка очень хорошо реализована и так и сяк пробовал обмануть :))) Правда с выпадающими списками пользователь бы и не ошибался практически. К недостаткам можно отнести также оригинальный формат хранения данных вместо UNIXSTAMP. | |
|
|
|
|
|
|
|
для: cheops
(06.02.2006 в 00:25)
| | Ответ 001
Не вырезаются пробелы (А я обманул проверку) | |
|
|
|