2012-02-14 19 views
3

AJAXリクエストを介してセッションを維持しようとしています。単にsession_start()を呼び出すだけでは、既存のセッションが取得されず、代わりに新しいセッションIDが作成されます。私のソリューションは、AJAX呼び出してPHPのセッションIDを渡すことだったが、これは、次のエラーが発生しました:セッション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()への呼び出しによって取得されるため、どのように不正な文字が含まれる可能性がありますか?

私が何を意味するかの簡単な例:(jQueryのを使用して)ページの

はJavaScript

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を再生成していますか? –

+0

可能です。セッションは実際にはDrupalモジュールで設定されていますが、JSとJSが相互作用するPHPはDrupalサイトの一部ではありません。 – shanethehat

+0

セッションIDを送信するための新しいチャネルを開く代わりに、Cookieの問題を詳細に調べてください。 firebugやfiddlerのようなものから始め、サーバーの応答のクッキーヘッダーを確認します。 – VolkerK

答えて

2

でなければなりませんだから、アンダースコアがすべてで私の問題の一部ではなかったことが判明します。この問題はDrupalのセッション処理が原因で発生していたため、AJAX呼び出しターゲットではsession_startではなく、Drupalのブートストラップを呼び出す必要がありました。

//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のルートフォルダになければなりません。 /modules/mystuff/ajax.phpの中にajax.phpがあり、すべてのパスが調整されていますが、各リクエストで新しいセッションが開始されます。それを/ajax.phpに移動し、説明どおりに動かしました。 – iHaveacomputer

+0

それは私には当てはまりませんでしたが、うまくいきました。 – shanethehat

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

+0

利用可能な場合は、 'json_encode'を使用してください。 – Gumbo

関連する問題