web-dev-qa-db-ja.com

PHP ajaxではセッション変数が保持されない

AJAXを使用して新しいphpファイルをロードし、表示を更新する1ページのWebサイトがあります。

メインページでphpセッションを開始しますが、ajaxを使用して内部htmlを更新するときに、新しいphpファイルをロードするためにこれらのセッション変数が必要です。

この投稿は次の投稿に似ています: PHP Session Variables Not Preserved 。しかし、チェックしたところ、php.iniにはsession.use_cookies = 1

メインページPHP:

<?php 
session_start();
if(isset($_SESSION['views']))
{$_SESSION['views']=$_SESSION['views']+1;}
else
{$_SESSION['views']=1;}
?>

ユーザー入力の後、ajaxを使用してphpファイルを呼び出し、ページのサブセクションをロードします。

<?php    
if(isset($_SESSION['views']))
    { echo "Views: " . $_SESSION['views'];} 
    else 
    { echo "Views: NOT SET";}
?>

誰か私が見逃している重要なステップを教えてもらえますか?ありがとうございました。

更新:メインページとサブページの両方にsession_id()呼び出しを追加した後、両方のページに同じSession_IDがあることがわかります。ただし、それでもセッション変数をプルすることはできません。値を割り当てた場合、2つの同じ名前のセッション変数は互いに独立したままになります。

この質問が作成した質問への回答:php.iniファイルに静的なsession_saveパスを設定する必要があることがわかりました。ほとんどの有料ウェブホスティングサービスでは、セッション用のデフォルトコンテナーしかありませんが、負荷分散の影響を受けます。なんてことだ。

14
Quinma

Ajaxが呼び出すページにsession_start()がないと思います。

必要なもの:

<?php
session_start();
if(isset($_SESSION['views']))
    { echo "Views: " . $_SESSION['views'];} 
    else 
    { echo "Views: NOT SET";}
?>
26
drew010

セッションsession_start()を他のPHP=ファイルで、AJAX経由で呼び出しているファイルでも)開始する必要があります。

6
Kalpesh

今日PHP 7 on IIS Server 2012を実行しているときに、同じ問題であると思いました。

私は追加しました:

if(!isset($_SESSION)) 
{ 
    session_start(); 
} 

各AJAXファイルの先頭に追加されますが、次のPHP通知を受信し続けます:

PHP Notice: A session had already been started - ignoring session_start()

少し調べてみたところ、このスレッドにたどり着き、私が遭遇した問題を解決するための正しい方向を示しました。うまくいけば、次の情報が同じ問題に遭遇する他の人を助けるでしょう。

Session.save_pathの値が設定されていることを確認した後(私の場合はC:\ Windows\Temp)、フォルダのアクセス許可が、実行中のユーザーアカウントのアクセス許可と一致していることを確認するのが最善だと思いましたIIS.

私の場合、(php.iniで)セッションストレージ用に指定したディレクトリには、IISを実行していたものと同じユーザー(セキュリティ権限)が割り当てられていないことがわかりました=サイト。

興味深いことに、新しいユーザー権限を追加する前にAJAXリクエストを使用しない場合、セッションは正常に機能しました。ただし、AJAXは、権限を修正するまでセッションを取得しませんでした。問題:IISが実行されているのと同じユーザーアカウントを追加すると、この問題はすぐに解決されました。

1
Majickal

有料のWebホスティングサービスを使用する場合、デフォルトのセッション保存パスは次のように自動的に設定されます。

http://php.net/session.save-path
session.save_path = "/tmp/"

ルートフォルダへの静的パスをそこに置く必要があります。

1
Quinma

Ajax呼び出しでログインする前に、セッションを初期化する必要があります。

session_start();

ログインajax呼び出しを開始するページの上部で初期化します。

そのため、SESSIONIDが作成され、ブラウザのCookieが保存されます。同じドメインにajaxリクエストを行う場合、ajax呼び出し中にリクエストヘッダーと一緒に送信されます

後続のajax呼び出しでは、ブラウザCookieをクリアするか、ログアウト(または別のCookieを設定)しない限り、ブラウザは最初に作成され、ブラウザCookieに保存されたSESSIONIDを使用します。

0
Mohammed Safeer

アプリケーションからの既存のセッションデータをajax呼び出しで使用しようとしています。そのためには、session_startの呼び出し方法を次のように変更します。

// With ajax calls
if (session_status()==1) {
    session_start(); 
}

既存のセッションデータを必要とするPHPスクリプトにajax呼び出しを行う場合は、session_statusの後にsession_startを使用します。

http://php.net/session_status

0
Goldbug