Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PHP, Perl, Python Новый топик    Ответить
 Обработка формы в PHP  [new]
Stang
Member

Откуда:
Сообщений: 111
Доброго всем здравия. Столкнулся с проблемой, не знаю как ее решить и где я туплю. Есть кусок из кода класса:
echo "<div class=\"divA\">";
		if (isset($_POST['doQu']) && isset($_POST['doNe']) && isset($_POST['doId']))
    	{
    		$doNe = (int) $_POST['doNe'];
    		$doQu = (int) $_POST['doQu'];
    		$doId = (int) $_POST['doId'];
                $doAn = $_POST['doAn'];
    		var_dump($doQu);
    		var_dump($doId);
    		var_dump($doNe);
                var_dump($doAn);
    	}

    	?>

    		<form method="POST">

			<?php
    			foreach ($result as $answer) {
    				echo "<input type=\"hidden\" name=\"doId\" value=\"".$answer['id']."\">";
    				echo "<input type=\"hidden\" name=\"doQu\" value=\"".$answer['id_question']."\">";
    				echo "<input type=\"hidden\" name=\"doNe\" value=\"".$answer['id_next_question']."\">";
				echo "<input type=\"submit\" name=\"doAn\" value=\"".$answer['answer']."\">"."    ";

				}
			?>

			</form>

		<?php 
			
echo "</div>";

В форме переменное количество кнопок, которые берутся из БД. По нажатию кнопки я ожидаю, что передадутся переменные. Но, по сути передается только одна из кнопки $_POST['doAn'] (причем нормально по нажатию сменяются данные), остальные какой-то бред и не меняется по нажатию разных кнопок. А мне то не значение кнопки нужно, а получить значения из полей.
Что я не так делаю?
15 янв 19, 15:46    [21785841]     Ответить | Цитировать Сообщить модератору
 Re: Обработка формы в PHP  [new]
vkle
Member

Откуда: Самара
Сообщений: 14450
Stang
В форме переменное количество кнопок
Если количество кнопок ноль или одна - тогда вполне нормально.
Если более одной - то возникает конфликт. Любая кнопка сабмита, находящаяся внутри формы, отправляет форму целиком. Если цикл отработал два или более прохода, то в форме оказываются несколько элементов с одинаковыми именами. Разумеется, каждый следующий элемент будет переписывать "свою" переменную в $_POST.
В зависимости от логики работы в данном случае следует или использовать отдельные формы для каждого набора полей, или сделать имена полей уникальными, или объединить одноименные поля в массивы.
15 янв 19, 16:53    [21785911]     Ответить | Цитировать Сообщить модератору
 Re: Обработка формы в PHP  [new]
Stang
Member

Откуда:
Сообщений: 111
vkle, звучит логично и правильно. А почему же значение кнопки передается, а остальное нет?

Получается, мне нужно организовать еще один цикл, и названия полей делать различным для всех?
15 янв 19, 17:04    [21785928]     Ответить | Цитировать Сообщить модератору
 Re: Обработка формы в PHP  [new]
vkle
Member

Откуда: Самара
Сообщений: 14450
Stang
А почему же значение кнопки передается, а остальное нет?

Передаются значения всех полей формы и значение нажатой (одной) кнопки сабмита. Кнопок сабмита может быть множество, они могут быть запрограммированы на разные действия (например, "послать Маше", "послать Пете", "послать маме"). Поэтому передается только та кнопка, которая была нажата. Об этом можно почитать в спецификации по HTML или убедиться лично, если нажмете в ФФ F12 и посмотрите передаваемые браузером параметры - данные в Form data.

На стороне PHP принимаются все переданные браузером данные. В этом тоже очень легко убедиться, если прочитать php://input.

А вот раскладка принятых данных в элементы массивов POST, GET, REQUEST как раз и переписывает предыдущие значения следующими.

Stang
Получается, мне нужно организовать еще один цикл, и названия полей делать различным для всех?
Выше уже написал, что возможны разные варианты в зависимости от логики и условий решаемой задачи. Не зная задачи в деталях, невозможно определить, какой именно вариант подходит для Вашего конкретного случая.

Возможно, подойдет первый вариант, он же самый простой. Лично я не понимаю, зачем передавать множество комплектов полей, когда достаточно отправить лишь id вопроса и id ответа, а всё остальное на сервере и так легко можно вычислить. Но это мое видение решения задачи "вопросника", а не Ваше.

Или, может быть, Вы предпочтете прочитать из php://input принятые данные в чистом виде и разобрать их самостоятельно (например, "чтобы форму не переделывать").
15 янв 19, 17:35    [21785972]     Ответить | Цитировать Сообщить модератору
 Re: Обработка формы в PHP  [new]
Stang
Member

Откуда:
Сообщений: 111
vkle
Stang
А почему же значение кнопки передается, а остальное нет?

Передаются значения всех полей формы и значение нажатой (одной) кнопки сабмита. Кнопок сабмита может быть множество, они могут быть запрограммированы на разные действия (например, "послать Маше", "послать Пете", "послать маме"). Поэтому передается только та кнопка, которая была нажата. Об этом можно почитать в спецификации по HTML или убедиться лично, если нажмете в ФФ F12 и посмотрите передаваемые браузером параметры - данные в Form data.

На стороне PHP принимаются все переданные браузером данные. В этом тоже очень легко убедиться, если прочитать php://input.

