我正在尝试通过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,并在尝试使用它之前替换其中的任何不良字符,但我不确定这是正确的做法还是我需要寻找其他解决方案。
答案 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);