Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > помогите пожалуйста разобраться с session


Автор: Elina 6.12.2005, 13:19
Доброго времени суток,

помогите пожалуйста разобраться

написала простую программу голосования которая состоит из 3 файлов
1 файл - вход - надо ввести id

2 файл -вопросы и кнопка
Код


session_start();
$id = $HTTP_POST_VARS['id'];
.................
echo"<center>"  
. "<form action=exitbye.php  method=post><br>"
."<input  type=radio name=lots  value=1> ответ 1<br>"
."<input  type=radio  name=lots  value=2>  ответ2<br>"
."<input  type=radio name=lots value=3>  ответ3<br>"
."<br><br><input type=submit value=Submit>"                            
."</form>"            
."</center>";



3 файл -сообщение об выходе
Код




[code=cpp]
     session_start();
    $lots = $HTTP_POST_VARS['lots'];
...........
   unset($_SESSION['id']);
   unset($_SESSION['lots']);
  
  session_destroy();

[/code]

вопрос как сделать так чтобы после перехода на 3 файл нельзя было вернуться назад ни на 1-ый ни на 2-ой

даже после

Код

 unset($_SESSION['id']);
   unset($_SESSION['lots']);
  
  session_destroy();


ни id ни lots не стираются и можно вернуться назад и на тот же id проголосовать ещё раз

Автор: -=Ustas=- 6.12.2005, 13:23
Покажи как у тебя регистрируются пеменные сессии.

Автор: Guest 6.12.2005, 13:46
2 файл -вопросы и кнопка
Код

session_start();
$id = $HTTP_POST_VARS['id'];
[b]$_SESSION['lots'] = $lots ;/b]


3 файл -сообщение об выходе
Код

session_start();
$lots = $HTTP_POST_VARS['lots'];
[b]$_SESSION['lots'] = $lots ;[/b]


первый раз работаю с сесией и вообще первая моя программа
если я не ошибаюсь регистрируются пеменные так
Код

$_SESSION['lots'] = $lots ;
..........
$_SESSION['lots'] = $lots ;


Автор: Elina 6.12.2005, 13:50
забыло написать имя

2 файл -вопросы и кнопка

Код
[code=php]


session_start();
$id = $HTTP_POST_VARS['id'];
[b]$_SESSION['lots'] = $lots ;/b]
[/code]

3 файл -сообщение об выходе

Код

session_start();
$lots = $HTTP_POST_VARS['lots'];
[b]$_SESSION['lots'] = $lots ;[/b]


первый раз работаю с сесией и вообще первая моя программа
Код

$_SESSION['lots'] = $lots ;
..........
$_SESSION['lots'] = $lots ;

если я не ошибаюсь регистрируются пеменные так

Автор: z-END 6.12.2005, 13:55
Цитата(Elina @ 6.12.2005, 13:19)
как сделать так чтобы после перехода на 3 файл нельзя было вернуться назад ни на 1-ый ни на 2-ой

может стоит запретить кэширование страницы?
Код

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

Автор: Elina 6.12.2005, 14:13
Цитата

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");


добавила в 3-ий файл и выдаёт
Warning: Cannot modify header information - headers already sent by (output started at /exitbye.php:5)

Автор: z-END 6.12.2005, 14:17
это надо вставлять в самый верх скрипта т.е. до того момента пока не производился вывод информации.

Автор: Elina 6.12.2005, 14:50
перенесла вверх не кричит но по прежнему есть возможность возращаться назад

Автор: z-END 6.12.2005, 15:33
Цитата(Elina @ 6.12.2005, 14:50)
перенесла вверх не кричит но по прежнему есть возможность возращаться назад

а на всех страницах?!

Автор: Elina 6.12.2005, 15:56
да на всех страницах
но всё равно можно переходить вперёд и назад

что делать

Автор: Dave 6.12.2005, 17:17
Цитата(Elina @ 6.12.2005, 13:19)
вопрос как сделать так чтобы после перехода на 3 файл нельзя было вернуться назад ни на 1-ый ни на 2-ой


для того чтобы нельзя было вернуться на 1 и 2 страницу значит нужно сделать проверку чего то на этих страницах, если чего то нет значит не пускать.

Т.е. в начале работы твоей системы заведи в сессии переменную, флаг, присвой ей значение, например 1, а в конце присвой ей значение 0, там где надо проверяй , если 1 то пускаем на страницу, если 0 то не пускаем. Все просто.


Цитата(Elina @ 6.12.2005, 15:56)
что делать


отлаживать. Выводи на экран все данные и смотри что не так.

