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

Откуда:
Сообщений: 111
Добрый день. Может уже надоел своими глупыми вопросами, но не могу понять какой сделать мне алгоритм для обновления страницы по нажатию кнопки.
Есть у меня форма. Ее суть это вопрос и ответы, которые берутся из БД. Код за вывод этого прост:
<?php
# Класс отвечающий за вывод страницы
include_once 'class/database.class.php';

class Page
{
	public $id; // id для запроса
	public $db; // объект для БД

	public function __construct ()
	{
		$this->db = new Database();
		$this->id = $this->db->get_idQ(); // получаем id вопроса-ответов
		var_dump($this->id);
	}

	// выводим страницу
	public function laPage ()
	{
	    
	    $this->db->laQuest($this->id);
	    
	    $this->db->laAnswer($this->id);

	    var_dump($this->id);

	}
}
?>

Кнопка выхода понятно, сложности не создает. ID следующего я получаю нормально по нажатию, здесь у меня var_dump($this->id) для этого и стоит, чтобы смотреть реакцию на нажатие, оно сменяется, все хорошо. Но как мне в цикле выводить и только по нажатию кнопки? Как обновлять формы, но чтобы они уже получали новый ID вопроса? Как вот это завернуть в цикл:
$this->db->laQuest($this->id);  
$this->db->laAnswer($this->id);

По какому условию?

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

К сообщению приложен файл. Размер - 18Kb
5 фев 19, 15:55    [21802022]     Ответить | Цитировать Сообщить модератору
 Re: Обновление формы по нажатию  [new]
Stang
Member

Откуда:
Сообщений: 111
Вот код основного класса:
<?php
# Класс для работы с базой данных

require_once("sql/config.php"); // Настройки подключения

class Database
{
	public $pdo; // подключение к БД
	public $user_name; // имя пользователя по его учетке на ПК
	public $idQ; // глобальная переменная id вопроса

	public function __construct ()
	{
		//подключаемся к БД через PDO, без создания своих классов посредников
		$dsn = "mysql:host=".HOST.";port=3306;dbname=".DB.";charset=utf8";
		//создаем объект
		$options =
		[
		    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
		    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
	    ];

		$this->pdo = new PDO($dsn, USER, PASS, $options);
		$this->pdo->SetAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // временные параметры

		$user = getenv("username");
		$results_user = $this->pdo->query("SELECT name FROM users WHERE login='".$user."'");
		$user_sql = $results_user->fetch(PDO::FETCH_ASSOC);
		if ($results_user) {
			$this->user_name = $user_sql['name'];
			
		} else {
			exit("У пользователя ($user) нет доступа");
		}
	}

	// получаем id вопроса
	public function get_idQ ()
	{
		if (isset($this->idQ))
		{
			return $this->idQ;
		} else {
			$this->set_idQ(1);
			return $this->idQ;
		}
	}

	// устанавливаем значение переменной $idQ
	public function set_idQ ($val)
	{
		
			$this->idQ = $val;
			
	}

	// выполняем запрос на вопрос
	public function query_quest ($user_query) 
	{
		$stmt = $this->pdo->query($user_query);
		$result = $stmt->fetch(PDO::FETCH_ASSOC);
		return $result;
	}

