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

Форум PHP

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

 

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

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

тема: Проблема передачи данных из формы в обработчик (action) для новичков
 
 автор: Jet   (23.11.2004 в 20:23)   письмо автору
 
 

Для начала - исходный код:

request.php, на который производятся ссылки из разных источников с передачей данных методом GET (...href="/request.php?title='consult&type='01''"). Кроме консультации есть и другие услуги. Каждая услуга содержит несколько подвидов...

<?include('top.php');?>
<!-- Начало данных --------------- -->

<? include ('request.form.php')?>
<? 
include ('request.logwrite.php'); ?>

<!-- Конец данных --------------- -->
<? include('bottom.php'); ?>    
</body>
</html>

Содержимое top.php, bottom.php отвечает исключительно за внешний вид, поэтому во внимание их можно не брать

request.form.php

<table>
<tr><td>
<form method=post action="<?echo $_SERVER['PHP_SELF']; ?>">
    <input type=hidden name="title" value=<?php echo $_GET['title'];?>>
    <input type=hidden name="type" value=<?php echo $_GET['type'];?>>
    Ф.И.О.<br>
    <input type=text name="fio"><br>
    E-Mail<br>
    <input type=text name="em"><br>
    Контактный телефон<br>
    <input type=text name="phone"><br>
    Комментарии<br>
    <textarea name="txt"></textarea><br>
    <input type="submit" name="submit" value="Сделать запрос"><br>
    Не забудьте указать свою контактную информацию!
</form>
</td></tr></table>

Для удобства чтения кода здесь и далее урезано всё, что касается внешнего вида и форматирования.

request.logwrite.php

<? 
$eos 
"#";
$div "~";
if (
$fio<>"" & ($em<>"" or $phone<>""))
{
  
$text date("d.m.Y \- H:i:s").
              
$div.$REQUEST_TYPE[$_POST['title']].
              
$div.$CONSULT_TYPE[$_POST['type']].
              
$div.$_POST["fio"].$div.$_POST["em"].
              
$div.$_POST["phone"].
              
$div.$_POST["txt"].
              
$eos;

  
$fname $_SERVER[DOCUMENT_ROOT].
                    
$FOLDER_LOGS_REQUESTS."/".
                    
date("ymd").".req";

  
$file fopen($fname,"a+");
  
fwrite($file$text);
  
fclose($file);
}
?>

При записи в файл всё происходит так, как и задумано, кроме REQUEST_TYPE, CONSULT_TYPE, которые прописаны в site.settings.php - инклуд в top.php, содержащий значения, общие для всего сайта.

Часть site.settings.php (данные значительно упрощены, но структура передана в точности)

<?
...
$REQUEST_TYPE = array(
   
learn=>"ОБУЧЕНИЕ",
   
consult=>"КОНСУЛЬТАЦИЯ");
$CONSULT_TYPE = array(
   
01=>"Консультация 1",
   
02=>"Консультация 2",
   
03=>"Консультация 3");
...
?>

---------------------------------------------------------------
Ошибка в том, что в лог-файл(см. request.logwrite.php) вместо строк из $REQUEST_TYPE и $CONSULT_TYPE попадают пустые строки.

Была попытка прописать для формы action="request.logwrite.php", однако это не изменило ситуацию.
-----------------------------------------------------------------
Вопросы:
- Возможно, это не оптимальное решение задачи, в таком случае какое оптимально? (не используя базу данных!)
- Где пропадают данные $REQUEST_TYPE и $CONSULT_TYPE (я пробовал эхо значений на разных этапах и в некоторых местах эхо соответствовало ожидаемому, к сожалению уже не вспомню в каких конкретно, так как слишком много вариантов проверял)

   
 
 автор: cheops   (23.11.2004 в 21:18)   письмо автору
 
   для: Jet   (23.11.2004 в 20:23)
 

Мне удалось довести переменные до файла, на пути встретились следующие фичи:
1) Строка запроса
request.php?title='consult&type='01''

по-моему должна выглядеть так
request.php?title=consult&type=01'

