2012-02-14 42 views
3

我试图通过AJAX请求保留会话。简单地调用session_start()不是选取现有会话,而是创建一个新的会话ID。我的解决方案是通过会话ID通过AJAX调用PHP,但是这导致了以下错误:我的会话中有下划线ID

Warning: session_start() [function.session-start]: The session id is too long or contains illegal characters, valid characters are a-z, A-Z, 0-9 and '-,' in ...

我相信这是因为当前会话ID中包含下划线,但会话ID正在通过致电session_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在第一页上,并在尝试使用它之前替换其中的任何不良字符,但我不确定这是正确的做法还是需要在别处寻找解决方案。

+3

如果'在session_start()'是不是在AJAX调用保存您的会话,你有问题其他地方。你是否在某处重新生成会话ID? – 2012-02-14 13:45:27

+0

这是可能的。会话实际上是在Drupal模块中设置的,但JS与JS交互的PHP不是Drupal站点的一部分。 – shanethehat 2012-02-14 13:52:00

+0

你真的应该更详细地调查cookie问题,而不是打开传输会话ID的新通道。从像萤火虫或小提琴手那样的东西开始,检查服务器响应中的cookie标头。 – VolkerK 2012-02-14 14:00:36

回答

2

所以事实证明,下划线是不是我的问题的一部分,在所有。这个问题是由Drupal的会话处理引起的,所以有必要在AJAX调用目标中调用Drupal的引导而不是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

+0

重要的(至少在Drupal 7中):你的脚本必须存在于drupal的根文件夹中,否则这种方法无法工作!我把我的ajax.php放在/modules/mystuff/ajax.php里面,调整了所有的路径,但是它会在每个请求上启动一个新的会话。移动它/ajax.php并按照描述工作。 – iHaveacomputer 2012-04-10 02:15:39

+0

对我而言,情况并非如此,但它让你的工作变得很好。 – shanethehat 2012-04-10 08:08:26

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 
}); 
+0

这只是我的例子中的一个错字,但谢谢。 – shanethehat 2012-02-14 13:49:50

+0

如果可用,请使用'json_encode'。 – Gumbo 2012-02-14 13:50:01