2013-08-26 3 views
2

Я просмотрел все проблемы с переменной сеанса, не сохраняя и не вижу своей проблемы, поэтому я собираюсь спросить об этом.PHP-переменная сеанса не сохраняется

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

$searchTerm = $_POST['find']; 

, который используется в качестве поиска в базе данных, и она прекрасно работает. Под этим я мое заявление SQL, то я поместил этот

//initialize the session 
    if (!isset($_SESSION)) { 
     session_start(); 
    } 
    $_SESSION['searchTerm'] = $searchTerm; 

Я тестируют $ _SESSION [ «SEARCHTERM»] на странице 2, чтобы убедиться, что она сохраняет должным образом, и это делает. Моя проблема возникает, когда я пытаюсь перейти на 3-й странице, которая является страница подтверждения для формы со страницы 2. Я имею условие начала сеанса в верхней части 3-й странице, и я даже вставлено

ini_set('display_errors',1); 
error_reporting(E_ALL); 

в проверьте наличие ошибок, ошибок не было. Итак, моим следующим шагом было протестировать сам сеанс, чтобы узнать, обновляет ли он идентификатор сеанса. Я нашел сценарий на этом сайте www.webassist.com/forums/posts.php?id=5735, чтобы проверить, может ли сервер быть причиной проблемы. Скрипт отлично работает без проблем, показывая, что сервер не является проблемой. Однако, когда я загрузить мою 2-й и 3-й страницу на сервер и поставить в

<?php echo session_id(); ?> 

числа со страницы 2 и 3 страницы совершенно разные поэтому делаю мой переменный нуль. Я сделал дальнейшие исследования и думал, что это может быть потому, что был session_destroy или session_unset, но я не помещал их ни на одну из этих страниц. Когда я попробовал это на своей локальной машине, у меня был тот же идентификатор сеанса, но все же переменная сессии, которую я установил, была пустой.

Есть ли у кого-нибудь другие идеи о том, как и почему это произойдет?

** * ** * ****редактировать ** * ** * ** * ** * ** * ** * ** *

страница 1 имеет такую ​​форму

   <form name="search" method="post" action="page2.php"> 
        <div> 
        <!-- Search--> 
        <label>Search by Last Name:</label> 
         <div> 
          <table width="100%"> 
           <tr> 
            <td><input type="text" id="" name="find" placeholder=""></td> 
            <td><button id="submit" type="submit"><span>Search</span></button></td> 
           </tr> 
          </table> 
         </div> 
        </div> 
       </form> 

страница 2

$searchTerm = $_POST['find']; 


    if(!empty($searchTerm) && ctype_alpha($searchTerm)) 
    { 
    $whereclause = "WHERE mytable.lastName = '".$searchTerm ."'"; 
    } 
    else { 
    $whereclause = ""; 
    } 

    // sql query is here this one searches it is long and just used the $whereclause above. 

    // second sql query that is only submitted if button from the form below is hit is here. 

    $insertGoTo = "confirmPage3.php"; 
     if (isset($_SERVER['QUERY_STRING'])) { 
     $insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?"; 
     $insertGoTo .= $_SERVER['QUERY_STRING'] ; 

     } 
     header(sprintf("Location: %s", $insertGoTo)); 

    //initialize the session 
    if (session_id() == '') { 
     session_start(); 
    } 
    $_SESSION['searchTerm'] = $searchTerm; 


    // then the form is listed below that with the rest of the html 

страница 3

<?php if(session_id() == '') session_start(); ?> 

    if(!empty($_SESSION['searchTerm']) && ctype_alpha($_SESSION['searchTerm'])) 
    { 
    $whereclause = "WHERE myTable.lastName = '".$_SESSION['searchTerm'] ."'"; 
    } 
    else { 
    $whereclause = ""; 
    } 

    // More sql statement here for this one it is only selecting not updating or changing anything. 

    // Table below this that is used to hold the items retrieved from the database. 

** * ** * ** * **редактировать 2 и мое исправление* ** * ** * ** *

так после некоторых спин и с некоторыми из вас, Аарона Gong предложил Я начинаю с пустой страницы и оттуда. Я сделал это и, наконец, поставил диагноз. Это было то, что я не думал о том, что мне очень хорошо. Мне не нравится использовать Dreamweaver, и теперь я помню, почему. Когда я изначально создал страницу 2, я использовал Dreamweavers, чтобы вставить код для вставки моей инструкции sql для обновления. Ну, он поместил в код эти строки кода.