2) В примере нигде нет включения файла site.settings.php:
<?
 
include ('site.settings.php');
 include (
'request.form.php');
 include (
'request.logwrite.php');
?>

3) Сам файл site.settings.php я поправил следующим образом (ключи для второго массива поместил в кавычки от греха - PHP скорее всего их преобразует в числа)
<? 
$REQUEST_TYPE 
= array( 
   
learn=>"ОБУЧЕНИЕ"
   
consult=>"КОНСУЛЬТАЦИЯ"); 
$CONSULT_TYPE = array( 
   
'01'=>"Консультация 1"
   
'02'=>"Консультация 2"
   
'03'=>"Консультация 3"); 
?>

   
 
 автор: Jet   (23.11.2004 в 21:44)   письмо автору
 
   для: cheops   (23.11.2004 в 21:18)
 

1) Строка запроса должна выглядеть так (была опечатка)
request.php?title='consult'&type='01'

я пытался исправить, но там глючок форума случился (читайте мыло о подробностях)

2) site.settings.php включается в top.php, в самом его начале (см. request.php)

3) Ключи 01, 02 и т.д. в оригинале - строки из латинских символов (кстати, в кавычках). Просто лень было фантазировать, вот и взял такие в пример. Можно смело менять на что-то типа "cons01", "cons02", или даже вообще индексировать массив по порядковым номерам - то есть, классически.
-------------------------
Кроме того, РНР, кажется, определяет тип из контекста. Если переменная используется в контексте строчных операций, то она рассматривается как строка в любом случае (даже массивы возвращают в таком контексте строку "array")

Итого у Вас действительно всё сработало? В таком случае, в чём может быть глюк у меня? Может, какие настройки???

Apache 1.3.23
PHP Version 4.3.9 (Zend)
MySQL v.3.23.47 -nt

--------------------------------------
if ($fio<>"" && ($em<>"" or $phone<>"")) - просто была опечатка... так и должно быть =)
Ушел читать указанное........

   
 
 автор: cheops   (23.11.2004 в 21:54)   письмо автору
 
   для: Jet   (23.11.2004 в 21:44)
 

Давайте я вам просто архив с файлами выложу - при каком раскладе у меня работает... Настройки здесь вряд-ли играют роль, такой код должен везде работать... Не могут переменные где-то ещё затираться?

   
 
 автор: Jet   (23.11.2004 в 22:06)   письмо автору
 
   для: cheops   (23.11.2004 в 21:54)
 

Это точная копия кода (кроме оформления)

Настораживают имена переменных ($title у меня просто есть на уровне всей страницы, как часть заголовка, а type - вроде на ключевое слово смахивает), но не думаю, что это причина (для таких подозрений содержание глюка уж очень неубедительно смотрится)

   
 
 автор: cheops   (23.11.2004 в 22:11)   письмо автору
 
   для: Jet   (23.11.2004 в 22:06)
 

Файлик не прикрепился... Я тоже так же примерно рассуждал - нет вроде должно всё работать...

   
 
 автор: Jet   (23.11.2004 в 22:18)   письмо автору
 
   для: cheops   (23.11.2004 в 21:54)
 

Вот где разница! Я встретил следующие строки в Вашем архиве, в request.php.
  $_GET['title'] = 'consult';
  $_GET['type'] = '01';


1) идентичны ли эти строки следующей адресной строке?
... request.php?title='consult'&type='01'


2) принципиальна ли здесь такая разница в присвоении значений (из адресной строки, и просто константой в теле скрипта)?

   
 
 автор: Jet   (23.11.2004 в 22:21)   письмо автору
 
   для: cheops   (23.11.2004 в 21:54)
 

разница в коде в request.php:
  $_GET['title'] = 'consult';
  $_GET['type'] = '01';


1) идентично ли это адресной строке
... request.php?title='consult'&type='01'

2) в чём может быть разница в присвоении через адресную строку и присвоении константой в теле скрипта?

