|
|
|
| Для начала - исходный код:
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 (я пробовал эхо значений на разных этапах и в некоторых местах эхо соответствовало ожидаемому, к сожалению уже не вспомню в каких конкретно, так как слишком много вариантов проверял) | |
|
|
|
|
|
|
|
для: 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");
?>
|
| |
|
|
|
|
|
|
|
для: 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<>"")) - просто была опечатка... так и должно быть =)
Ушел читать указанное........ | |
|
|
|
|
|
|
|
для: Jet
(23.11.2004 в 21:44)
| | Давайте я вам просто архив с файлами выложу - при каком раскладе у меня работает... Настройки здесь вряд-ли играют роль, такой код должен везде работать... Не могут переменные где-то ещё затираться? | |
|
|
|
|
|
|
|
для: cheops
(23.11.2004 в 21:54)
| | Это точная копия кода (кроме оформления)
Настораживают имена переменных ($title у меня просто есть на уровне всей страницы, как часть заголовка, а type - вроде на ключевое слово смахивает), но не думаю, что это причина (для таких подозрений содержание глюка уж очень неубедительно смотрится) | |
|
|
|
|
|
|
|
для: Jet
(23.11.2004 в 22:06)
| | Файлик не прикрепился... Я тоже так же примерно рассуждал - нет вроде должно всё работать... | |
|
|
|
|
|
|
|
для: 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 в 21:54)
| | разница в коде в request.php:
$_GET['title'] = 'consult';
$_GET['type'] = '01';
|
1) идентично ли это адресной строке
... request.php?title='consult'&type='01'
2) в чём может быть разница в присвоении через адресную строку и присвоении константой в теле скрипта?
ИЗВИНЯЮСЬ ЗА ПОВТОР. НА ПРОШЛОМ ПОСТЕ БЫЛА ОШИБКА ПРИ ОТПРАВКЕ И Я НЕ ОЖИДАЛ, ЧТО ОТПРАВИЛОСЬ. ЭТОТ ПОСТ МОЖНО УДАЛИТЬ!!! | |
|
|
|
|
|
|
|
для: Jet
(23.11.2004 в 22:21)
| | 1) Идентичны
2) В принципе разница заключается в том, что параметры получают это значение при каждой загрузки страницы, что не важно когда форма и обработчик разделены, но может иметь некоторое значение когда они в одном файле. Но в нашем случае вроде всё нормально и это присвоение не действует на процесс обработки данных. В любом случае можно попробовать это на реальном коде...
3) Так же полезно проконтролировать содержимое массивов $_GET и $_POST, для того чтобы выяснить на каком этапе теряются данные:
<?php
print_r($_GET);
print_r($_POST);
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(23.11.2004 в 22:27)
| | если убрать включение request.logwrite.php в request.php и написать вместо этого просто <form action="request.logwrite.php" method=get (или post)> Это будет считаться разделенными формой и обработчиком? | |
|
|
|
|
|
|
|
для: Jet
(23.11.2004 в 22:33)
| | Да. Но у вас и так очень хорошо структурирован код... | |
|
|
|
|
|
|
|
для: cheops
(23.11.2004 в 23:02)
| | >Да. Но у вас и так очень хорошо структурирован код...
Спасибо за комплимент, однако не помогает =)
Проблема в том, что в РНР я не могу отслеживать значений переменных в runtime кроме как выводом на страницу (или в файл), а этот вывод уже после обновления страницы переписывается на уже пустые значения. Или я ошибаюсь?
-------------------------------
ЗЫ: Идея! попробую выводить в файл, дописывая его!
скоро выдам результаты... | |
|
|
|
|
|
|
|
для: 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:31)
| |
Вот это я выдал!!!
Я же в обработчик не включил site.settings.php =)))
Включил - тут же сработало. А вы говорите, код структурирован ;)
---------------------------------
Считаю на этом вопрос закрытым...
Огромное спасибо за участие и действительно дельные советы!
УДАЧИ!
| |
|
|
|
|
|
|
|
для: Jet
(23.11.2004 в 23:31)
| | Вы вызываете этот код до или после включения
<?php
include ('site.settings.php');
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(23.11.2004 в 23:45)
| | >Вы вызываете этот код до или после включения
Не понял, указанный Вами код, или мною перед этим? И после какого включения? (включение request.logwrite.php в request.php я убрал после того, как разнёс форму и обработчик в разные файлы, а потом просто забыл включить в этот уже отдельный обработчик site.settings.php в самом начале)
---------------------
сейчас у меня всё отлично заработало!
огромное спасибо!
-------------------------------
Вывод
- Проблема решилась в результате разделения обработчика и собственно формы в разные файлы. (Что и требовалось доказать =))
|
| |
|
|
|
|
|
|
|
для: Jet
(23.11.2004 в 22:21)
| | Только вот строка запроса должна быть не
request.php?title='consult'&type='01'
|
а
request.php?title=consult&type=01
|
| |
|
|
|
|
|
|
|
для: cheops
(23.11.2004 в 22:32)
| | а строка request.php?title='consult'&type='01' некорректна?
Если да, - то почему?
Это вполне может оказаться причиной!!! .... эээ нет не может....
у меня в оригинале - без кавычек 8( | |
|
|
|
|
|
|
|
для: Jet
(23.11.2004 в 22:35)
| | Переменная
title будет равна \'consult\'
Т.е. будут добавлены символы кавычек в значение. | |
|
|
|
|
|
|
|
для: Jet
(23.11.2004 в 22:21)
| | >1) идентичны ли эти строки следующей адресной строке?
Хм.. вообще говоря – нет.
Это идентично вот этой адресной строке
request.php?title=consult&type=01
(без одинарных кавычек)
Хотя, возможно, на это влияют настройки PHP
>2) принципиальна ли здесь такая разница в присвоении значений (из адресной строки, и просто константой в теле скрипта)?
Константы – это, думаю, cheops для проверки ставил. | |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(23.11.2004 в 22:38)
| | За кавычки спасибо - просто не знал
----------------------------------
А вот константы, это, похоже, всё-таки принципиально. Они-то точно присваиваются и значений не меняют, а вот GET... скорее всего, только как отловить, где именно (точнее, даже, в какой момент и почему), я просто не представляю себе. | |
|
|
|
|
|
|
|
для: Jet
(23.11.2004 в 20:23)
| | Да, ещё мне не понравилась строчка
<?php
if ($fio<>"" & ($em<>"" or $phone<>""))
?>
|
Может имеется ввиду
<?php
if ($fio<>"" && ($em<>"" or $phone<>""))
?>
|
| |
|
|
|
|
|
|
|
|
|
для: cheops
(23.11.2004 в 21:31)
| | Кстати, за serialize - отдельное спасибо 8)
похоже, я нечто подобное просто ручками делаю... а так было бы проще | |
|
|
|