Forum Webscript.Ru

Программирование => PHP => Тема начата: oksale от 04 Января 2003, 20:46:41

Название: Проблема с формой
Отправлено: oksale от 04 Января 2003, 20:46:41
Может, вопрос банален, но я только начинаю :(
Проблема вот в чем:
я пишу анкету для ввода инф-ции в БД. Причем анкета разделена на информационные блоки, и каждый блок - в своей форме. Итого у меня их(форм) четыре штуки. И здесь возникают две проблемы:

1. В первой форме form1 я получаю идентификатор из таблицы, который потом использую в форме form2. Но вторая форма не видит переменной первой формы. Вопрос: как мне ее достать?

2. На каждой форме у меня есть кнопка подтверждения ввода, то есть данные вводятся не все сразу, а последовательно. Когда я подтверждаю ввод данных первой формы, я сделала так, чтобы они сохранялись на форме. Но когда я подтверждаю ввод на второй форме, все элементы первой формы очищаются, а мне нужно, чтобы они оставались. И если я нажму кнопку на третьей форме, данные на первой и второй должны сохраняться. Как это делается??

Очень нужно, а найти ничего что-то не могу.
Благодарю за помощь.
Название: Проблема с формой
Отправлено: Меняздесьдавнонет от 04 Января 2003, 21:09:14
очень интересное описание.
а почему не записывать в базу данные из заполненных форм?

переменную достать просто. надо ее просто передать в скрипт.
Вот тебе выдержка из фака.
Замечание: куки использовать не стоит
Цитировать
Отличие веб-приложения от обычной программы
Начиная писать программы для веба, многие начинающие программисты сталкиваются с такой ошибкой. Они рассматривают систему "браузер-сервер", как обычное приложение. Интерактивное. Нажал кнопку - система среагировала. Провел мышкой - среагировала. Вся информация, которая доступна клиенту - доступна и программе, программа все время находится в памяти.

Так вот, в веб-программировании это не так.
Сервер и браузер общаются, посылая друг другу запросы по особому протоколу - HTTP. Соединение может инициировать только браузер. Он посылает серверу запрос - показать такой-то файл. Сервер клиенту файл посылает.
Только так и происходит. Клиент запросил - сервер отдал. И забыл сразу о клиенте. Остюда становится понятным ответ на вопрос, можно ли точно узнать, сколько юзеров сечас на сайте. Нельзя. потому, что "на сайте" нету ни одного. Они соединяются, запрашивают страницу, и отсоединяются. Не имеют постоянного оединения с сервером, как, например, игроки в Кваку. Узнать можно только примерно, записывая время каждого соединения и выбирая записи за определенный промежуток времени.

Отсюда становится ясно, что сервер может узнать о клиенте очень мало. Только то, что клиент пришлет в HTTP-запросе. Разрешения экрана там нет ;-)
Все, что сервер может знать о клиенте, можно посмотреть командой phpinfo()

Как работает РНР, где он выполняется?
РНР выполняется на сервере. Браузер посылает серверу запрос на страницу с php кодом. Сервер отдает эту страницу на исполнение интерпретатору PHP, интерпретатор генерирует HTML код, отдает серверу, а сервер посылает клиенту. Никакого РНР кода в брау
зер не попадает (это важно! Это значит, что увидеть исходный код PHP скрипта невозможно!). Единственный способ отправить что-то скрипту - это кликнуть по ссылке или нажать на кнопку в форме. Так, чтобы РНР обрабатывал какие-то действия пользователя в браузере - невозможно. РНР остался на сервере, ждать новых запросов с данными для обработки. PHP, но не скрипт! Скрипт, который выполнялся, отдавая пользователю страницу, завершил работу. Все данные, которые были в нем - пропали. Именно поэтому, если какая-то переменная нужна при последующих вызовах скрипта, ее надо этому скрипту передать снова.

