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

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

 

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

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

тема: Ответ 002 на задачу N 6
 
 автор: SoftTime   (15.02.2006 в 23:05)   письмо автору
 
 

Ответ 002 на задачу N 6.
С условиями задачи можно ознакомится по ссылке.
описание возможностей скрипта
может работать почти со всеми формами важно что-бы имя формы было script6_1.php желательно что-бы последний элемент формы содержал пробел скрипту не требуется что-бы форма была в отдельном файле
может работать с методими post и get
принцип работы
получает переданные переменные из get или пост и сует в массив
не переданные элементы получает из реферера(открывает файл и ищет в нем) и тоже сует в массив
манипулирует массивами
записывает в файл

<!--index.php форма-->
<!--udaf-->
<form name=script6_1 action=script6_1.php method=post>
<input type=radio name=radio_1> radio<br>
<input type=checkbox name=check_1>checkbox<br>
<input type=text name=text_1>text<br>
<textarea name=textarea_1> </textarea>textarea<br>
<input type=submit>
</form>



//script6_1.php
<?php
//$_REQUEST ен подходит так как там могуь быть куки
//получаем переменные из $_GET
//$req_vars=$_GET;
//получаем переменные из $_POST
$req_vars $_POST;
//реферер
$ref $_SERVER['HTTP_REFERER'];
//открываем рефферер
$ref_file fopen($ref"r");
//читаем рефферер
while(!feof($ref_file))
{
    
//читаем и удаляем пробелы и переносы строк
    
$file_string trim(fgets($ref_file ));
    
$ref_in_one_srring. = $file_string;
}
fclose($ref_file);
//ищем форму в реферере
preg_match_all("|<form name=script6_1[^>]+>(.*)[^>]+m>|U"$ref_in_one_srring$forms);
$form=$forms[0][0];
//ищем тэги инпут внутри формы
preg_match_all("/<input type=\S+ name=\S+[*>]/U"$form$input);
//создаем массив для имен инпут элементов формы(поступивших из реферрера)
$form_elements = array();
//обработка массива инпут(так как он содержит много мусора)
foreach($input[0] as $value)
{
    
//так как существуют проблемы с сохранением невыбранных элементов формы то будем
    //сохранять только чекбоксы и радио-кнопки и форму для ввода текста
    
if(preg_match("/radio_/i"$value)||preg_match("/check_1/i"$value))
    {
        
$form_element=explode("name="$value);
        
//удаляем конец тэга
        
$form_element=preg_replace("/>/"""$form_element);
        
//добавляем имя элемента в массив имен элементов формы
        
array_push($form_elements$form_element[1]);
    }
}
foreach(
$req_vars as $req_var_name => $req_var_value)
{
    echo(
$req_var_name);
}
//переделываем массив для функций array_search() и array_unshift() т.к в ходе тестирования обнаружилось
//что эти функции специфично работают с ассоциативными массивами
//элементы этого массива будут записаны в файл
$vars_to_write = array();
foreach(
$req_vars as $req_var_name => $req_var_value)
{
    
//меняем местами индекс и значение
    
$vars_to_write[$req_var_value] = $req_var_name;
}
foreach(
$form_elements as $var_name)
{
    
//если элемент нашелся в массиве из переданных перемных то выходим из цикла
    
if(array_search($var_name$vars_to_write)) break;
    
//усли не нашелся то добавляем
    
else array_unshift($vars_to_write$var_name);
}
//готовим строку для записи в файл
foreach($vars_to_write as $req_var_value => $req_var_name)
{
    
//пытаемя соблюдать синтаксис, с которым это делает
    
$string_to_write. = $req_var_name"="$req_var_value."&";
}
//удаляем файл
unlink("data.txt");
//открываем
$data_file=fopen("data.txt""a");
//записываем
fwrite($data_file$string_to_write);
//закрываем файл данных
fclose($data_file);
?>



//script2.php
<?php
if( file_exists("data.txt") && (filesize("data.txt") > 0))
{
    
//открываем файл для чтения
    
$data_file fopen("data.txt""r");
    
//читаем строку
    
$file_string fgets($data_file );
    
//разбивка на переменные
    
$vars explode("&"$file_string);
    echo(
"<form name=script6_1 action=script6_1.php method=post>");
    foreach(
$vars as $value)
    {
    
//разбивка переменных на имя и значение по знаку равно
        
$var explode("="$value);
        list(
$var_name$var_value) = $var;
        
//вывод элемента формы в зависимости от имени переменной(поиск по регулярному выражению)
        //радиокнопка
        
if(preg_match("/\Aradio_/i"$var_name))
        {
            echo(
"<input type=radio name=".$var_name);
            
//если выделена
            
if($var_value=="on")echo(" checked ");
            echo(
">radio<br>");
        }
        
//чексбокс
        
else if(preg_match("/\Acheck_/i"$var_name))
        {
            echo(
"<input type=checkbox name=".$var_name);
            
//если выделена
            
if($var_value=="on")echo(" checked ");
            echo(
">checkbox<br>");
        }
        
//текст
        
else if(preg_match("/\Atext_/i"$var_name))
        {
            echo(
"<input type=text name=".$var_name." value='".$var_value."'>text<br>");
        }
        
//текстареа
        
else if (preg_match("/\Atextarea_/i"$var_name))
        {
            echo(
"<textarea name=".$var_name.">".$var_value."</textarea>textarea<br>");
        }
    }
    echo(
"<input type=submit>");
    echo(
"</form>");
    
//вывод формы
    //закрываем файл
    
fclose($data_file);
}
//если файл не создан или пустой
else header("Location: index.php");
?>


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

   
 
 автор: cheops   (16.02.2006 в 00:10)   письмо автору
 
   для: SoftTime   (15.02.2006 в 23:05)
 

