Вопрос по сессиям PHP (не работают в Joomla)

DiGriZ

Новичок
Вопрос по сессиям PHP (не работают в Joomla)

Стоит Joomla (Версия 1.5.17) и Joomla Mod PHP - с его помощью можно создавать свои модули с php кодом.
Возникла необходимость использовать сессии - есть два скрипта (модуля), в одном в массив $_SESSION загружаются переменные, во втором читаются и используются. Вот простой код (как пример):
Первый файл:
Код
<?php
session_start();
$_SESSION['session_param'] = "данные";
<!-- Тут идет ссылка на второй модуль.-->
?>


Второй модуль:
Код
<?php
session_start();
print_r( $_SESSION );
?>


Если я эти два кода пишу в двух разных скриптах и запускаю в PHPed, то все работает.
Если я запускаю это все в Joomla, то $_SESSION пустой.
Подскажите,в чем может быть проблема, пожалуйста.
 

AmdY

Пью пиво
Команда форума
session_start(); должен запускаться ДО вывода чего-либо в браузер. я так понимаю твой модуль срабатывает не самым первым, а в порядке очереди и кто-то уже начал вывод.
или же ты два раза вызываешь session_start, делай if (!session_id()) session_start();
 

LONGMAN

Dark Side of the Moon..
DiGriZ
Сессия в джумле запускается автоматически. Для работы с сессиямы юзай конструкцию:
PHP:
$session =& JFactory::getSession():
// Выбор
$var = $session->get('key');
// Запись
$session->set('key', 'value');
 

DiGriZ

Новичок
$session =& JFactory::getSession():
// Выбор
$var = $session->get('key');
// Запись
$session->set('key', 'value');

Хм...key и value это что?
Т.е., к примеру, я хочу на одной странице поместить в суперглобальный масссив число $temp. Я пишу так:

$session =& JFactory::getSession():
$session->set('0', '$temp');

А если хочу прочитать из массива число, то:

$session =& JFactory::getSession():
$var = $session->get('$temp');

Правильно я понял?
 

weregod

unserializer
нет, $key - название сущности, по которому будете читать на другой странице, $value - значение сущности
 

LONGMAN

Dark Side of the Moon..
DiGriZ
Нет. Если хочешь в сессии записать значение переменной $temp под ключом 'var', то нужно так:
$session->set('var', $temp);
Эта эквивалентна выражений
$_SESSION['var'] = $temp;
(Если точнее выражении $_SESSION['_default']['var'] = $temp; потаму что _default это своеобразный namespace).
А если хочешь прочитать то:
$temp = $session->get('var');
 

DiGriZ

Новичок
Большое спасибо! Я понял.
И еще маленький вопросец.
Насколько сложными могут быть типы данных, сохраняемые в этом суперглобальном массиве?
$bots_replics[0]->tags[2]->sentence
//sentence - string. Что-то вроде массива массивов из строк.
Такое можно? А то какие-то неполадки - при сохранении в сессию
$bots_replics не пустая. Т.е. я спокойно перебираю массивы и вывожу sentence на экран.

А после передачи происходит что-то не то. Когда я читаю из сессии - так, как вы показали. Размер массива $bots_replics остается такой же, как и был. Будто он не пустой. А все sentence Почему-то оказываются пустыми.
 

AmdY

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

Активист

Активист
Команда форума
Вот изврат...

> $session =& JFactory::getSession();
Насколько я помню, объект всегда передается по ссылке.
 

DiGriZ

Новичок
На самом деле, очень странная ошибка. Когда я писал то же самое на PHPed, используя сессии, все нормально передавалось.
Теперь же, когда передаю через сессии Joomla, происходит непонятная ошибка. Размер массива тот же, но он пуст. при обращении к sentence выводится сообщение, что строка пуста. Выводится ни пойми что.

