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

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

 

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

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

тема: Ответ 010 на задачу N 3
 
 автор: SoftTime   (04.02.2006 в 22:56)   письмо автору
 
 

Ответ 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)"/> &ndash;
<input type="text" size="1" maxlength="2"
name="mon" value="<?= sprintf('%02d'$date['mon']); ?>"
onkeyup="checkNumericInput(this)" /> &ndash;
<input type="text" size="1" maxlength="2"
name="d" value="<?= sprintf('%02d'$date['mday']); ?>"
onkeyup="checkNumericInput(this)" />&nbsp;
<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$m0$mon$d$y);
  
# откроем файл (предыдущая метка будет стёрта)
  
$file fopen($filename"w");
  
# "залачиваем" файл
  
flock($fileLOCK_EX);
  
# пишем данные
  
fwrite($file$result);
  
# "разлачиваем файл"
  
flock($fileLOCK_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

   
 
 автор: cheops   (05.02.2006 в 23:43)   письмо автору
 
   для: SoftTime   (04.02.2006 в 22:56)
 

Немного громоздко и сложно проверяется корректность, в результате чего дата вида 2006 02 05 23:39 - которую мне файл сам предлагает сохранить отказывается принимать - говорит "Неверный формат даты.". Выпадающие списки позволили бы значительно снизить сложность и упростить проверку.

   
 
 автор: Artem S.   (06.02.2006 в 09:44)   письмо автору
 
   для: SoftTime   (04.02.2006 в 22:56)
 

Ничего личного, это только мое скромное мнение. Вы вправе не согласится с ним, и я тоже могу ошибаться.

1. Мудренная логика в начале, не прозрачно.
2. extract($_POST);
Сразу нет. Могут быть проблемы если файл "встраивают" в другой проект.
3. использование getdate и checkdate - хорошо.
4. Блокировка - тоже хорошо.
5. В целом ничегго лишнего нет.

   
 
 автор: PantiL   (06.02.2006 в 22:12)   письмо автору
 
   для: Artem S.   (06.02.2006 в 09:44)
 

Ответ 010
Должны быть заполнены все поля.

Это и все что мне сказал скрипт (файла data.txt не существовало)

   
Rambler's Top100
вверх

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