Способы общения браузера с сервером.
Способов, предоставляемых протоколом HTTP, немного. Это важная информация. Никаких других способов нет.
Браузер может отправлять информацю серверу следующими способами:
GET - это когда данные передаются в адресной строке, например, когда пользователь жмет ссылку.
POST - когда он нажимает кнопку в форме.
Cookie - если сервер поставил куку, и она не устарела, то браузер отсылает ее при каждом обращении к серверу.
HTTP authentication - если сервер запрашивал HTTP авторизацию, то браузер при каждом обращении шлет введенные логин и пароль.
Все остальное - лишь использование этих методов. Например, когда запрос посылает яваскрипт, или когда по ссылке запрашивается скрипт.

РНР может посылать HTTP заголовки двумя командами - header и setcookie.
Я очень рекомендую программу FlashGet, которая, скачивая файлы с сервера, показывает все HTTP заголовки - и сервера,и клиента. Очень хорошая практика, а так же проверка - что шлет твой скрипт.

--------------------------------------------------------------------------------
Не передаются переменные!!!

Данные в скрипт передаются. Просто начаная с версии 4.1, РНР перестал автоматически назначать их переменным. За это отвечает параметр register_globals в php.ini.
Если register_globals=on, то все полученные скриптом данные будут назначены соответствующим переменным.
Если register_globals=off, то получить значение переменной можно обратившись к массиву, соответствующему способу передачи данных в скрипт.
Например:
Передаем методом GET: script.php?var=value
echo $_GET[\'var\'] напечатает "value".
Подробнее об этом нововведении можно прочитать здесь:http://www.xpoint.ru/archive/topic8/43/8759.html

Системные переменные, такие, как QUERY_STRING, PHP_SELF можно получить с помощью getenv -
getenv(\'PHP_SELF\');
а можно в начале сскрипта написать
extract($_SERVER);
Это будет даже правильнее - потому что переменные окружения затрут все одноименные переменные, если таковые вдруг найдутся.
Название: Проблема с формой
Отправлено: new от 04 Января 2003, 21:27:12
Цитировать
2. На каждой форме у меня есть кнопка подтверждения ввода, то есть данные вводятся не все сразу, а последовательно. Когда я подтверждаю ввод данных первой формы, я сделала так, чтобы они сохранялись на форме. Но когда я подтверждаю ввод на второй форме, все элементы первой формы очищаются, а мне нужно, чтобы они оставались. И если я нажму кнопку на третьей форме, данные на первой и второй должны сохраняться. Как это делается??


Варианты разные есть, и смоей точки зрения, куки возможны конечно, но это не лучший вариант (100% согласен с RomikChef ).
Один из вариантов - сохранять данные в сессии, которые при необходимости будут подставляться в value формы. Пожалуй это даже в данном случае оптимально.
Кроме того конечно можно сохранять данные в БД, что часто, но не всегда, имеет смысл.
Название: Проблема с формой
Отправлено: Bang от 05 Января 2003, 10:09:14
Тебе просто надо вместе с данными очередной формы передавать и данные из предыдущих (почему так - тебе очень хорошо привел цитату RomikChef).
Если ты не хочешь сразу писать полученную часть данных в БД, как предложил RomikChef, можно в каждую следующую форму дописывать скрытые поля. Что-то вроде
>


Но это, конечно, только один из вариантов, хотя, может, и самый простой.
Название: Проблема с формой
Отправлено: Меняздесьдавнонет от 05 Января 2003, 11:34:46
Bang это самый неправильный и бессмысленный способ.
Название: Проблема с формой
Отправлено: GoBeer от 05 Января 2003, 12:05:37
RomikChef а почему? Неплохо было-бы после сабмита первой формы яваскриптом установить хидены на второй (если не требуется серверная обработка/проверка данных первой формы). При этом не требуется промежуточная отправка данных на сервер, как в случае с сохранением данных в сессии. И чем этот способ неправильный и бессмысленный?
Название: Проблема с формой
Отправлено: Bang от 05 Января 2003, 12:07:58
Цитировать
это самый неправильный и бессмысленный способ.

Действительно, гуру :), объясни, почему?
Название: Проблема с формой
Отправлено: oksale от 05 Января 2003, 13:10:54
Результат моих попыток таков:
echo $_GET[\'var\'] - не работает, то есть, если переменная формируется в первой форме, я эту штуку прописываю во второй, чтобы она там сохраняла значение. Но когда нажимаю кнопку обработки второй формы, значение переменной пропадает. Может, я ее не туда сую?

$_GET, getenv(\'PHP_SELF\'); вообще не поняла, как работают, а ссылка не грузится

Hidden оказался самым простым. Но в связи с этим вопрос. Допустим, у меня есть страничка. На ней я нажимаю на какую-то кнопку, и у меня выводится список товаров. Я нажимаю на какой-нибудь товар, у меня появляется список фирм, ну и так далее. То есть у меня инф-ция должна накапливаться. Так мне всю кучу переменных и передавать этим hidden? (вариант с БД мне что-то не очень хочется использовать)

И еще вопрос на другую тему: как в php делается проверка введенных данных? Я нажимаю на кнопку, проверяются все текстовые элементы, и если какой-то не заполнен, на него ставится фокус, и процесс дальше не идет(мне такое нужно).
У меня есть функция, написанная на js. Она у меня корректно работала, если страничка была на html, а ее обработка – на php, то есть два файла получалось. А сейчас я все пишу в одном файле php, и она работает некорректно, то есть говорит, что поле не заполнено, ставит на него фокус, а программа продолжает выполняться дальше.
Название: Проблема с формой
Отправлено: Bang от 05 Января 2003, 13:27:36
Цитировать
Так мне всю кучу переменных и передавать этим hidden?

Потому, наверное, RomikChef и сказал, что это плохой способ, что тащить всю эту кучу переменных неудобно, нелогично и некрасиво. Но если ты хочешь обойтись только hidden, наверное, другого выхода нет.
Название: Проблема с формой
Отправлено: oksale от 05 Января 2003, 13:43:38
Я не хочу только им обходиться, я просто ничего другого не поняла :))
Название: Проблема с формой
Отправлено: Xander от 05 Января 2003, 14:02:04
oksale
А тебе точно нужно, чтобы форма была на нескольких страницах?
На одной, ИМХО, удобнее.
И обрабатывать такое гораздо удобнее.
Название: Проблема с формой
Отправлено: oksale от 05 Января 2003, 14:09:42
вообще-то необязательно, но я хотела бы разобраться, как все это работает
Название: Проблема с формой
Отправлено: Xander от 05 Января 2003, 14:23:42
ИМХО самый оптимальный способ - хранить данные в сессии. Тогда можно будет сделать корректный откат к предыдущими страницам, с сохранением информации, и обработать потом можно будет все разом, а не постранично.
Название: Проблема с формой
Отправлено: new от 05 Января 2003, 14:33:27
oksale
Цитировать
echo $_GET[\'var\'] - не работает

Предположим, что $_GET всё таки в порядке (если нет - то уточни, какая версия PHP тобой используется).
Цитировать
если переменная формируется в первой форме, я эту штуку прописываю во второй, чтобы она там сохраняла значение. Но когда нажимаю кнопку обработки второй формы, значение переменной пропадает. Может, я ее не туда сую?

Допустим ты передаёшь значение переменной из первой формы во вторую (каким способом это возможно уже обсуждалось). Поянтно, что она должна быть проверена после её получения, и в случае необходимости ещё раз передана второй формой или (что ИМХО лучше) получена из сессии или БД.
Посмотри мой первый пост очень внимательно ещё раз:
Цитировать
сохранять данные в сессии, которые при необходимости будут подставляться в value формы

Это один из двух, с моей точки зрения, нормальных вариантов (ещё один - это сохранение данных в БД, что пожалуй ещё лучше, но что бы выбрать один из этих двух вариантов, нужно знать что ты конкретно делаешь) для твоего случая.
И RomikChef тебе огромную цитату привёл.


Цитировать
я хотела бы разобраться, как все это работает

Посмотри ещё раз внимательно тему, все ответы здесь уже есть.
Название: Проблема с формой
Отправлено: GoBeer от 05 Января 2003, 15:21:36
oksale, возможно тебе еще рано писать такие вещи... нужно разобраться с пхп поглубже, потренироваться - никакие советы не заменят собственного опыта и понимания "как это всё работает"
Название: Проблема с формой
Отправлено: oksale от 05 Января 2003, 16:01:23
to GoBeer:
эт мой курсовой проект, рано-не рано, а делать надо:))
буду разбираться, что делать-то...

