Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ответ 001 на задачу N 3
 
 автор: SoftTime   (05.02.2006 в 17:48)   письмо автору
 
 

Ответ 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 or $month 12)
  {
  echo 
'Номер месяца должен быть в диапазоне от 1 до 12.';
  exit;
  }
  
if (
$hour or $hour 23)
  {
  echo 
'Час должен быть в диапазоне от 0 до 23.';
  exit;
  }

if (
$minute or $minute 59)
  {
  echo 
'Минуты должны быть диапазоне от 0 до 59';
  exit;
  }

// день должен быть в пределах 1 - 31 если в месяце 31 день
if (($day or $day 31) and ($month == or $month == or $month == or $month == or $month == or $month == 10 or $month == 12))
  {
  echo 
'День должен быть в диапазоне от 1 до 31.';
  exit;
  }

// день должен быть в пределах 1 - 30 если в месяце 3 дней
if (($day or $day 30) and ($month == or $month == or $month == or $month == 11))
  {
  echo 
'День должен быть в диапазоне от 1 до 30.';
  exit;
  }
  
// день должен быть в пределах 1 - 28 если месяц февраль и год не високосный
if (($day or $day 28) and $month == and $year%!= 0)
  {
  echo 
'День должен быть в диапазоне от 1 до 28.';
  exit;
  }

// день должен быть в пределах 1 - 29 если месяц февраль и год високосный
if (($day or $day 29) and $month == and $year%== 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

   
 
 автор: Artem S.   (06.02.2006 в 00:07)   письмо автору
 
   для: 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. Излишнее кол-во "логов".

   
 
 автор: cheops   (06.02.2006 в 00:25)   письмо автору
 
   для: SoftTime   (05.02.2006 в 17:48)
 

Код умерено громоздкий, но зато проверка очень хорошо реализована и так и сяк пробовал обмануть :))) Правда с выпадающими списками пользователь бы и не ошибался практически. К недостаткам можно отнести также оригинальный формат хранения данных вместо UNIXSTAMP.

   
 
 автор: PantiL   (06.02.2006 в 22:16)   письмо автору
 
   для: cheops   (06.02.2006 в 00:25)
 

Ответ 001
Не вырезаются пробелы (А я обманул проверку)

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования