Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Перестала работать сессия!
 
 автор: rubiroide   (15.04.2010 в 15:40)   письмо автору
 
 

Ничего не трогал, но сессия вдруг перестала работать. У меня сохранялся массив $metro при первом посещении страницы и считывался из сессии при последующих посещениях (через get post передать массив не смог, решил писать его в сессию). Все вроде работало, как вдруг перестало считываться из сессии. Вот код:
// Инициируем сессию
session_start();
if ($action != 1)
{
unset($_SESSION['metro']);
$_SESSION['metro'] = $metro;
}
else
{
$metro = $_SESSION['metro'];
}

  Ответить  
 
 автор: rubiroide   (15.04.2010 в 16:04)   письмо автору
 
   для: rubiroide   (15.04.2010 в 15:40)
 

Как можно передать массив с одной страницы на другую. Может есть альтернативный способ?

  Ответить  
 
 автор: bab-nike   (15.04.2010 в 16:07)   письмо автору
 
   для: rubiroide   (15.04.2010 в 15:40)
 

а что из себя представляет $metro?

  Ответить  
 
 автор: rubiroide   (15.04.2010 в 16:13)   письмо автору
 
   для: bab-nike   (15.04.2010 в 16:07)
 

Это массив станций метро (строк с название станций).
В форме (при помощи списка) выбираются станции метро и передаются на нужную страницу.

Осуществляю поиск по базе и вывожу найденные. Найденных вариантов может быть много, поэтому вывожу первые 10. Чтобы показать следующие 10 надо передать массив снова (или временно сохранить его где-нибудь).

  Ответить  
 
 автор: sim5   (15.04.2010 в 16:17)   письмо автору
 
   для: rubiroide   (15.04.2010 в 16:13)
 

Пропадает, значит вы неверно работаете с ней (прерывается сессия), либо работа логики вашего скрипта лишена всякой логики. Вот и ищите причину в коде своем.
В данном же коде, кроме как лишней строки, ничего предосудительного нет:
f ($action != 1)
{
unset($_SESSION['metro']); //вот это лишнее.
$_SESSION['metro'] = $metro;
}
else
{
$metro = $_SESSION['metro'];
}

  Ответить  
 
 автор: bab-nike   (15.04.2010 в 16:20)   письмо автору
 
   для: rubiroide   (15.04.2010 в 16:13)
 

ну если этот массив почти во всех страницах должен работать, лучше записать его в отдельный файл, скажем spisok.php, и вставить в страницу вот так
<?php require_once('spisok.php'); ?>

  Ответить  
 
 автор: rubiroide   (15.04.2010 в 16:31)   письмо автору
 
   для: bab-nike   (15.04.2010 в 16:20)
 

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

Сейчас посмотрел, вроде запись проходит верно, но вот не считывается.

session_start();
if ($action != 1)
{
unset($_SESSION['metro']);
$_SESSION['metro'] = $metro;
}
else
{
$metro = $_SESSION['metro'];
}
echo count($_SESSION['metro']);

Выводит количество правильно, значит записалось. При переходе выводит 0 (считывает пустой массив)
$metro = $_SESSION['metro']; не работает

  Ответить  
 
 автор: sim5   (15.04.2010 в 16:35)   письмо автору
 
   для: rubiroide   (15.04.2010 в 16:31)
 

Еще раз повторить? НЕТ В ЭТИХ СТРОКАХ КОДА ПРИЧИНЫ!
А уничтожить переменную и потом сразу ее объявить вновь, это лишено всякого смысла.
Все ваше можно записать так:
<?
session_start
();
//заносим
if(!isset($_SESSION['metro'])) $_SESSION['metro'] = $metro;
//вот так, но не понятна проверка
$metro $action == $_SESSION['metro'] : $metro;
//может просто
$metro $_SESSION['metro']

Ищите причину в логике работы вашего скрипта/скриптов.

PS. Кстати, если $metro исходный массив, то зачем все это, получается просто рокировка. Нужно использовать везде $_SESSION['metro'].

  Ответить  
 
 автор: rubiroide   (15.04.2010 в 21:44)   письмо автору
 
   для: sim5   (15.04.2010 в 16:35)
 

