我的会话ID中的下划线

时间:2012-02-14 13:41:51

标签: php ajax drupal session

我正在尝试通过AJAX请求保留会话。简单地调用session_start()不会启动现有会话,而是创建新的会话ID。我的解决方案是通过AJAX调用将会话ID传递给PHP,但是这导致了以下错误:

  

警告:session_start()[function.session-start]:会话ID太长或包含非法字符,有效字符是a-z,A-Z,0-9和' - ,'...

我认为这是因为当前会话ID包含下划线字符,但是通过调用session_id()来获取该会话ID,那么它如何包含错误字符?

我的意思的简单例子:

页面上的JavaScript(使用jQuery)

var sessID = "<?php echo session_id(); ?>";  //sessID contains underscore characters
$.get('/path/to/script.php',{sid:sessID}, function(data) {
    //do something
});

的script.php

<?php
session_id($_GET['sid']);
session_start();
echo $_SESSION['some_key'];
?>

所以我目前正在考虑在第一页上解析会话ID,并在尝试使用它之前替换其中的任何不良字符,但我不确定这是正确的做法还是我需要寻找其他解决方案。

2 个答案:

答案 0 :(得分:2)

$.get('/path/to/script.php',{sid:<?php echo session_id(); ?>}, function(data) {
    //do something
});

应该是

$.get('/path/to/script.php',{sid:"<?php echo session_id(); ?>"}, function(data) {
    //do something
});

答案 1 :(得分:2)

事实证明,下划线根本不是我问题的一部分。这个问题是由Drupal的会话处理引起的,因此有必要在AJAX调用目标中调用Drupal的bootstrap而不是session_start

//use Drupal bootstrap instead of session_start() to access session data set by Drupal
define('DRUPAL_ROOT', $_SERVER['DOCUMENT_ROOT']);
$base_url = 'http://'.$_SERVER['HTTP_HOST'];
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_SESSION);

解决方案:http://www.csdesignco.com/content/using-drupal-data-functions-and-session-variables-external-php-script