А вот раскладка принятых данных в элементы массивов POST, GET, REQUEST как раз и переписывает предыдущие значения следующими.

Stang
Получается, мне нужно организовать еще один цикл, и названия полей делать различным для всех?

Выше уже написал, что возможны разные варианты в зависимости от логики и условий решаемой задачи. Не зная задачи в деталях, невозможно определить, какой именно вариант подходит для Вашего конкретного случая.

Возможно, подойдет первый вариант, он же самый простой. Лично я не понимаю, зачем передавать множество комплектов полей, когда достаточно отправить лишь id вопроса и id ответа, а всё остальное на сервере и так легко можно вычислить. Но это мое видение решения задачи "вопросника", а не Ваше.

Или, может быть, Вы предпочтете прочитать из php://input принятые данные в чистом виде и разобрать их самостоятельно (например, "чтобы форму не переделывать").

На самом деле мне нужно два значения, но хорошо, согласен, можно обойтись и одним. Остальные я начал городить, проверяя.
Можно было бы и так, но все равно не работает:
/* выводим форму с кнопками */
		echo "<div class=\"divA\">";

		if($_SERVER["REQUEST_METHOD"]=="POST"){
        print_r($_POST);
		if (isset($_POST['doQu']) && isset($_POST['doNe']) && isset($_POST['doId']))
    	{
    		$doNe = (int) $_POST['doNe'];
    		print_r($doNe);
    	}
    	}

    	?>

    		<form method="POST">

			<?php
    			foreach ($result as $answer) {
    				$i=0; $i++;
	    					echo "<input type=\"hidden\" name=\"doNe".$i."\" value=\"".$answer['id_next_question']."\">";
						echo "<input type=\"submit\" value=\"".$answer['answer']."\">"."&nbsp;&nbsp;&nbsp;&nbsp;";
						echo "{$answer['id_next_question']}";
					
				}
			?>

			</form>

		<?php 
			
		echo "</div>";
		/* Конец формы*/

Кнопки, это у меня по сути варианты ответов, и мне нужно вычислить какой будет следующий вопрос, который напрямую зависит от ответа. Не вычислять же мне его делая запрос из базы по тексту? Тобишь, к примеру, у меня форма выведет "да" и "нет" кнопки. Что, делать запрос в таблицу на поиск именно "да" или "нет"? А текст кнопки может быть очень большой, и таблица тоже.... Уникальные поля ничего не дают, все равно реально отправляется одна. Сейчас может реально попробую для каждой кнопки форму создавать.
15 янв 19, 18:00    [21786020]     Ответить | Цитировать Сообщить модератору
 Re: Обработка формы в PHP  [new]
Stang
Member

Откуда:
Сообщений: 111
vkle, огромный плюс вам в карму! С отдельными формами, под каждую кнопку, все заработало так, как мне надо! Благодарю. Век живи, век учись. Правда, я только начал.
15 янв 19, 18:12    [21786032]     Ответить | Цитировать Сообщить модератору
 Re: Обработка формы в PHP  [new]
vkle
Member

Откуда: Самара
Сообщений: 14450
Stang
мне нужно вычислить какой будет следующий вопрос, который напрямую зависит от ответа. Не вычислять же мне его делая запрос из базы по тексту?
Полностью согласен, вычислять по тексту ответа - как минимум, затратно. По ID ответа вычислять гораздо проще. Да и база не особо нужна.
Как один из возможных вариантов можно запилить такой примерно алгоритм.
+
Берем из базы очередной вопрос (id и текст) и варианты ответов на него (id, текст, действие на следующий шаг). На веб-страницу отправляем id вопроса и ответов (для возвращения значений через форму) и тексты (исключительно для отображения на веб-странице). На стороне сервера сохраняем в сессии id вопроса и массив соответствий вида "id ответа" -> "действие на следующий шаг". При приеме формы берем сохраненное в сессии, проверяем соответствие id вопроса. Если сохраненное и присланное значения id не совпадают - отвечающий сильно жульничает с попытками понажимать кнопки вперед/назад в браузере. При совпадении id вопроса берем из соответствующего значения массива действие следующего шага. А там варианты примерно такого, например, вида: целое положительное число - id следующего вопроса, -1 - плановое завершение опроса, -2 - досрочное завершение, -3 - задать вопрос повторно и т.п. Если пришел id ответа, которого нет в массиве - отвечающий жульничает. Ну это так, вкратце.

Что с клиента передается в таком случае? Всего два целых положительных числа. Они компактные сами по себе, легко проверяются на корректность или допустимость значений.
15 янв 19, 19:58    [21786132]     Ответить | Цитировать Сообщить модератору
 Re: Обработка формы в PHP  [new]
Stang
Member

Откуда:
Сообщений: 111
vkle, я так и собирался делать, мне нужно хранить весь этап пути пользователя, для дальнейшего анализа. Но это будет следующий этап моего развития, пока не дошел еще уровнем знаний, как по мне. Тут на таком простом голову сломал. Но огромное спасибо, по крайней мере начну закладывать фундамент под дальнейшую разработку. Не зря же я в ООП полез, пока все что я делаю, можно было и без него обходиться.
16 янв 19, 09:52    [21786439]     Ответить | Цитировать Сообщить модератору
Все форумы / PHP, Perl, Python Ответить