Php 我的会话id中的下划线

Php 我的会话id中的下划线,php,ajax,drupal,session,Php,Ajax,Drupal,Session,我试图在AJAX请求中保留会话。简单地调用session\u start()不会拾取现有会话,而是创建一个新的会话id。我的解决方案是通过AJAX调用将会话id传递给PHP,但这导致了以下错误: 警告:会话_start()[function.session start]:会话id太长或包含非法字符,有效字符为 我认为这是因为当前会话id包含下划线字符,但该会话id是通过调用会话id()获取的,因此它怎么可能包含坏字符 我的意思的简单例子: 页面上的JavaScript(使用jQuery) var

我试图在AJAX请求中保留会话。简单地调用
session\u start()
不会拾取现有会话,而是创建一个新的会话id。我的解决方案是通过AJAX调用将会话id传递给PHP,但这导致了以下错误:

警告:会话_start()[function.session start]:会话id太长或包含非法字符,有效字符为

我认为这是因为当前会话id包含下划线字符,但该会话id是通过调用
会话id()
获取的,因此它怎么可能包含坏字符

我的意思的简单例子:

页面上的JavaScript(使用jQuery)

var sessiond=“”//sessiond包含下划线字符
$.get('/path/to/script.php',{sid:sessiond},函数(数据){
//做点什么
});
script.php

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

因此,我目前正在考虑在第一页上解析会话id,并在尝试使用它之前替换其中的任何错误字符,但我不确定这是否是正确的做法,或者是否需要在其他地方寻找解决方案。

$.get('/path/to/script.php',{sid:},function(data){
$.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
});
$.get('/path/to/script.php',{sid:'},函数(数据){
//做点什么
});

所以事实证明,下划线根本不是我的问题。这个问题是由Drupal的会话处理引起的,因此有必要在AJAX调用目标中调用Drupal的引导,而不是
session\u 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);

解决方案的功劳:

如果
session\u start()
没有在AJAX调用中保留会话,那么您在其他地方就有问题了。您是否在某处重新生成会话id?这是可能的。会话实际上是在Drupal模块中设置的,但是JS和与JS交互的PHP不是Drupal站点的一部分。你真的应该更详细地调查cookie问题,而不是打开一个新的通道来传输会话id。从firebug或fiddler之类的东西开始,检查服务器响应中的cookie头。@VolkerK-是的,事实证明Drupal做了一些事情来阻止对会话数据的访问。调用Drupal引导而不是session_start可以修复所有问题。重要提示(至少在Drupal 7中):您的脚本必须位于Drupal根文件夹中,否则将无法工作!我将我的ajax.php放在/modules/mystuff/ajax.php中,并调整了所有路径,但它只会在每个请求上启动一个新会话。将它移动到/ajax.php,它就如所描述的那样工作了。我不是这样,但很高兴你让它工作了。
//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);