Преклоняюсь перед вашей настойчивостью, языки, стили уходят и приходят - всё можно выучить и поднатореть в любой технологии, но способность не бояться и решать самые сложные задачи всегда будет отличать профессионала. Огромное спасибо за то, что вы приняли участие в решении этой задачи. Моя оценка оригинальности 4, читабельности 5. Скрипт при первом вызове выдаёт ошибки
Parse error: syntax error, unexpected '=' in d:\main\test1\script6_1.php on line 17

после их исправления всё работает, правда почему-то не восстанавливается значение радио-кнопки. Для сохранения значений удобнее было бы использовать сериализацию, а для передачи значений скрытые поля.

   
 
 автор: udaf   (16.02.2006 в 00:21)   письмо автору
 
   для: cheops   (16.02.2006 в 00:10)
 

вроде исправил

//script6_1.php
<?php 
//$_REQUEST ен подходит так как там могуь быть куки 
//получаем переменные из $_GET 
//$req_vars=$_GET; 
//получаем переменные из $_POST 
$req_vars $_POST
//реферер 
$ref $_SERVER['HTTP_REFERER']; 
//открываем рефферер 
$ref_file fopen($ref"r"); 
//читаем рефферер 
while(!feof($ref_file)) 

    
//читаем и удаляем пробелы и переносы строк 
    
$file_string trim(fgets($ref_file )); 
    
$ref_in_one_srring .= $file_string

fclose($ref_file); 
//ищем форму в реферере 
preg_match_all("|<form name=script6_1[^>]+>(.*)[^>]+m>|U"$ref_in_one_srring$forms); 
$form=$forms[0][0]; 
//ищем тэги инпут внутри формы 
preg_match_all("/<input type=\S+ name=\S+[*>]/U"$form$input); 
//создаем массив для имен инпут элементов формы(поступивших из реферрера) 
$form_elements = array(); 
//обработка массива инпут(так как он содержит много мусора) 
foreach($input[0] as $value

    
//так как существуют проблемы с сохранением невыбранных элементов формы то будем 
    //сохранять только чекбоксы и радио-кнопки и форму для ввода текста 
    
if(preg_match("/radio_/i"$value)||preg_match("/check_1/i"$value)) 
    { 
        
$form_element=explode("name="$value); 
        
//удаляем конец тэга 
        
$form_element=preg_replace("/>/"""$form_element); 
        
//добавляем имя элемента в массив имен элементов формы 
        
array_push($form_elements$form_element[1]); 
    } 

foreach(
$req_vars as $req_var_name => $req_var_value

    echo(
$req_var_name); 

//переделываем массив для функций array_search() и array_unshift() т.к в ходе тестирования обнаружилось 
//что эти функции специфично работают с ассоциативными массивами 
//элементы этого массива будут записаны в файл 
$vars_to_write = array(); 
foreach(
$req_vars as $req_var_name => $req_var_value

    
//меняем местами индекс и значение 
    
$vars_to_write[$req_var_value] = $req_var_name

foreach(
$form_elements as $var_name

    
//если элемент нашелся в массиве из переданных перемных то выходим из цикла 
    
if(array_search($var_name$vars_to_write)) break; 
    
//усли не нашелся то добавляем 
    
else array_unshift($vars_to_write$var_name); 

//готовим строку для записи в файл 
foreach($vars_to_write as $req_var_value => $req_var_name

    
//пытаемя соблюдать синтаксис, с которым это делает 
    
$string_to_write .= $req_var_name"="$req_var_value."&"

//удаляем файл 
unlink("data.txt"); 
//открываем 
$data_file=fopen("data.txt""a"); 
//записываем 
fwrite($data_file$string_to_write); 
//закрываем файл данных 
fclose($data_file); 
?> 

   
 
 автор: Trianon   (16.02.2006 в 17:01)   письмо автору
 
   для: udaf   (16.02.2006 в 00:21)
 

А мне это решение очень понравилось. Тем, что автор решения не пытался "подправить" условия задачи. И хотя можно придумать ситуации, когда оно (решение) не прокатит, на 99% их придется выдумывать намеренно. Запрос по рефереру - очень сильный ход. Браво.

   
 
 автор: АКУЛА   (09.04.2006 в 17:50)   письмо автору
 
   для: Trianon   (16.02.2006 в 17:01)
 

А что такое рефферер ?

   
 
 автор: cheops   (09.04.2006 в 23:36)   письмо автору
 
   для: АКУЛА   (09.04.2006 в 17:50)
 

реферером называют адрес страницы, с которой посетитель перешёл на текущую страницу. Получить его можно из элемента суперглобального массива $_SERVER['HTTP_REFERER'].

PS Такие вопросы лучше оформлять в виде отдельных тем на форуме.

   
 
 автор: АКУЛА   (12.04.2006 в 12:32)   письмо автору
 
   для: cheops   (09.04.2006 в 23:36)
 

Ок

   
Rambler's Top100
вверх

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