	// выполняем запрос на вопрос
	public function query_answer ($user_query) 
	{
		$stmt = $this->pdo->query($user_query);

		while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
			$result[$row['id']] = $row;
		}
		return $result;
	}

	// Выводим вопрос
	public function laQuest ($id)
	{
		//делаем запрос на выборку вопроса
		$query_quest = ("SELECT id, question FROM la_question WHERE id='".$id."'");
		$result = $this->query_quest($query_quest);

		//выводим блок с вопросом
		echo "<div class=\"divQ\">";
		echo sprintf($result['question'], $this->user_name);
		echo "</div>";

	}

	// Выводим ответы
	public function laAnswer ($id)
	{
		$query_answer = ("SELECT id, id_question, id_next_question, answer FROM la_answer WHERE id_question='".$id."'");
		$result = $this->query_answer($query_answer);

		/* выводим форму с кнопками */
		echo "<div class=\"divA\">";

			if (isset($_REQUEST['doNe']))
	    	{

	    		$doNe = (int) $_REQUEST['doNe'];
	    		echo "Cледующий вопрос: ".$doNe;
	    		$this->set_idQ($doNe);
	    		//header("Location: http://localhost/ColdBell/sales.php");
				//exit;
	    	}
	    	if (isset($_REQUEST['endB']))
	    	{

	    		$endB = (int) $_REQUEST['endB'];
	    		$this->set_idQ($endB);
	    		header("Location: http://localhost/ColdBell/index.php");
				exit; 
	    		
	    	}
    	

    			foreach ($result as $answer) {
    				echo "<form class=\"form-buttom\" method=\"POST\">";
	    			echo "<input type=\"hidden\" name=\"doNe\" value=\"".$answer['id_next_question']."\">";
					echo "<input type=\"submit\" value=\"".$answer['answer']."\">"."&nbsp;&nbsp;&nbsp;&nbsp;";
					echo "</form>";
				}
				// кнопка выхода
				echo "<form class=\"form-buttom\" method=\"POST\">";
	    		echo "<input type=\"hidden\" name=\"endB\" value=\"0\">";
				echo "<input type=\"submit\" value=\"Завершить\">"."&nbsp;&nbsp;&nbsp;&nbsp;";
				echo "</form>";

		var_dump($this->get_idQ());	
		echo "</div>";
		/* Конец формы*/

	}

	public function laPage ()
	{
		$id = $this->get_idQ(); // получаем id вопроса-ответов

	// выводим страницу
	    
	    $this->laQuest($id);
	    
	    $this->laAnswer($id);
	}

	
}
?>


К сообщению приложен файл. Размер - 22Kb
5 фев 19, 15:58    [21802024]     Ответить | Цитировать Сообщить модератору
 Re: Обновление формы по нажатию  [new]
vkle
Member

Откуда: Самара
Сообщений: 14724
Stang
Но как мне в цикле выводить и только по нажатию кнопки?
ЧТО именно выводить в цикле? Формы с вариантами ответов на вопрос и так выводятся. Не понятно, что ещё из имеющегося можно в цикле вывести.
5 фев 19, 16:17    [21802039]     Ответить | Цитировать Сообщить модератору
 Re: Обновление формы по нажатию  [new]
Stang
Member

Откуда:
Сообщений: 111
vkle,
Мне нужно, чтобы по нажатию кнопки в формах поменялся как вопрос, так и ответы. Чтобы обновилась форма, я уже даже вот такой бред придумал:
            A:

	    $this->db->laQuest($this->id);
	    
	    $this->db->laAnswer($this->id);

	    if (isset($_REQUEST['doNe']))
	    	{
				goto A;
	    	}

Но после первого же нажатия мне дальше в бесконечности выводит следующий вопрос-ответы. Это я вспомнил свои познания в Pascal))))
5 фев 19, 16:32    [21802053]     Ответить | Цитировать Сообщить модератору
 Re: Обновление формы по нажатию  [new]
vkle
Member

Откуда: Самара
Сообщений: 14724
Stang,

Вы в курсе, как работают веб-страницы, веб-формы?
Если не в курсе, а читать лень, то вкратце так примерно:

Пользователь нажал кнопку - данные формы отправились на сервер. Серверный скрипт поймал данные, обработал, сформировал HTML-код новой страницы в качестве ответа. Вебсервер отправил этот код браузеру. Браузер поймал HTML-код, показал страничку пользователю. Пользователь нажал... смотри пункт первый.

Вот и весь цикл. Притом, закольцован он совсем не внутри скрипта. По сути, на долю пхпшного скрипта выпадает лишь часть цикла, которая подчеркнута выше.
5 фев 19, 17:00    [21802073]     Ответить | Цитировать Сообщить модератору
 Re: Обновление формы по нажатию  [new]
Stang
Member

Откуда:
Сообщений: 111
vkle, это я догадываюсь, до этого мое чтение уже дошло. Я ведь по нажатию кнопки передаю ID следующего вопроса. Почему я не могу по новому перерисовать страницу? И как это сделать? Просто перенаправить на себя же не получается: header("Location: http://localhost/ColdBell/sales.php"). Что, нету методов? Где-то я недопонимаю...
5 фев 19, 17:28    [21802105]     Ответить | Цитировать Сообщить модератору
 Re: Обновление формы по нажатию  [new]
vkle
Member

Откуда: Самара
Сообщений: 14724
Форма без указания атрибута action и так "на себя" отправляется. Точнее, данные формы отправляются на тот же адрес (включая GET-параметры), откуда была получена страница с формой. ID следующего вопроса передается среди данных.

