2012-02-14 109 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