powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Обновление формы по нажатию
20 сообщений из 20, страница 1 из 1
Обновление формы по нажатию
    #39769725
Stang
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Может уже надоел своими глупыми вопросами, но не могу понять какой сделать мне алгоритм для обновления страницы по нажатию кнопки.
Есть у меня форма. Ее суть это вопрос и ответы, которые берутся из БД. Код за вывод этого прост:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
<?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 вопроса? Как вот это завернуть в цикл:
Код: php
1.
2.
$this->db->laQuest($this->id);  
$this->db->laAnswer($this->id);


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

Или может здесь не цикл нужен, а другой алгоритм? Искал долго, нашел нечто подобное на одном форуме, но там чувак сдался, не захотел свое доделывать, а не зная чего он хотел, не могу смоделировать проекцию на себя... Не пинайте ногами!
...
Рейтинг: 0 / 0
Обновление формы по нажатию
    #39769727
Stang
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот код основного класса:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
<?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);
	}

	
}
?>
...
Рейтинг: 0 / 0
Обновление формы по нажатию
    #39769738
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StangНо как мне в цикле выводить и только по нажатию кнопки?ЧТО именно выводить в цикле? Формы с вариантами ответов на вопрос и так выводятся. Не понятно, что ещё из имеющегося можно в цикле вывести.
...
Рейтинг: 0 / 0
Обновление формы по нажатию
    #39769748
Stang
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkle,
Мне нужно, чтобы по нажатию кнопки в формах поменялся как вопрос, так и ответы. Чтобы обновилась форма, я уже даже вот такой бред придумал:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
            A:

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

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


Но после первого же нажатия мне дальше в бесконечности выводит следующий вопрос-ответы. Это я вспомнил свои познания в Pascal))))
...
Рейтинг: 0 / 0
Обновление формы по нажатию
    #39769762
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stang,

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

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

Вот и весь цикл. Притом, закольцован он совсем не внутри скрипта. По сути, на долю пхпшного скрипта выпадает лишь часть цикла, которая подчеркнута выше.
...
Рейтинг: 0 / 0
Обновление формы по нажатию
    #39769782
Stang
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkle, это я догадываюсь, до этого мое чтение уже дошло. Я ведь по нажатию кнопки передаю ID следующего вопроса. Почему я не могу по новому перерисовать страницу? И как это сделать? Просто перенаправить на себя же не получается: header("Location: http://localhost/ColdBell/sales.php"). Что, нету методов? Где-то я недопонимаю...
...
Рейтинг: 0 / 0
Обновление формы по нажатию
    #39769792
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Форма без указания атрибута action и так "на себя" отправляется. Точнее, данные формы отправляются на тот же адрес (включая GET-параметры), откуда была получена страница с формой. ID следующего вопроса передается среди данных.

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

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

PS: Передавать ID следующего вопроса через форму - не слишком благодарное занятие. Любой мало-мальски знакомый с кнопкой F12 в браузере может изменить ход опроса по своему желанию. Но это совсем другая тема и она недавно обсуждалась.
...
Рейтинг: 0 / 0
Обновление формы по нажатию
    #39769894
MikkiMouse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stang,

Какое, однако, у Вас ООП изощренное...
...
Рейтинг: 0 / 0
Обновление формы по нажатию
    #39770122
Stang
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkleФорма без указания атрибута action и так "на себя" отправляется. Точнее, данные формы отправляются на тот же адрес (включая GET-параметры), откуда была получена страница с формой. ID следующего вопроса передается среди данных.

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

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

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

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

Про F12 и безопасность пока мне не нужно, это не будет глобальным проектом, а будет работать в локальной сети на 10-20 ПК. Я думаю, я к этому дойду еще, но пока я на таком тормознул.
...
Рейтинг: 0 / 0
Обновление формы по нажатию
    #39770125
Stang
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MikkiMouseStang,

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

Если честно, то я вообще не понимаю зачем мне в данном случае ООП... Решил начать изучать его...
...
Рейтинг: 0 / 0
Обновление формы по нажатию
    #39770141
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StangЕсли честно, то я вообще не понимаю зачем мне в данном случае ООП... Решил начать изучать его...
Не нужно - это же парадигма из прошлого столетия!
Сразу изучайте функциональное программирование! Причем только через Ютуб - только так можно стать гуру программирования.

А если серьезно, начни хотя бы с этого:
https://habr.com/ru/post/350750/
...
Рейтинг: 0 / 0
Обновление формы по нажатию
    #39770245
Stang
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Руслан ДамировичStangЕсли честно, то я вообще не понимаю зачем мне в данном случае ООП... Решил начать изучать его...
Не нужно - это же парадигма из прошлого столетия!
Сразу изучайте функциональное программирование! Причем только через Ютуб - только так можно стать гуру программирования.

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