Почему Вы уверенно отдаете страницу с вопросом, у которого ID = 1 и не хотите отдать страницу с вопросом, где ID указан в $_POST['doNe']?

Более того, в первом приближении можно реализовать алгоритм вроде: если есть $_POST['doNe'], то из него взять ID, иначе ID = 1.

PS: Передавать ID следующего вопроса через форму - не слишком благодарное занятие. Любой мало-мальски знакомый с кнопкой F12 в браузере может изменить ход опроса по своему желанию. Но это совсем другая тема и она недавно обсуждалась.
5 фев 19, 17:59    [21802128]     Ответить | Цитировать Сообщить модератору
 Re: Обновление формы по нажатию  [new]
MikkiMouse
Member

Откуда: Киев
Сообщений: 719
Stang,

Какое, однако, у Вас ООП изощренное...
6 фев 19, 00:57    [21802280]     Ответить | Цитировать Сообщить модератору
 Re: Обновление формы по нажатию  [new]
Stang
Member

Откуда:
Сообщений: 111
vkle
Форма без указания атрибута action и так "на себя" отправляется. Точнее, данные формы отправляются на тот же адрес (включая GET-параметры), откуда была получена страница с формой. ID следующего вопроса передается среди данных.

Почему Вы уверенно отдаете страницу с вопросом, у которого ID = 1 и не хотите отдать страницу с вопросом, где ID указан в $_POST['doNe']?


Я не пойму как мне его отдавать! как мне отдавать каждую последующую страницу с новым ID?

vkle
Более того, в первом приближении можно реализовать алгоритм вроде: если есть $_POST['doNe'], то из него взять ID, иначе ID = 1.

PS: Передавать ID следующего вопроса через форму - не слишком благодарное занятие. Любой мало-мальски знакомый с кнопкой F12 в браузере может изменить ход опроса по своему желанию. Но это совсем другая тема и она недавно обсуждалась.


Про F12 и безопасность пока мне не нужно, это не будет глобальным проектом, а будет работать в локальной сети на 10-20 ПК. Я думаю, я к этому дойду еще, но пока я на таком тормознул.
6 фев 19, 13:18    [21802640]     Ответить | Цитировать Сообщить модератору
 Re: Обновление формы по нажатию  [new]
Stang
Member

Откуда:
Сообщений: 111
MikkiMouse
Stang,

Какое, однако, у Вас ООП изощренное...


Если честно, то я вообще не понимаю зачем мне в данном случае ООП... Решил начать изучать его...
6 фев 19, 13:20    [21802643]     Ответить | Цитировать Сообщить модератору
 Re: Обновление формы по нажатию  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 927
Stang
Если честно, то я вообще не понимаю зачем мне в данном случае ООП... Решил начать изучать его...

Не нужно - это же парадигма из прошлого столетия!
Сразу изучайте функциональное программирование! Причем только через Ютуб - только так можно стать гуру программирования.

А если серьезно, начни хотя бы с этого:
https://habr.com/ru/post/350750/
6 фев 19, 13:54    [21802663]     Ответить | Цитировать Сообщить модератору
 Re: Обновление формы по нажатию  [new]
Stang
Member

Откуда:
Сообщений: 111
Руслан Дамирович
Stang
Если честно, то я вообще не понимаю зачем мне в данном случае ООП... Решил начать изучать его...

Не нужно - это же парадигма из прошлого столетия!
Сразу изучайте функциональное программирование! Причем только через Ютуб - только так можно стать гуру программирования.

А если серьезно, начни хотя бы с этого:
https://habr.com/ru/post/350750/


Это конечно смешно, оценил. Только у меня сейчас стоит вообще вопрос не в том, какой тип программирования использовать. Я не могу понять алгоритм какой мне использовать. Есть у меня страница с формой, как мне ее перерисовать по новому, при нажатии на кнопку? Скажем взяв данные из сессии? Сам процесс, как обновить форму с новыми данными????
6 фев 19, 15:51    [21802825]     Ответить | Цитировать Сообщить модератору
 Re: Обновление формы по нажатию  [new]
vkle
Member

Откуда: Самара
Сообщений: 14724
Stang
Скажем взяв данные из сессии?

Насколько понимаю, данные нужно брать из $_POST['doNe'], именно там номер следующего вопроса.

