|
|
|
| Ответ 012 на задачу N 3.
С условиями задачи можно ознакомится по ссылке.
<!-- Задача N3 -->
<!-- neudor -->
<!-- index.php -->
<html>
<head>
<title>index.php</title>
<meta content="text/html; charset=windows-1251" http-equiv=Content-Type>
</head>
<body>
<!-- Это шрифт. Так, для красоты. -->
<font face='Courier'>
<?php
$filename="./date.txt";
//Это основной рабочий массив.
//
//"Y_year" - имя
//Первый индекс - это буква, идентификатор, по которому функция date()
//выводит кусок даты (год или день или др.) в требуемом формате
//Второй индекс - это название, чтобы всем было понятно
//
//"1970_2038" - диапазон
//Первая цифра - это с какого элемента начинается выпадающий список
//Вторая цифра - это каким он заканчивается.
$data=array
(
"Y_year" => "1970_2038",
"m_month" => "1_12",
"d_day" => "1_31",
"H_hour" => "1_24",
"i_minute" => "1_60"
);
$encounter=0;
$error=0;
//Если файл существует
if ( file_exists($filename) )
{
//Читаем в массив и соединяем в строку через ""
$temp=implode("", file($filename));
//Пребор Фрагмент => Диапазон
foreach($data as $key=>$value)
{
//Это номер, с которого начинается вхождение текущего фрагмента даты в файле
//Если символ ":" не найден, значит либо файл пуст,
//либо записан неправильно - т.е. не нашим скриптом
//Тогда выходим из цикла и вводим идентификатор ошибки
if( !$encounter=strpos($temp, ":", $encounter) )
{
$error=1;
break;
}
//Это увеличенпие позиции вхождения связано с тем, что функция strpos
//нашла вхождение ":", а забирать соотв. значение фрагмента даты нужно
//со следующего символа.
$encounter+=1;
//Это размер фрагмента (сколько символов). Может быть "2" или "4"
$size=explode("_", $value);
$size=strlen( $size['1'] );
//Забираем строку начиная с символа $encounter длиной $size
$existing[$key]=substr ( $temp, $encounter , $size );
}
}
//Если файла не существует или при чтении из файла произошла ошибка
if( $error==1 || !file_exists($filename) )
{
foreach($data as $key=>$value)
{
//$format - это первый символ из строки с именем в массиве data
$format=substr ($key, 0, 1);
//Забираем фрагмент даты с необходимым форматом
$existing[$key]=date("$format");
}
}
echo "
<br>
<b>Редатировать дату:</b>
<form name='form' action='./handler.php' method='POST'>
Год: Месяц: День: Часы: Минуты:<br>
";
//Здесь поисходит вывод
foreach($data as $name=>$size)
{
echo " <select name='$name' type=text>
";
//Разбиваем значение "диапазон" массива date на две части
$size=explode("_", $size);
//Перебираем от минимального к максимальному
for($i=$size['0']; $i<=$size['1']; $i++)
{
//Если, например, имеем цифру "3" или "6", заменяем
//её на "03" и на "06" соответственно (это только к примеру).
//Если по-научному - добавляем ведущий нуль
$i= strlen($i)==1 ? "0".$i : $i;
//Это вывод тегов option, и если какое-то значение совпадает
//с соответствующим ему в сформированном массиве $existing,
//То оно сопровождается атрибутом selected
echo " <option ";
if($i==$existing[$name])
{
echo "selected";
}
echo " value='$i'>$i</option>
";
}
echo " </select>
";
}
echo "
<br><br>
<input type=submit value='GO'>
</form>
</font>
</body>
</html>
";
?>
<!-- end of index.php-->
|
<?php
/*= handler.php =*/
//Это заголовок для кодировки
$header="
<html>
<head>
<title>script2.php</title>
<meta content="text/html; charset=windows-1251" http-equiv=Content-Type>
</head>
<body>
";
//Это гениальная функция проверки на недопустимые символы
//дейтствует по принципу: все, что не разрешено - запрещено!
//$input - строка для фильтрования
//$check - "разрешенная" строка допустимых символов
//Возвращает TRUE, если все нормально и
//FALSE, если есть недопустимые символы
//(на самом деле, если какой-то символ не найден в "разрешенной" строке)
function check($input, $check)
{
//Заранее предполагаем, что все будет хорошо.
$ok = TRUE;
//Пребираем каждый символ строки $input
for ($i=0; $i<strlen($input); $i++)
{
//Берем очередной символ
$chr = $input{$i};
//Говорим, что мы пока еще не нашли его в "разрешенной" строке
$found = FALSE;
//Теперь перебираем "разрешенную" строку
for ($j=0; $j<strlen($check); $j++)
{
//И если наш символ в ней есть, говорим, что он найден
if ($chr == $check{$j}) $found = TRUE;
}
//Если символ так и не был найден - его нет среди разрешенных,
//Значит функция возвратит FALSE
if (!$found) $ok = FALSE;
}
//Возвращаем значение
return $ok;
}
//Это строка для записи в файл
$content="";
//Перебираем массив $_POST
foreach( $_POST as $key=>$value )
{
//Проверяем каждое значение массива на допустимые символы,
//в данном случае - это цифры
if( !check($value, "1234567890") )
{
echo $header;
echo "Вы пытаетесь меня взломать, вводя недопустимые символы?.<br>";
echo "<input type=button value='Назад' OnClick='javascript:history.back()'>";
exit;
}
//Добавляем ведущий нуль
$value= strlen($value)==1 ? "0".$value : $value;
//Дописываем в строку очерередное значение
$content.="$key:$value ";
}
//Попытка открыть файл
if(!$handle=fopen('./date.txt', 'wt'))
{
echo $header;
echo "Не могу открыть файл.<br>";
echo "<input type=button value='Назад' OnClick='javascript:history.back()'>";
exit;
}
//Блокируем файл
flock($handle, LOCK_EX);
//Пишем в файл
if(fwrite($handle, $content) === FALSE)
{
echo $header;
echo "Не могу произвести запись в файл";
exit;
}
//Разблокируем и закрываем файл
flock($handle, LOCK_UN);
fclose($handle);
//Redirect!
header("Location: ./index.php");
?>
<!-- end of handler.php-->
|
http://www.softtime.ru/info/task.php?id_article=73 | |
|
|
|
|
|
|
|
для: SoftTime
(04.02.2006 в 21:34)
| | 1) Достаточно громоздко
2) handler.php выдаёт ошибку "Parse error: syntax error, unexpected T_STRING in d:\main\test2\handler.php on line 9" - это очень плохо, код необходимо тестировать перед отправкой
3) Так же слишком громоздко хранится дата
Y_year:2006
m_month:02
d_day:05
H_hour:23
i_minute:24
|
Лучше хранить её в виде числа секунд, прошедших с 1 января 1970 года.
4) Однако скрипт с поставленной задачей справляется (после исправления ошибки в handler.php :). | |
|
|
|
|
|
|
|
для: SoftTime
(04.02.2006 в 21:34)
| | Трудно что-то сказать, скрипт мудреный да и "читать" его сложно было. Опять много не понятных "телодвижений". | |
|
|
|
|
|
|
|
для: Artem S.
(06.02.2006 в 18:41)
| | Ответ 012
Parse error: syntax error, unexpected T_STRING in x:\home\uch.ru\www\handler.php on line 9
|
| |
|
|
|