$editFormAction = $_SERVER['PHP_SELF']; 
    if (isset($_SERVER['QUERY_STRING'])) { 
     $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']); 
    } 

Это полностью сработает с вами, если вы попытаетесь отправить пользователя на другую страницу, чтобы подтвердить свои записи. Я прокомментировал это и установил $ editFormAction на свою страницу и использовал это в строке заголовка и альте, которые сразу же исправили мою проблему. То, что я не понял, - это когда он обновлял страницу, что он опорожнял мою переменную $ _POST и обнаружил эту ошибку, наконец, через пустые страницы, предложенные Аароном.

Надеюсь, это поможет кому-то еще, и я больше никогда не вернусь коду из Dreamweaver. Я научился программировать вручную и должен знать лучше, но я торопился и думал, что это не повредит.

Еще раз спасибо всем вашим предложениям.

+0

Вы начинаете сеанс на каждой странице, которую хотите использовать переменную '$ _SESSION', или создать ее? –

+0

Да переменная $ _SESSION и начало сеанса находятся на всех страницах, на которых необходимо включить. – puddleJumper

+0

Почему, по вашему мнению, какой-либо код будет выполнен после изменения местоположения 'header'? Пожалуйста, попробуйте мой ответ. Кроме того, удалите оператор 'if' со страницы 3. Просто выполните' session_start() '. Нет ifs, ands или buts. –

ответ

3

Не уверен, что ваша третья страница выглядит, но мое будет:

session_start(); // Use session variable on this page. This function must put on the top of page. 

if(isset($_SESSION['i_am_in'])) echo "logged in"; 

Моя страница 2:

if ($login_ok) { 
    session_start(); // Create session & settings 
    $_SESSION['abc123'] = 'whatever'; 
    header('Location: page3.php'); 
} 
+0

3-ая страница - это только страница подтверждения, на которую все введенные страницы со страницы 2 вставлены и отображает ее, чтобы они могли подтвердить, что они хотели сказать. В верхней части моей страницы есть что-то похожее на то, что у вас есть, за исключением того, что у меня есть If (! Isset ($ _ SESSION)) ... – puddleJumper

+0

session_start(); находится на самом верху вашей страницы правильно? См. Примеры на сайте php http://php.net/manual/en/function.session-start.php, session_start(); всегда на высоте. –

+0

да на стр. 3 вверху находится страница, вызывающая проблему. – puddleJumper

0

заменить

if (!isset($_SESSION)) { 
     session_start(); 
} 

с

session_start(); 

потому $_SESSION супер глобальных и его всегда доступны.

ИЛИ

Попробуйте проверить для конкретного $_SESSION отл. $_SESSION['session'], а не только $_SESSION.

+0

Я даже сбросил сеанс на страницу, чтобы увидеть, что он сохраняет, и не сохраняет переменную, которую я вставил на страницу 2. – puddleJumper

+0

без вызова 'session_start',' $ _SESSION' должен возвращать значение null .... вы должны иметь возможность использовать его в структуре управления. – itachi

+0

@itachi, нет смысла использовать его в структуре управления. –

0
if(session_id() == ''){ 
    session_start(); 
} 

поскольку $ _SESSION всегда доступен.

+0

Идентификатор сеанса остается прежним на моей локальной машине, но $ _SESSION ['searchTerm'] по-прежнему пуст. – puddleJumper

+0

Это должно быть самое первое, что вы делаете в своем скрипте. – Tuxes3

+0

Я знаю, что это должно быть первое, что есть на странице, если вы не отправляете заголовки, которые должны быть перед ним, или они вызывают ошибку. – puddleJumper

3

Page 1 хорош, Page 2 и Page 3 должно выглядеть примерно так

СТР 2

//initialize the session and set are $_SESSION variable from the form data 
session_start(); 
$_SESSION['searchTerm'] = $_POST['find']; 

//set where condition and check if $_POST['find'] has a value 
$whereclause = ""; 
if(isset($_POST['find'])) { 
    $whereclause = "WHERE mytable.lastName = '".$_POST['find']."'"; 
} 

/*execute your statement note: data passed such as $_GET, $_POST, $_SESSION should never 
be directly in your statement, use PDO to prepare and execute your statements to prevent 
SQL injection*/ 

//then if you wanted to be redirected to page 3 use header after your statement has executed 

header('Location:comfirmPage3.php'); 

СТР 3

//initialize the session so we can access our $_SESSION variables 
session_start(); 