Это конечно смешно, оценил. Только у меня сейчас стоит вообще вопрос не в том, какой тип программирования использовать. Я не могу понять алгоритм какой мне использовать. Есть у меня страница с формой, как мне ее перерисовать по новому, при нажатии на кнопку? Скажем взяв данные из сессии? Сам процесс, как обновить форму с новыми данными????
...
Рейтинг: 0 / 0
Обновление формы по нажатию
    #39770250
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StangСкажем взяв данные из сессии?
Насколько понимаю, данные нужно брать из $_POST['doNe'], именно там номер следующего вопроса.

StangЕсть у меня страница с формой, как мне ее перерисовать по новому, при нажатии на кнопку?Страница у Вас перезагружается целиком, не только форма. Следовательно, нужно сформировать страницу "с нуля", как и при выдаче страницы с первым вопросом. Разница только лишь в использовании значения из $_POST['doNe'] вместо единицы.
...
Рейтинг: 0 / 0
Обновление формы по нажатию
    #39770262
Stang
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkleStangСкажем взяв данные из сессии?
Насколько понимаю, данные нужно брать из $_POST['doNe'], именно там номер следующего вопроса.

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

Наверное я как-то не правильно спрашиваю... Я до этого понимания дошел, только не понимаю как это реализовать! Может есть какой пример где посмотреть? Я уже такой ахинеи навыдумывал и перепробовал. Вот сейчас, я сделал метод вывода страницы:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
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, но ничего не меняется...
...
Рейтинг: 0 / 0
Обновление формы по нажатию
    #39770266
Stang
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Там $_POST['doNe'], случайно не тот код скопировал.
...
Рейтинг: 0 / 0
Обновление формы по нажатию
    #39770328
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Код: php
1.
$id = $this->get_idQ(); // получаем id вопроса-ответов

Откуда "получаем"?
Давайте разбираться. Читаем кодавтор
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	// получаем 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():автор
Код: php
1.
2.
3.
	    		$doNe = (int) $_REQUEST['doNe'];
	    		echo "Cледующий вопрос: ".$doNe;
	    		$this->set_idQ($doNe);

А где используется сохраненное значение? Да нигде. Скрипт кончился. Можно было и не записывать. Верно? ;-)

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

Ага, он явно передан при вызове метода.

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

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

Таким образом, перешли к пункту первому разбора, где, как выяснили, кроме единички ничего и не бывает. Собственно, как написано - так и работает. Верно?

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

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



Использование ООП тут явно лишено смысла, как уже было отмечено. Во всяком случае, для class Database , где русским по экрану монитора кем-то написаноавтор
Код: php
1.
# Класс для работы с базой данных

, делать вывод веб-формы с вопросами-ответами... ну, очень мягко говоря, совсем не в тему. Какое отношение к базе данных имеют дивы с формами? А вопросы с ответами? Класс должен отражать сущность, ее свойства и действия. В данном случае, сущность - база данных. Что у нее есть? Подключение с параметрами, запросы, возврат результатов, сообщения об ошибках.
...
Рейтинг: 0 / 0
Обновление формы по нажатию
    #39770329
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StangТам $_POST['doNe']Где это "там"?
...
Рейтинг: 0 / 0
Обновление формы по нажатию
    #39770776
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stang,

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

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

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

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

4. Опишите пожалуйста полностью задачу. В таком виде не понятно что Вам нужно сделать (как я понял это можно уяснить прочитав все Ваши предыдущие вопросы, но сами понимаете, это не очень эффективно). Есть большое подозрение, что Вы вообще не с той стороны к решению подошли, вот и не получается у Вас ничего :)
...
Рейтинг: 0 / 0
Обновление формы по нажатию
    #39770781
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkle, vkleИспользование ООП тут явно лишено смысла, как уже было отмечено. Во всяком случае, для class Database , где русским по экрану монитора кем-то написаноавтор
Код: php
1.
# Класс для работы с базой данных

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

думаю есть варианты :)) Можно сказать, что форма для получения данных от пользователя является частью кода обслуживающего БД. Ведь данные получается из формы именно для записи в БД. А параллельно с этим кодом на сайте может появиться код для работы с внешним АПИ, для печати в pdf и т.д. И если всё это затребует для себя разных форм со своими доп.полями, то такое разбиение кода на части может стать оправданным. Мы ведь пока не знаем что за сервис пытается написать автор вопроса :)
...
Рейтинг: 0 / 0
Обновление формы по нажатию
    #39770815
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПрограмёрМы ведь пока не знаем что за сервис пытается написать автор вопроса :)Подозреваю, что знаем. Менее месяца назад уже была тема вопросника с проблемой наложения данных на приеме формы.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Обновление формы по нажатию
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]