Stang
Есть у меня страница с формой, как мне ее перерисовать по новому, при нажатии на кнопку?
Страница у Вас перезагружается целиком, не только форма. Следовательно, нужно сформировать страницу "с нуля", как и при выдаче страницы с первым вопросом. Разница только лишь в использовании значения из $_POST['doNe'] вместо единицы.
6 фев 19, 16:11    [21802837]     Ответить | Цитировать Сообщить модератору
 Re: Обновление формы по нажатию  [new]
Stang
Member

Откуда:
Сообщений: 111
vkle
Stang
Скажем взяв данные из сессии?

Насколько понимаю, данные нужно брать из $_POST['doNe'], именно там номер следующего вопроса.

Stang
Есть у меня страница с формой, как мне ее перерисовать по новому, при нажатии на кнопку?
Страница у Вас перезагружается целиком, не только форма. Следовательно, нужно сформировать страницу "с нуля", как и при выдаче страницы с первым вопросом. Разница только лишь в использовании значения из $_POST['doNe'] вместо единицы.


Наверное я как-то не правильно спрашиваю... Я до этого понимания дошел, только не понимаю как это реализовать! Может есть какой пример где посмотреть? Я уже такой ахинеи навыдумывал и перепробовал. Вот сейчас, я сделал метод вывода страницы:
public function laPage ()
	{

		$id = $this->get_idQ(); // получаем id вопроса-ответов

	// выводим страницу
	    
	    $this->laQuest($id);
	    
	    $this->laAnswer($id);

	    if (isset($_REQUEST['endB']))
	    {
	    	$this->set_idQ($_REQUEST['endB']);
	    	header("Location: http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]");
			exit;
		}

	    echo "<br>";
	    
	}

В моем понимании страница должна перегрузиться, и соответственно получить уже новый ID, но ничего не меняется...
6 фев 19, 16:26    [21802854]     Ответить | Цитировать Сообщить модератору
 Re: Обновление формы по нажатию  [new]
Stang
Member

Откуда:
Сообщений: 111
Там $_POST['doNe'], случайно не тот код скопировал.
6 фев 19, 16:27    [21802859]     Ответить | Цитировать Сообщить модератору
 Re: Обновление формы по нажатию  [new]
vkle
Member

Откуда: Самара
Сообщений: 14724
автор
$id = $this->get_idQ(); // получаем id вопроса-ответов
Откуда "получаем"?
Давайте разбираться. Читаем код
автор
	// получаем id вопроса
	public function get_idQ ()
	{
		if (isset($this->idQ))
		{
			return $this->idQ;
		} else {
			$this->set_idQ(1);
			return $this->idQ;
		}
	}
В моем понимании это означает примерно следующее. Если переменная класса $this->idQ установлена, используем ее значение. Иначе сохраняем в эту переменную единичку и используем это (единичка) значение. Никакого упоминания $_POST['doNe'] тут не фигурирует.

Ладно. Может быть, значение из $_POST['doNe'] где-то в другом месте записывается в $this->idQ и как-то используется для выборки следующего вопроса? Да, записывается в методе laAnswer():
автор
	    		$doNe = (int) $_REQUEST['doNe'];
	    		echo "Cледующий вопрос: ".$doNe;
	    		$this->set_idQ($doNe);
А где используется сохраненное значение? Да нигде. Скрипт кончился. Можно было и не записывать. Верно? ;-)