ИЗВИНЯЮСЬ ЗА ПОВТОР. НА ПРОШЛОМ ПОСТЕ БЫЛА ОШИБКА ПРИ ОТПРАВКЕ И Я НЕ ОЖИДАЛ, ЧТО ОТПРАВИЛОСЬ. ЭТОТ ПОСТ МОЖНО УДАЛИТЬ!!!

   
 
 автор: cheops   (23.11.2004 в 22:27)   письмо автору
 
   для: Jet   (23.11.2004 в 22:21)
 

1) Идентичны
2) В принципе разница заключается в том, что параметры получают это значение при каждой загрузки страницы, что не важно когда форма и обработчик разделены, но может иметь некоторое значение когда они в одном файле. Но в нашем случае вроде всё нормально и это присвоение не действует на процесс обработки данных. В любом случае можно попробовать это на реальном коде...
3) Так же полезно проконтролировать содержимое массивов $_GET и $_POST, для того чтобы выяснить на каком этапе теряются данные:
<?php
  print_r
($_GET);
  
print_r($_POST);
?>

   
 
 автор: Jet   (23.11.2004 в 22:33)   письмо автору
 
   для: cheops   (23.11.2004 в 22:27)
 

если убрать включение request.logwrite.php в request.php и написать вместо этого просто <form action="request.logwrite.php" method=get (или post)> Это будет считаться разделенными формой и обработчиком?

   
 
 автор: cheops   (23.11.2004 в 23:02)   письмо автору
 
   для: Jet   (23.11.2004 в 22:33)
 

Да. Но у вас и так очень хорошо структурирован код...

   
 
 автор: Jet   (23.11.2004 в 23:11)   письмо автору
 
   для: cheops   (23.11.2004 в 23:02)
 

>Да. Но у вас и так очень хорошо структурирован код...
Спасибо за комплимент, однако не помогает =)

Проблема в том, что в РНР я не могу отслеживать значений переменных в runtime кроме как выводом на страницу (или в файл), а этот вывод уже после обновления страницы переписывается на уже пустые значения. Или я ошибаюсь?
-------------------------------
ЗЫ: Идея! попробую выводить в файл, дописывая его!
скоро выдам результаты...

   
 
 автор: Jet   (23.11.2004 в 23:31)   письмо автору
 
   для: Jet   (23.11.2004 в 23:11)
 

ОДНАКО!

Сейчас стоит обработчик формы request.logwrite.php
Попробовал выводить значения перед формированием $text и получил полную загадку...
в ответ на код
echo "GET: ";
print_r($_GET); 
echo "<br>POST: ";
print_r($_POST); 
echo "<br>REQUEST_TYPE: ";
print_r($REQUEST_TYPE); 
echo "<br>CONSULT_TYPE: ";
print_r($CONSULT_TYPE); 
echo "<br>REQUEST_TYPE+: ";
print_r($REQUEST_TYPE[$_POST['title']]); 
echo "<br>CONSULT_TYPE+: ";
print_r($CONSULT_TYPE[$_POST['type']]); 

Я получил вот такой результат!!!

GET: Array ( ) 
POST: Array ( [title] => consult [type] => 01 [fio] => Jet [em] => jet@host.com [phone] => 1234567 [txt] => Comment [submit] => Сделать запрос ) 
REQUEST_TYPE: 
CONSULT_TYPE: 
REQUEST_TYPE+: 
CONSULT_TYPE+: 23.11.2004 - 22:25:43~~~Jet~jet@host.com~1234567~Comment#


В чём прикол??? Я же НИГДЕ не пытаюсь присваивать значений в CONSULT_TYPE['consult']....

Кроме того, куда вдруг пропали значения в массивах???

   
 
 автор: Jet   (23.11.2004 в 23:38)   письмо автору
 
   для: Jet   (23.11.2004 в 23:31)
 


Вот это я выдал!!!
Я же в обработчик не включил site.settings.php =)))

Включил - тут же сработало. А вы говорите, код структурирован ;)

---------------------------------
Считаю на этом вопрос закрытым...
Огромное спасибо за участие и действительно дельные советы!
УДАЧИ!

   
 
 автор: cheops   (23.11.2004 в 23:45)   письмо автору
 
   для: Jet   (23.11.2004 в 23:31)
 

Вы вызываете этот код до или после включения
<?php
 
include ('site.settings.php');
?>

   
 
 автор: Jet   (23.11.2004 в 23:55)   письмо автору
 
   для: cheops   (23.11.2004 в 23:45)
 

>Вы вызываете этот код до или после включения
Не понял, указанный Вами код, или мною перед этим? И после какого включения? (включение request.logwrite.php в request.php я убрал после того, как разнёс форму и обработчик в разные файлы, а потом просто забыл включить в этот уже отдельный обработчик site.settings.php в самом начале)
---------------------
сейчас у меня всё отлично заработало!
огромное спасибо!
-------------------------------

Вывод
- Проблема решилась в результате разделения обработчика и собственно формы в разные файлы. (Что и требовалось доказать =))

   
 
 автор: cheops   (23.11.2004 в 22:32)   письмо автору
 
   для: Jet   (23.11.2004 в 22:21)
 

Только вот строка запроса должна быть не
 request.php?title='consult'&type='01'

а
 request.php?title=consult&type=01

   
 
 автор: Jet   (23.11.2004 в 22:35)   письмо автору
 
   для: cheops   (23.11.2004 в 22:32)
 

а строка request.php?title='consult'&type='01' некорректна?
Если да, - то почему?

Это вполне может оказаться причиной!!! .... эээ нет не может....
у меня в оригинале - без кавычек 8(

   
 
 автор: glsv (Дизайнер)   (23.11.2004 в 22:40)   письмо автору
 
   для: Jet   (23.11.2004 в 22:35)
 

Переменная
title будет равна \'consult\'
Т.е. будут добавлены символы кавычек в значение.

   
 
 автор: glsv (Дизайнер)   (23.11.2004 в 22:38)   письмо автору
 
   для: Jet   (23.11.2004 в 22:21)
 

>1) идентичны ли эти строки следующей адресной строке?
Хм.. вообще говоря – нет.
Это идентично вот этой адресной строке
request.php?title=consult&type=01
(без одинарных кавычек)
Хотя, возможно, на это влияют настройки PHP

>2) принципиальна ли здесь такая разница в присвоении значений (из адресной строки, и просто константой в теле скрипта)?
Константы – это, думаю, cheops для проверки ставил.

   
 
 автор: Jet   (23.11.2004 в 22:46)   письмо автору
 
   для: glsv (Дизайнер)   (23.11.2004 в 22:38)
 

За кавычки спасибо - просто не знал
----------------------------------
А вот константы, это, похоже, всё-таки принципиально. Они-то точно присваиваются и значений не меняют, а вот GET... скорее всего, только как отловить, где именно (точнее, даже, в какой момент и почему), я просто не представляю себе.

   
 
 автор: cheops   (23.11.2004 в 21:25)   письмо автору
 
   для: Jet   (23.11.2004 в 20:23)
 

Да, ещё мне не понравилась строчка
<?php
  
if ($fio<>"" & ($em<>"" or $phone<>"")) 
?>

Может имеется ввиду
<?php
  
if ($fio<>"" && ($em<>"" or $phone<>"")) 
?>

   
 
 автор: cheops   (23.11.2004 в 21:31)   письмо автору
 
   для: Jet   (23.11.2004 в 20:23)
 

Для хранения информации можно так же использовать плоские файлы http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=549, а так же упаковку массивов в строку при помощи функции serialize, с последующей распаковкой unserialize
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=806
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=390
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=473

   
 
 автор: cheops   (23.11.2004 в 21:33)   письмо автору
 
   для: cheops   (23.11.2004 в 21:31)
 

Так же можно использовать dbf-файлы...

http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=752

   
 
 автор: Jet   (23.11.2004 в 22:27)   письмо автору
 
   для: cheops   (23.11.2004 в 21:31)
 

Кстати, за serialize - отдельное спасибо 8)
похоже, я нечто подобное просто ручками делаю... а так было бы проще

   
Rambler's Top100
вверх

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