Напишу логику работы скрипта. Может кто поможет:

Есть страница с формой, где пользователь выбирает станции метро(metro.php).
После нажатия на кнопку он попадает на страницу с моим скриптом(poisk.php).
Делается выборка БД, результат выводится на страницу. Найденных вариантов может быть очень много.
Всё это со скриптом я затеял чтобы выводить не все варианты, а только 10 первых найденных.
Чтобы увидеть следующие 10 пользователь жмет на цифру 2 внизу. При нажатии происходит переход на ту же страницу(poisk.php). Через get передаю признак того что я на стр. 2. Теперь мне нужно снова сделать выборку и показать вторую десятку найденных. Для того чтобы сделать выборку мне нужен массив, который пришел со страницы metro.php.

ИТОГО: все что мне нужно - передать массив между страницами! ПОДСКАЖИТЕ КАК?

  Ответить  
 
 автор: rubiroide   (15.04.2010 в 21:47)   письмо автору
 
   для: rubiroide   (15.04.2010 в 21:44)
 

$action помогает определиться что делать - записывать или считывать.
Когда мы в первый раз попадаем на страницу поиска $action!=1 и мы должны перезаписать массив в сессию. Для этого я сначала удаляю что было в массиве до этого и записываю туда то что пришло.

Когда мы попадаем второй раз $action уже равен 1 и надо считать то что лежит в сессии.

  Ответить  
 
 автор: Trianon   (15.04.2010 в 22:37)   письмо автору
 
   для: rubiroide   (15.04.2010 в 21:44)
 

У Вас поисковой запрос с банальной постраничной навигацией.
Никакие сессии Вам не нужны вообще - они лишь навредят.

  Ответить  
 
 автор: rubiroide   (15.04.2010 в 22:44)   письмо автору
 
   для: Trianon   (15.04.2010 в 22:37)
 

Тогда помогите новичку советом как передать массив из страницы на саму себя. Можно ли его в get запихать?

  Ответить  
 
 автор: Trianon   (15.04.2010 в 23:03)   письмо автору
 
   для: rubiroide   (15.04.2010 в 22:44)
 

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

  Ответить  
 
 автор: rubiroide   (15.04.2010 в 23:09)   письмо автору
 
   для: Trianon   (15.04.2010 в 23:03)
 

Кажется в моем случае это нереально. Такой вот я скрип от незнания написал(http://www.arenda-liferealty.ru/ofis.php). База очень динамичная (агентство недвижимости) и через час на стр. 2 может быть совсем не то... Страница формируется на основе анализа массива, который я передаю (массив станций метро). Передать его не получается :(

  Ответить  
 
 автор: Trianon   (16.04.2010 в 00:05)   письмо автору
 
   для: rubiroide   (15.04.2010 в 23:09)
 

Как он выглядит-то этот массив?
Может у Вас не массив, а просто набор сгенерирован?
станций метро даже в самых крупных городах редко бывает больше нескольких сотен.
Набор такой мощности можно упаковать в несколько десятков символов. А их можно передать хоть через GET

  Ответить  
 
 автор: rubiroide   (16.04.2010 в 00:06)   письмо автору
 
   для: rubiroide   (15.04.2010 в 23:09)
 

Проблему решил. Спасибоза помощь. Просто перенес код

  if ($action != 1)
  {
    $metro = $_GET['metro'];
    $_SESSION['metro'] = $metro;
  }    
  else
  { 
    $metro = $_SESSION['metro'];
  }  




поближе к session_start(); и все заработало.

ВЫВОД: код работы с сессией не надо разбрасывать по скрипту!!!!!!

P.S. Скрипт неделю назад работал и в разбросанном виде.

  Ответить  
 
 автор: psychomc   (16.04.2010 в 00:37)   письмо автору
 
   для: rubiroide   (16.04.2010 в 00:06)
 

м-да, каждый для себя делает какие угодно выводы )))

просто может быть сначала нужно что-то делать, и уже потом смотреть на ожидаемый результат, а не наоборот

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования