Господа оптимизаторы! Подскажите как быть?

CjEcho

Новичок
)) тут заработало... но вот на кнопку голосовать надо нажать 2 раза, и потом при каждом обновлении счетчик накручивается. Возможно ли отказаться от метода POST в данном случае, т.к насколько я понял мне нужно выводить другую страничку, где написано "ваш голос принят" чтобы POST обнулить или как?
 

Фанат

oncle terrible
Команда форума
да не об этом разделении я говорил.

тебе нужно два файла
opros.php
и
obrabotka_oprosa.php

первый выводит. второй записывает в базу.

-~{}~ 15.05.09 16:15:

от поста отказываться нельзя. иначе тебе просто по ф5 такого пообновляют.
я тебе не зря велел сделать два файла.
и не зря велел прочитать http://www.phpfaq.ru/na_tanke#http
читай сейчас хотя бы указанный фрагмент.
 

CjEcho

Новичок
Спасибо за Ваше терпение, но я видимо просто не могу состроить логику в голове:

Так как вы говорите должно быть образно:

ВХОДНЫЕ ДАННЫЕ (какие??) --->>>

ОБРАБОТЧИК --->
1. Обработка входных данных
2. Внесение в базу
3. Установка куки

REDIRECT ---> GET (??? это я про ту статью)
Цит.: Если же в результате отправки формы данные записываются или изменяются на сервере, то следует их отправлять методом POST, причем обязательно после обработки формы надо перенаправить браузер методом GET.

или же

header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
exit;

ВЫВОД ---->
1. Смотрим куку
2. Выводим либо то, либо это...

-~{}~ 15.05.09 18:30:

я видимо суть алгоритма не понимаю... поэтому туплю.
 

dimagolov

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

CjEcho

Новичок
С утра с новыми силами буду разделять и властвовать. Рабочая смена подошла к концу, спасибо Вам! До встречи.
 

Фанат

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

CjEcho

Новичок
УРА! Заработало!!!

Правда есть вопрос. Как сделать редирект с opros_logic.php (обработчик) обратно на страницу, с которой был вызван opros_logic.php??

-~{}~ 18.05.09 09:20:

Автоматически соответственно, чтобы юзер не жал на ссылку (Вернуться)
 

Beavis

Banned
CjEcho
послать заголовок браузеру, чтоб он запросил нужную страницу ([m]header[/m])
 

Фанат

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

CjEcho

Новичок
Сейчас у меня так:

opros_view.php
PHP:
<?php
if (isset($_COOKIE['cookies_question']) AND ($_COOKIE['cookies_question']==$quest_id)):
	//ВЫВОД РЕЗУЛЬТАТОВ ОПРОСА
	....................................................
else:	
	//ВЫВОД ФОРМЫ ОПРОСА
	....................................................
            echo "<FORM action='opros_logic.php' method='post'>";
endif;
?>
и сообственно opros_logic.php
PHP:
//Если нажали на кнопку "Проголосовать"
if (empty($_POST)):else:
	setcookie('cookies_question',$quest_id,time()+31570560);
	//Добавление результата в БД
            ....................................................
endif;

echo "<a href='opros_view.php'>Ваш голос учтен</a>";
Всё работает, сейчас буду пробовать слить в один файл. opros_logic.php размещу в самом начале.

Cразу вопрос:
1. Иногда, у меня может получаться так, что на странице будут отображаться 2 формы (POST)... Как я могу в данном случае идентифицировать в строке:

if (empty($_POST)):else:

что этот POST запрос именно от опроса, а не от (напр.) "формы отправки обратной связи"?

2. Конструкцию "if (empty($_POST)):else:" как то переделать можно? Чтобы выглядело правильно.
 

CjEcho

Новичок
ну отображается "opros_view.php". При нажатии на голосовать вызывается POST opros_logic.php, который выполняет всё что нужно и потом через ссылку возвращает обратно.

-~{}~ 18.05.09 11:09:

ну или должно быть там:

PHP:
//Если нажали на кнопку "Проголосовать" 
if (empty($_POST)):else: 
    setcookie('cookies_question',$quest_id,time()+31570560); 
    //Добавление результата в БД без вывода в HTML
            .................................................... 
endif;
     header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
     exit;
-~{}~ 18.05.09 11:10:

внутренние параметры header'a могут быть вероятно не правильными.. (не проверял еще)
 

Фанат

oncle terrible
Команда форума
в header-е должен быть обычный адрес. какую страницу открыть
$_SERVER['REQUEST_URI'] - тот же самый, который был у формы

-~{}~ 18.05.09 09:32:

чтобы не писать else, используется оператор отрицания
if (!empty($_POST)):
но проверка на $_POST делается не так, а
if ($_SERVER['REQUEST_METHOD']=="POST")
Иногда, у меня может получаться так, что на странице будут отображаться 2 формы (POST).
если страница сложная, то лучше разделить ее на части, не писать все в одну. две формы, два обработчика - это уже будет слишком сложно.
в один файл хорошо засунуть все, что относится к одной форме.
так у тебя получится три файла
- индекс
- form1.php
- form2.php
экшены форм ведут на свои файлы
а в индексе делаешь просто include, и все.
 

CjEcho

Новичок
Ок. спасибо!

-~{}~ 19.05.09 12:47:

Всё, работает, но осталась возможность накрутить счетчик: если нажать в браузере назад и опять нажать на кнопку проголосовать...

-~{}~ 19.05.09 12:48:

В обработчике как то нужно сделать проверку на наличие куки, и если она есть - значит уже голосовали.
 

Фанат

oncle terrible
Команда форума
можно. сделай на здоровье. у тебя же есть эта же самая проверка в выводе. только не на наличие, а точно такую же - на совпадение
 

CjEcho

Новичок
Еще проблема:

В браузере OPERA всё работает отлично, но в Google Chrome на кнопку "голосовать" нужно нажимать 2 раза, при первом нажатии идёт как будто бы refresh - а после второго нажатия отображаются результаты голосования. Что делать? POST запрос не проходит с первого раза чтоли (Хотя вроде бы голос учитывается 2 раза)?
 

Beavis

Banned
CjEcho
а какие действия ты предпринимал, чтобы понять из-за чего так происходит?
 
Сверху