to new:
версия 4.0
а я про сессии слышала, что они могут не поддерживаться(что это как-то задается), или польз-ль вообще может удалить файлы, где все это будет храниться. Как тогда быть?
Название: Проблема с формой
Отправлено: Xander от 05 Января 2003, 16:08:04
Цитировать

а я про сессии слышала, что они могут не поддерживаться(что это как-то задается), или польз-ль вообще может удалить файлы, где все это будет храниться. Как тогда быть?

Дать такому умному пользователю по голове.
Нет, правда.
В веб-приложениях защиту от дурака ИМХО почти нереально сделать.
Название: Проблема с формой
Отправлено: Bang от 05 Января 2003, 16:08:39
В сессии, конечно, лучше всего, имхо.
Потому что при такой частичной записи в БД, после каждого фрагмента, встает такой вопрос: а если пользователь бросил на полпути заполнять форму? Что делать с этими огрызками данных?
Название: Проблема с формой
Отправлено: Nevermind от 05 Января 2003, 18:04:18
Файлы сессии хранятся на сервере. Пользователь-дурак при всём желании не сможет их оттуда удалить.

А не поддерживаться могут кукисы (отключены просто). Тогда идентификатор сессии будет передаваться в url.
Цитировать
Потому что при такой частичной записи в БД, после каждого фрагмента, встает такой вопрос: а если пользователь бросил на полпути заполнять форму? Что делать с этими огрызками данных?