Автор: Elina 7.12.2005, 11:57
спасибо
попробывала завела флаг ,но дело втом что при переходе назад впрёд не загружется файл занова (следовательно нет возможности для проверок ) а загружается уже использованный(с выбранным ответом)

как от этого избавиться ?


Автор: z-END 7.12.2005, 12:03
Цитата(Elina @ 7.12.2005, 11:57)
как от этого избавиться ?

1. запретить кэширование (Как показано выше)
2. использовать проверку флага (как сказал Dave)
если это не работет значит где-то глюк..

Автор: Elina 7.12.2005, 12:40
Цитата
1. запретить кэширование (Как показано выше)
2. использовать проверку флага (как сказал Dave)

если это не работет значит где-то глюк..


где искать глюк.

Автор: Dave 7.12.2005, 13:58
Цитата(Elina @ 7.12.2005, 11:57)
попробывала завела флаг ,но дело втом что при переходе назад впрёд не загружется файл занова (следовательно нет возможности для проверок ) а загружается уже использованный(с выбранным ответом)

А можно попросить у вас кусок кода который проверят флаг ?
Мне интересно что вы делаете в случае если флага нет или он невалидный.

Elina, вы продумали что должно быть если человек пытается зайти на запрещенную страницу ?

Автор: Elina 7.12.2005, 14:44

index.php
Код

session_start();
$_SESSION['flag2'] = 1;

  echo" <center>"
   ."<form action=entry.php  method=post>"
   ."...........<br><br> <input type=text  name=tz><br><br><br>"
    ."<input  type=Submit >"
    
  ."</form>"
." </center>";
   



entry.php
Код

  session_start();
$name="guest";

$tz1 = $HTTP_POST_VARS['tz'];
unset($tz);
  if (empty($tz1) || ($_SESSION['flag2']==0))       // if tz is empty
  {
     echo"<h1>.......</h1>";
     include "index.php";
  }
  else
  {
         if(  (is_numeric($tz1)==TRUE ) )
         {
     $_SESSION['flag2'] = 0;
            if (!mysql_pconnect($dbhost,$dbuname,$dbpass))  echo " Unable to conect ";
                mysql_select_db($dbname) or die ("Unable to select database "); 

                 $sql="select * from  p  WHERE    sTZ ='$tz1' ";
    
                  $st=mysql_query( $sql);
                    if($st){                   
                         
                         echo"<center>"  
                        . "<form action=exitbye.php  method=post><br>"
                        ."<input  type=radio name=lots  value=1>  1<br>"
                        ."<input  type=radio  name=lots  value=2>  2<br>"
                    ."<input  type=radio name=lots value=3>  3<br>"
                                     ."<br><br><input type=submit value=Submit>"        
                ."</form>"            
                               ."</center>";
                   }
                           else "<p>Error:".mysql_error()."</p>";
                            exit();
                    }    
                     else{
                         echo "<p>Error:".mysql_error()."</p>";
                         exit();
                          }
                    
                    mysql_close(); 
              }
         else   //  if tz is not numeric
            {
               echo"<h1>.........</h1>";
               include "index.php";
             }
  }


Автор: Dave 7.12.2005, 15:37
entry.php нерабочий, parse error на линии 44.
рабочий пример ускорит процесс.
но , по ходу, напиши что у тебя не получается в этом скрипте.

насколько я понимаю, в этом месте (у тебя там 2 таких места):
Код

  if (empty($tz1) || ($_SESSION['flag2']==0))       // if tz is empty
  {
     echo"<h1>.......</h1>";
     include "index.php";
  }


ты отображаешь index.php вместо entry.php, в этом случае нужно делать не include а redirect на этот скрипт (index.php), в этом тебе поможет функция header, вот пример из мануала
Код

header("Location: http://www.example.com/"); /* Redirect browser */

/* Make sure that code below does not get executed when we redirect. */
exit;


у тебя есть мануал по php ? рекомендую ман в виде chm файла, там есть поиск, очень удобно.

Автор: Elina 8.12.2005, 11:42
index.php
Код

session_start();

$flag2=1;
$_SESSION['flag2'] = $flag2 ;

echo" <center>"
  ."<form action=entry.php  method=post>"
  ."..................<br><br> <input type=text  name=tz><br><br><br>"
  ."<input  type=Submit >"
    
 ."</form>"
." </center>";
   



entry.php
Код

  session_start();
$name="guest";

$tz1 = $HTTP_POST_VARS['tz'];
unset($tz);
  if (empty($tz1) || ($_SESSION['flag2']==0))       // if tz is empty
  {
     echo"<h1>.........</h1>";
     include "index.html";
  }
  else
  {
         if(  (is_numeric($tz1)==TRUE ) )
         {    
     $_SESSION['flag2'] = 0;
            if (!mysql_pconnect($dbhost,$dbuname,$dbpass))  echo " Unable to conect ";
                mysql_select_db($dbname) or die ("Unable to select database "); 

                 $sql="select * from  p  WHERE    sTZ ='$tz1' ";
             $st=mysql_query( $sql);
                    if($st){                   
                           $stud=mysql_fetch_array($st);
                         
                           if($stud) {
                               $sTZ=$stud['sTZ'];
                               $name=$stud['n'];
                               $vote=$stud['v'];
                               $entry=$stud['e'];
                         echo" ! .... ".$name."   <br>";
                         echo"<center>"  
                        . "<form action=exitbye.php  method=post><br>"
                ."<input  type=radio name=lots  value=1>  îôìâä1<br>"
                    ."<input  type=radio  name=lots  value=2>  îôìâä2<br>"
                    ."<input  type=radio name=lots value=3>  îôìâä3<br>"
                         ."<br><br><input type=submit value=Submit>"        
                    ."</form>"            
                ."</center>";
                       }
                       else "<p>Error:".mysql_error()."</p>";
                       exit();
                    }    
         else{
             echo "<p>Error:".mysql_error()."</p>";
             exit();
                          }
                    
            mysql_close(); 
              }
         else   //  if tz is not numeric
            {
               echo"<h1>........</h1>";
               include "index.php";
             }
  }


Код

$lots = $HTTP_POST_VARS['lots'];
 if(isset($_REQUEST['lots'])){
   $lots=$_REQUEST['lots'];

if($lots==1){print "1111";}
if($lots==2){print "2222";}
if($lots==3){print "3333";} }

unset($tz);
unset($lots);


в принципе это весь код

Автор: PARROT 8.12.2005, 11:48
Elina , пора уже зарегистрироваться на Нашем Форуме. Это займет минуту, зато преимуществ море!

Автор: Elina 8.12.2005, 12:24
уже зарегистрировалась

хотела бы получить мануал по php ,где он находиться

изменила include на header("Location: index.php");

спасибо

Автор: PARROT 8.12.2005, 12:56
тут книги и мануалы: http://forum.vingrad.ru/index.php?showtopic=34297

Автор: starmaster 8.12.2005, 15:01
К слову: есть ещё такая замечательная технология Remote Scripting, одна из замечательнейших её сторон - это то, что она не захламляет history, что в вашем случае и нужно.

Автор: Elina 8.12.2005, 15:16
почитала про кэширование

но
Код

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

не помогает ,не знаю и что делать
Добавлено @ 15:17
можно пример с Remote Scripting

Автор: Dave 8.12.2005, 15:31
Elina,
Вот пример с запрещенной страницей:
page1.php
Код

<?php
session_start();
$_SESSION['flag'] = 1;
print_r($_SESSION);

?>
<a href="page2.php">page2</a>


page2.php
Код

<?
session_start();
if (!isset($_SESSION['flag'])) {
    //echo 'suda nelza';
    header ('location:page1.php');
}

echo"<center>"  
. "<form action=\"page3\"  method=post><br>"
."<input  type=radio name=lots  value=1 checked>  1<br>"
."<input  type=radio  name=lots  value=2> 2<br>"
."<input  type=radio name=lots value=3>  3<br>"
."<br><br><input type=submit value=Submit>"                            
."</form>"            
."</center>";

?>


page3.php
Код

<?
session_start();

echo 'Lot:'.$_POST['lots'];
unset($_SESSION['flag']);
session_destroy();
?>


в первом скрипте заводим флаг в сессии,
во втором, показываем форму если есть флаг, иначе редирект на первый скрипт.
в третьем : показываем результат и уничтожаем флаг.


Автор: Elina 8.12.2005, 16:44
попробывала вот что происходит

из page1.php попадаю(при верном пароле) на page2.php потом на page3.php
на этом голосование должно быть законченно но

потом возвращаюсь из page3.php на page2.php потом на page1.php

и вот когда дохожу до page1.php нет возможности перейти на page2.php (даже при верном пароле )

даёт возращаться назад но не вперёд

наверное где то теряется значение

Автор: Dave 8.12.2005, 18:10
Цитата(Elina @ 8.12.2005, 16:44)
даёт возращаться назад но не вперёд

наверное где то теряется значение

Я так понимаю скрипт ты изменила.
если что не получается то выводи все данные на экран и смотри в каком месте значение теряется и почему теряется.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)