//set where condition and check is $_SESSION['searchTerm'] has a value 
$whereclause = ""; 
if(isset($_SESSION['searchTerm'])) { 
    $whereclause = "WHERE myTable.lastName = '".$_SESSION['searchTerm'] ."'"; 
} 
//execute your statement 
+0

Если я запустил session_destroy, он выберет пользователя. Я уже пробовал. – puddleJumper

+0

Можете ли вы опубликовать код страниц 1, 2 и 3, чтобы я мог точно видеть, что происходит? –

+0

добавили эту страницу или соответствующую часть из них выше. – puddleJumper

3

сделать вызов к session_start() функция.

session_start() 

Этот вызов должен быть в каждом скрипте, который должен использовать данные сеанса. Например, если у вас есть сценарий, который создает изображение CAPTCHA и ему нужно сохранить секретное слово для сеанса, вам нужно будет поставить session_start() в начале скрипта. Если у вас есть другой скрипт, который вводит пользовательский ввод для формы и проверяет секретное слово, введенное пользователем, против того, что вы сохранили ранее, вам также нужно будет поместить session_start() в этот скрипт.

Функция session_start() не принимает параметров. Он всегда возвращает TRUE, поэтому вам не нужно беспокоиться, чтобы проверить его возвращаемое значение. поскольку session_start() устанавливает cookie через заголовок cookie HTTP, вы должны позвонить ему, прежде чем вы выведете что-нибудь из вашего скрипта. Лучше просто называть его в начале вашего скрипта.

Ending Sessions

session_destroy() используется для уничтожения данных, ассоциированных с сессией. Однако это само по себе не убирает все. Например, cookie сеанса не отменяется. Массив $ _SESSION также доступен до окончания вашего скрипта.

Чтобы удалить файл cookie, удалите его вручную, используя обычный метод, используемый для удаления cookie в PHP. Чтобы получить имя файла cookie для удаления, вызовите функцию session_name(), которая возвращает строку, которая также является именем файла cookie, установленного обработчиком сеанса PHP.

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

+0

Я знаю, что начало сеанса предполагается вызывать в верхней части страницы. Единственная причина, по которой он не вызывается в верхней части страницы на стр. 2, состоит в том, что он беспорядочен с заголовками, которые отправляются по строке ниже. – puddleJumper

0

session_start()

Это должно быть на самом верху ваших сценариев. Нет if утверждений, чтобы определить, следует ли это начинать или нет.

СТР 2 Во втором сценарии, у вас есть header(sprintf("Location: %s", $insertGoTo));, прежде чем вы session_start(). Ваш сеанс никогда не запустится, если изменится местоположение заголовка.

Положить session_start() наверху. Не окружайте его инструкцией if.

СТР 3 Также поместите session_start() в верхней части третьей страницы, без какого-либо, если заявления. Вы не понимаете использование сеанса. Это не обычная функция. Сначала вы должны начать сеанс на каждой странице, которую хотите использовать. Вы не можете проверить содержимое переменной $ _SESSION, прежде чем вы вызовете session_start().

Сообщите мне, когда вы это сделали и какие результаты.

+0

Да, я удалил их и вернул на верх, но все равно получаю те же результаты. Аарон Гун также провел некоторое тестирование, и не имеет смысла, что мой код должен работать, но по какой-то причине сеанс уничтожается на странице 3, и переменная исчезает. – puddleJumper

+0

@puddleJumper Весь сеанс исчезает или просто ваша переменная? –

+0

Я не уверен, потому что минуту назад я бы сказал, что это сеанс, но теперь я не уверен. Я тестировал пустую страницу и ударил стрелку назад в браузере, потому что я нахожу NULL для var_dump, но когда я нажимаю стрелку вперед, var_dump фактически выводит то, что я искал. – puddleJumper

0

У меня была такая же проблема, что и 10 минут назад, и никакой ответ мне не помог. Я даю вам еще один возможный ответ (вы решили свою проблему, но другие люди, возможно, этого не сделали).

У меня было file1.php открытие сеанса и сохранение переменной сеанса, file2.php открытие сеанса и извлечение этой переменной из $_SESSION. Это не сработало, и у меня также было две разные сессии от file1 и file2. Причина заключалась в том, что file1.php был сохранен как UTF-8 WITH BOM Я сохранил его снова с Notepad ++ как UTF-8 WITHOUT BOM.

Теперь все работает отлично. Я уверен, что многие люди попадут в эту проблему, о которой я даже не подумал.

Смежные вопросы