Откуда же берется ID вопроса для отображения? Давайте смотреть.
автор
	// Выводим ответы
	public function laAnswer ($id)
	{
		$query_answer = ("SELECT id, id_question, id_next_question, answer FROM la_answer WHERE id_question='".$id."'");
Ага, он явно передан при вызове метода.

Глядим, где и как метод вызывается. А, вот оно:
автор
		$id = $this->get_idQ(); // получаем id вопроса-ответов

	// выводим страницу
	    
	    $this->laQuest($id);
	    
	    $this->laAnswer($id);
Таким образом, перешли к пункту первому разбора, где, как выяснили, кроме единички ничего и не бывает. Собственно, как написано - так и работает. Верно?

Советую выкинуть нафиг весь этот код и написать что-то вроде:
$query_id = (isset($_POST['doNe']) && (int)$_POST['doNe']) ? (int)$_POST['doNe'] : 1;

// Далее код формирования веб-страницы с вопросом $query_id


Использование ООП тут явно лишено смысла, как уже было отмечено. Во всяком случае, для class Database, где русским по экрану монитора кем-то написано
автор
# Класс для работы с базой данных
, делать вывод веб-формы с вопросами-ответами... ну, очень мягко говоря, совсем не в тему. Какое отношение к базе данных имеют дивы с формами? А вопросы с ответами? Класс должен отражать сущность, ее свойства и действия. В данном случае, сущность - база данных. Что у нее есть? Подключение с параметрами, запросы, возврат результатов, сообщения об ошибках.
6 фев 19, 17:50    [21802947]     Ответить | Цитировать Сообщить модератору
 Re: Обновление формы по нажатию  [new]
vkle
Member

Откуда: Самара
Сообщений: 14724
Stang
Там $_POST['doNe']
Где это "там"?
6 фев 19, 17:51    [21802948]     Ответить | Цитировать Сообщить модератору
 Re: Обновление формы по нажатию  [new]
Програмёр
Member

Откуда: Москва
Сообщений: 3001
Stang,

1. отделите html от кода. На это смотреть противно, когда в коде прям куски html в строках висят. Как самый простой метод - можно просто инклудить нужные файлы с шаблонами в нужных местах (тогда сам файл может быть написан в html с использование php переменных типа <?= $myvar ?>). А можно пойти дальше и вообще заюзать буферизацию вывода (ob_start, ob_flush, ob_get_contents, ob_end_clean и прочие методы) и получить этот html в виде переменной для последующего использования в php коде. Или можно пойти ещё дальше и установить фреймворк толковый какой-то (хотя в Вашем случае лучше не сейчас, рано ещё)

2. не понятно зачем Вам нужны сеттеры, если переменные публичные :)) Вы явно не поняли суть этой затеи. Сеттеры и геттеры нужны для удобства, они позволяют вводить контроль доступа к атрибутам класса, а также создавать алиасы для свойств класса (когда запрашивается или записывается как бы свойство, а на самом деле под капотом происходит выполнение целых методов). Так что без обслуживающих магических методов и без необходимости в таких трюках Вам следует это поудалять и упростить код в разы.

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

Ну а теперь к самой задаче

4. Опишите пожалуйста полностью задачу. В таком виде не понятно что Вам нужно сделать (как я понял это можно уяснить прочитав все Ваши предыдущие вопросы, но сами понимаете, это не очень эффективно). Есть большое подозрение, что Вы вообще не с той стороны к решению подошли, вот и не получается у Вас ничего :)
7 фев 19, 17:37    [21803739]     Ответить | Цитировать Сообщить модератору
 Re: Обновление формы по нажатию  [new]
Програмёр
Member

Откуда: Москва
Сообщений: 3001
vkle,
vkle
Использование ООП тут явно лишено смысла, как уже было отмечено. Во всяком случае, для class Database, где русским по экрану монитора кем-то написано
автор
# Класс для работы с базой данных
, делать вывод веб-формы с вопросами-ответами... ну, очень мягко говоря, совсем не в тему. Какое отношение к базе данных имеют дивы с формами? А вопросы с ответами? Класс должен отражать сущность, ее свойства и действия. В данном случае, сущность - база данных. Что у нее есть? Подключение с параметрами, запросы, возврат результатов, сообщения об ошибках.


думаю есть варианты :)) Можно сказать, что форма для получения данных от пользователя является частью кода обслуживающего БД. Ведь данные получается из формы именно для записи в БД. А параллельно с этим кодом на сайте может появиться код для работы с внешним АПИ, для печати в pdf и т.д. И если всё это затребует для себя разных форм со своими доп.полями, то такое разбиение кода на части может стать оправданным. Мы ведь пока не знаем что за сервис пытается написать автор вопроса :)
7 фев 19, 17:49    [21803748]     Ответить | Цитировать Сообщить модератору
 Re: Обновление формы по нажатию  [new]
vkle
Member

Откуда: Самара
Сообщений: 14724
Програмёр
Мы ведь пока не знаем что за сервис пытается написать автор вопроса :)
Подозреваю, что знаем. Менее месяца назад уже была тема вопросника с проблемой наложения данных на приеме формы.
7 фев 19, 19:17    [21803813]     Ответить | Цитировать Сообщить модератору
Все форумы / PHP, Perl, Python Ответить