Array ( [0] => __PHP_Incomplete_Class Object ( [__PHP_Incomplete_Class_Name] => group_of_replics [tags] => Array ( [0] => __PHP_Incomplete_Class Object ( [__PHP_Incomplete_Class_Name] => PC_replic [sentence] => --------t-- --t-------- [words_of_sentence] => Array ( [0] => --------t-- [1] => --t-------- ) [emotion] => neutral [said] => false ) [1] => __PHP_Incomplete_Class Object ( [__PHP_Incomplete_Class_Name] => PC_replic [sentence] => здравствуй робот [words_of_sentence] => Array ( [0] => здравствуй [1] => робот ) [emotion] => neutral [said] => false )

-~{}~ 10.08.10 15:07:

Вот, подробней. Коды, расположенные в двух модулях.
Первый модуль. Все работает. Загружаю для простоты в ручную. Все выводится. Bots_replics не пустой.
Можно запустить.

PHP:
<?php

class PC_replic{
  var $sentence="nothing";
  var$words_of_sentence = array();  
  var $emotion="0";
  var$said;  
  }

class group_of_replics{
  var$tags=array(PC_replic);//vector<PC_replic>
  var$answers=array(PC_replic);//vector<PC_replic>
  }  
      
  $bots_replics=array($group_of_replics);//  

  $answer1=new PC_replic();//
  $answer1->sentence="Предложение ответа.";//
  $answer1->said=false;//     
  $answer1->emotion="ноль эмоций";// 
 
  $tag1=new PC_replic();//
  $tag1->sentence="Предложение тега";//                                     
  $tag1->said=false;//                     
  $tag1->emotion="ноль эмоций.";//

  $tags1=array(PC_replic);
  $answers1=array(PC_replic);
  
  echo "<p>tag1:";echo $tag1->sentence;
  echo "<p>answer1:";echo $answer1->sentence;
  
  $tags1[0]=$tag1;//
  $answers1[0]=$answer1;//

  echo "<p>tags1[0]:";
  echo $tags1[0]->sentence;
  
  echo "<p>answers1[0]:";
  echo $answers1[0]->sentence,"<p>";
    
  $group_of_replics1=new group_of_replics();//
  
  $group_of_replics1->answers=$answers1;
  $group_of_replics1->tags=$tags1;
  
  echo "Выводим содержимое классов:<p>";
  echo "group_of_replics1 tags:"; 
  echo $group_of_replics1->tags[0]->sentence,"<p>";
  echo "group_of_replics1 answers:"; 
  echo $group_of_replics1->answers[0]->sentence;
  
  
  $bots_replics[0]=$group_of_replics1;
  echo "<p>bots_replics[0]->tags=",$bots_replics[0]->tags[0]->sentence;
  
  $session =& JFactory::getSession();
  $session->set( 'myvar', $bots_replics);
  
?>
А вот второй модуль. В PHPed все работает, но в Joomla происходит что-то не так.
Выводятся непонятные строки. Обратите внимание, код:
echo "<p>bots_replics[0]->tags=",$bots_replics[0]->tags[0]->sentence;
и в первом, и во втором случае одинаков, но только во втором ничего не выводится.

PHP:
<?php

class PC_replic{
  var $sentence="nothing";
  var $words_of_sentence = array();  
  var $emotion="0";
  var $said;  
  }

class group_of_replics{
  var $tags=array(PC_replic);//vector<PC_replic>
  var $answers=array(PC_replic);//vector<PC_replic>
  }
  
  $bots_replics=array($group_of_replics);
  $session =& JFactory::getSession();
  $bots_replics=$session->get( 'myvar' ); 
  
  echo "<p>bots_replics[0]->tags=",$bots_replics[0]->tags[0]->sentence;
  print_r($bots_replics);
 
?>
-~{}~ 10.08.10 15:44:

Более того, я сейчас поэкспериментировал, любой мой, пользовательский тип данных, отказывается нормально передаваться. А в PHPed все работало. Смотрю интернет, а там, все что связано с сессиями - это идиотские вопросы о том, как продлить админскую сессию в joomla. И все.

-~{}~ 10.08.10 15:56:

Проблема, как я понял, в том, что после сериализации это уже не объект класса bots_replics, а класса __PHP_Incomplete_Class и соответственно методы/данные bots_replics не доступны

-~{}~ 10.08.10 16:02:

Товарищи, я конечно нашел рабоче-крестьянское решение - классу написать методы загрузки/ выгрузки данных из/в сессию. Это будет сложновато и загрузит программу лишними действиями.

Но. В PHPed то все работало! И в сессиях сохранялись все мои объекты!Неужели Joomla ущербна?
 

LONGMAN

Dark Side of the Moon..
Активист
Amdy верно заметил, это в джумле осталось с php4. Но обещают 1.6 версию переписать под php5
 

LONGMAN

Dark Side of the Moon..
DiGriZ
Joomla mod php - зло. Лучше опиши задачу и помогу написать сам модуль
 

john.brown

просто кулибин
DiGriZ
Проблема в том, что, когда происходит десериализация, твой класс еще не подключен. Т.е. все классы объектов, сохраненных в сессию, должны быть подключены до начала сессии. В противном случае будет ругань по поводу инкомплит класс.
 

DiGriZ

Новичок
john.brown , ясно, но в Joomla сессии стартуют автоматически, так что объявить классы до их начала наверное не получится.

LONGMAN, спасибо... Задача изначально была такова (с++):
Пишется чатбот типа A.L.I.C.E. http://alice.pandorabots.com/
Сначала загружается база тэгов и ответов на них. Общий механизм не имеет смысла объяснять. Там много чего, но не суть. После загрузки циклично принимаются реплики пользователя, анализируются, после чего выдается ответ. На с++ это все легко. На PHP пришлось переписать, чтобы вывести бота в сеть, для взаимодействия с людьми/обучения.

Проблема вот в чем: на php невозможно организовать циклический прием данных. страница постоянно будет обновляться, база тоже, соответственно, бот будет терять память. Поэтому я разделил его на два модуля. В первом все загружается в сессию, во втором используется/редактируется. И снова записывается в сессию. Таким образом, память бота должна была сохраняться. По идее. Но, как видно, не судьба.
Вот и все).
Если заинтересовались, могу чуть подробнее рассказать.
 

john.brown

просто кулибин
DiGriZ
Ну, если очень надо, то никто не мешает поступить не кошерно - в файле index.php первой строчкой прописать require_once('path/to/Bot.php') :) Но это, естественно, если не предполагается это все потом распространять как плагин джумлы.

Но честно, не совсем понял, чем же сессия лучще той же бд, к примеру... Ну, или сохранению сериализованного объекта в файл...
 

LONGMAN

Dark Side of the Moon..
Автор оригинала: john.brown
DiGriZ
Ну, если очень надо, то никто не мешает поступить не кошерно - в файле index.php первой строчкой прописать require_once('path/to/Bot.php') :) Но это, естественно, если не предполагается это все потом распространять как плагин джумлы.

Но честно, не совсем понял, чем же сессия лучще той же бд, к примеру... Ну, или сохранению сериализованного объекта в файл...
+1
 

DiGriZ

Новичок
Ребят!! Заработало!
reqire once написал, создал отдельный файл с объявленными классами, и все заработало.
Спасибо большое))).

-~{}~ 12.08.10 14:08:

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