А зачем вообще на полпути в базу записывать?

Вообще, данные имхо можно обнулять по таймауту...
Название: Проблема с формой
Отправлено: new от 05 Января 2003, 18:34:22
oksale
Цитировать
версия 4.0

???
Значит иди на http://www.php.net и бери 4.3.0 (это настойчивая рекомендация).

Кроме того полезно почитать http://www.php.net/manual/ru/

Особое внимание удели:
http://www.php.net/manual/ru/reserved.variables.php
http://www.php.net/manual/en/ref.session.php

Nevermind
Цитировать
Файлы сессии хранятся на сервере.

Ну да, или в БД иногда тоже...
Цитировать
зачем вообще на полпути в базу записывать?
, в общем то совершенно без разницы в какой файл писать - в файл сессии или в файл БД.

Bang
Цитировать
В сессии, конечно, лучше всего, имхо.
Потому что при такой частичной записи в БД, после каждого фрагмента, встает такой вопрос: а если пользователь бросил на полпути заполнять форму? Что делать с этими огрызками данных?

Дык, всё равно - по каким то условиям чистить необходимо, будь то сессия в файле или запись в БД.
Название: Проблема с формой
Отправлено: Меняздесьдавнонет от 05 Января 2003, 23:50:03
Оксана.
Сначала тебе надо перечитать уитату, которую я тебе привел в самом начале.
И накрепко уяснить себе то, что там написано.
Что непонятно - спросить.
Потому, что твои слова показывают, что ты совершенно ничего из этого текста не поняла.

Фокус в поле находится в браузере у клиента. а программа выполняется на сервере.
И к тому моменту, когда у пользователя появляется фокус, программа давно отработала.

Пожалуйста. Уясни себе сначала, как работает РНР. Согласись - без этого трудно двигаться дальше.

Но попробуем.
Вариантов с передачей данных у тебя немного. Точнее, всего два. или тащить хидденами, что глупо и бесмысленно. Потому, что ты три раза будешь их таскать туда сюда и по объему это получится гораздо больше, чем все сделать одной формой.

