如何获取会话数据(来自外部PHP脚本)而不被Joomla会话覆盖?

时间:2012-01-19 03:49:20

标签: php session joomla

当我包含Joomla框架时,Joomla会话似乎覆盖了我在另一个脚本中使用的会话。 如何从第一个会话和Joomla获取信息?

详情

我在Joomla外部的PHP脚本中开始了一个会话。

该文件是file1.php

<?php 
    session_start();
    $qid[0]=1;
    $qid[0]=2;
    $qid[0]=3;
    $_SESSION['qid']=$qid;
?>

然后我有一个名为main.php的php脚本它包含2个文件,getsessdata.php和getjoomla.php

main.php

<?php 
    include("getsessdata.php"); 
    include("getjoomla.php"); 
?>

如果没有包含getjoomla.php,我可以从main.php获取会话数据。

的var_dump($ _ SESSION);显示包含getjoomla.php时缺少qid的会话数据。

getsessdata.php

<?php 
    session_start();
    $qid=$_SESSION['qid']; 
?>

getjoomla.php

<?php
   define( '_JEXEC', 1 );
   define('JPATH_BASE', dirname(__FILE__));   
   define( 'DS', DIRECTORY_SEPARATOR );   
   require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
   require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
   require_once (JPATH_BASE.DS.'libraries'.DS.'joomla'.DS.'environment'.DS.'request.php');

   $mainframe =& JFactory::getApplication('site');
   $mainframe->initialise();
?>   

问题:

如何从file1.php访问会话信息并仍然从getjoomla.php访问数据?为什么我会丢失第一次会议的信息?

不确定这是否有帮助,但是一旦我从main.php中的file1获得会话数据,就不再需要会话了。

3 个答案:

答案 0 :(得分:1)

继续使用$ mainframe,我猜Joomla! 1.5.x的。

当你在它的构造中调用JFactory :: getApplication('site')时,会使用带有传入ID的session_start()创建一个新会话,这会打乱以前的任何会话。

更具体地说,当JSession被调用时,它的__construct调用 _start

function _start()
{
    //  start session if not startet
    if( $this->_state == 'restart' ) {
        session_id( $this->_createId() );
    }

    session_cache_limiter('none');
    session_start();

    // Send modified header for IE 6.0 Security Policy
    header('P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"');

    return true;
}

要解决这个问题,你可以试试*:

  1. 将您的数据放入$ _SESSION

  2. 中的命名空间
  3. 在'site'值之后传递一个选项数组,例如。你的会话命名空间。

  4. - &GT;

    $options['name'] = 'qidSpace';
    
    $mainframe =& JFactory::getApplication('site', $options);
    

    HTH。

    *我不是100%确定机制,但它应该很接近。

答案 1 :(得分:0)

最后,我使用Joomla会话来存储信息。

//Store values in Joomla Session
$session = JFactory::getSession();
$session->set('variable', $variable);


//Get values from Joomla session later
$variable = $session->get('variable');

答案 2 :(得分:0)

为避免冲突,如果至少不需要,您也可以跳过大型机部分。

例如:

<?php
   define( '_JEXEC', 1 );
   define('JPATH_BASE', dirname(__FILE__));   
   define( 'DS', DIRECTORY_SEPARATOR );   
   require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
   require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );

   //$mainframe =& JFactory::getApplication('site');
   //$mainframe->initialise();

 jimport('joomla.user.helper'); 
 JUserHelper::verifyPassword($pass1,$pass2);
?>   

花了一些时间才弄清楚它的确有效!