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

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

 

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

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

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

Ответ 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==|| !file_exists($filename) )
{
    foreach(
$data as $key=>$value)
    {
        
//$format - это первый символ из строки с именем в массиве data
        
$format=substr ($key01);
        
        
//Забираем фрагмент даты с необходимым форматом
        
$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" соответственно (это только к примеру).
        //Если по-научному - добавляем ведущий нуль
        
$istrlen($i)=="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/htmlcharset=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;
    }
    
    
//Добавляем ведущий нуль
    
$valuestrlen($value)=="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($handleLOCK_EX);

//Пишем в файл
if(fwrite($handle$content) === FALSE)
{
    echo 
$header;
    echo 
"Не могу произвести запись в файл";
    exit;
}

//Разблокируем и закрываем файл
flock($handleLOCK_UN);
fclose($handle);

//Redirect!
header("Location: ./index.php");
?>
<!-- end of handler.php-->


http://www.softtime.ru/info/task.php?id_article=73

   
 
 автор: cheops   (05.02.2006 в 23:30)   письмо автору
 
   для: 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 :).

   
 
 автор: Artem S.   (06.02.2006 в 18:41)   письмо автору
 
   для: SoftTime   (04.02.2006 в 21:34)
 

Трудно что-то сказать, скрипт мудреный да и "читать" его сложно было. Опять много не понятных "телодвижений".

   
 
 автор: PantiL   (06.02.2006 в 22:11)   письмо автору
 
   для: 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

   
Rambler's Top100
вверх

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