Второй вариант - сохранять на сервере. Как - это уже второй вопрос. В базе, в файле или в сессии - это не принципиально.

Сессии - это тоже не бином ньютона. Это просто файл на сервере, имя которого передается от скрипта к скрипту либо куками либо по ссылке, либо хидден полем.
Поэтому ты можешь либо воспользоваться готовым механизмом, либо написать свой - к примеру, в форму пишешь хидден поле с именем файла, и в этот файл дописываешь все время данные. А после завершающей формы файл стирать.

К скрипту придется дописать небольшой код, который удаляет устаревшие файлы - которые остались недозаполненными.

С базой еще проще - такие недозаписи можно удалять одним запросом.

С сессиями тоже - PHP удалит их сам.

Сессии... Могут не поддерживаться самим PHP. Как и базы данных и работа с текстовыми файлами, да и самого РНР может не быть - верно?
Стереть файл пользователь может. Закрыв, например, браузер. И это как раз удобно - тебе самой не надо заботиться об этом. В общем, мне надо больше понимать твою задачу, а тебе - в РНР, чтобы судить о том, что удобнее и правильнее.

И еще. Сначала разберись полностью, на 100% с ОДНОЙ формой. Как данные принимать, обрабатывать, проверять, сохранять. А потом уже делай многостраничную. Зачем себе самой трудности создавать?
Название: Проблема с формой
Отправлено: Меняздесьдавнонет от 06 Января 2003, 00:04:49
Цитировать
Я нажимаю на какой-нибудь товар, у меня появляется список фирм, ну и так далее. То есть у меня инф-ция должна накапливаться. Так мне всю кучу переменных и передавать этим hidden?


Варианта 3:
1. По нажатию кнопки данные отправляются скрипту, который выдает новую картинку. страница, естественно, перезагружается. Решение чисто серверное. Остальные два чисто клиентские.
2. Все варианты заранее запихать в яваскрипт.
3. По нажатии кнопки открывать попап окно, которое отправляет информацию серверу, получает нужные данные, передает в основную страницу и закрывает само себя.

На РНР проверка производится так.
в самом начале скрипта проверяешь, была ли нажата кнопку submit
если была, то проверяешь заполнение.
Если были ошибки, то формируешь сообщения о них.
если нет ошибок, то записываешь, делаешь редирект, куда надо и завершаешь работу скрипта.
выводишь сообщения об ошибках
Выводишь форму.

Фокусировать, извини, PHP не умеет. Он, как я уже говорил, находится на сервере, а фокусы - на клиенте.
Вот тебе пример простейшей формы с проверкой

$err=\'\';
if (isset($submit)) {
  if (!$name) $err="Вы забыли написать свое имя
";
  if (!$notes) $err.="Вы забыли написать сам отзыв!
";
  if (!$err) {
    $s=$name."|".$notes."|".time()."\\n";
    $fp=fopen("gb.txt","a");
    fwrite($fp,$s);
    fclose($fp);
    Header("Location: $PHP_SELF");
    exit;
  }
}
if ($err) echo \'\'.$err.\'\';
?>


Name: ">

Notes:



Название: Проблема с формой
Отправлено: Меняздесьдавнонет от 06 Января 2003, 13:09:54
Обязтельно прочти весь http://faq.phpclub.net
там чтения на 10 минут, а сэкономит тебе десятки часов.
Название: Проблема с формой
Отправлено: Bang от 08 Января 2003, 10:02:40
Цитировать
С базой еще проще - такие недозаписи можно удалять одним запросом.

Можно, конечно. Вопрос - в какой момент это лучше делать? (это я серьезно спрашиваю)
Название: Проблема с формой
Отправлено: Меняздесьдавнонет от 08 Января 2003, 13:50:06
в начале каждого скрипта.
Название: Проблема с формой
Отправлено: Bang от 08 Января 2003, 14:18:59
спасибо :)