Php会话根据链接开始和结束?

时间:2012-10-08 16:48:50

标签: php mysql

我在页面上有日期,日期和时间等链接。如果有人点击“日期”,我想要一个会话开始。然后以同样的方式点击'Day'上一个会话停止并创建一个新会话。这可能吗?

1 个答案:

答案 0 :(得分:1)

我不确定为什么你想要使用会话,但是是的 - 这可以通过AJAX实现。

你定义了两个链接,让我们称之为启动和停止,例如:

<a id="start">Start</a>
<a id="stop">Stop</a>

然后使用Javascript(此示例将使用jQuery library)向后端处理程序发出请求,后端处理程序将适当地调用session_start()session_stop()。您可以(可选)在用户会话停止时对其进行序列化,如果以后必须对其进行某些工作。

首先,一个AJAX请求的例子。在页面中,您希望建立事件以调用公共函数来发出异步请求以启动或结束用户的会话。我们通过创建一个在DOM准备就绪后运行的匿名函数来实现这一点:

<script>
$(document).ready(function() { 
    // Make the request to start or stop a session
    function asyncSessionMolester(uri, val) {
    $.ajax({
        url: uri
        type: 'post',
        dataType: "json",
        cache: false,
        data: {
            'action':session,
            'value':val
        },
        success: function(remoteResponse, textStatus) {
           alert('Session now in mode ' + toggle);
           // do other stuff you want to do on success
        },
        error: function(xhr, desc, err) {
            // There is a lot more data in xhr, this just shows what the server
            // wrote to the browser in the console for debugging.
            // Handle failure here
            console.log(xhr.textResponse);
        }
    });

    // now, our events:

    $('#start').click(function() { 
        asyncSessionMolestor('/ajax.php', 'start');
    }); 

    $('#stop').click(function() {
        asyncSessionMolestor('/ajax.php', 'stop');
    });
});
</script>

现在,您需要创建一些生活在/ajax.php的PHP并执行以下操作:

  • 确保用户有权在会话建立时请求
  • 检查HTTP_X_REQUESTED_WITH标题,如果没有人有人通过浏览器直接访问它(如果是的话就纾困)
  • 检查actionvalue的POST数据。如果值为session,则为switch()。如果是start,则启动会话。如果stop则停止会话。
  • 发送JSON响应,您可以在ajax调用中检查

如果您需要保存会话以供以后分析,或者在销毁之前调用serialize($_SESSION)甚至json_encode($_SESSION)

注意事项:

  • 必须正确处理成功。用户需要知道他们不再有会话。也许重定向成功。您还应该正确处理故障。我只给出了一个粗略的例子。

  • 你可能不想像你一样使用会话,但你问是否有可能,而且确实如此。

  • 代码未经过测试,仅作为示例。

  • 此示例中未显示任何安全性。至少你需要某种CSRF保护,当然要消除你的输入。

修改

如果你想根据状态启动/停止相同的链接,你可以设置一个变量来跟踪它,例如:

<script>
$(document).ready(function() { 
    var state = false;

    ... ajax stuff as above

    $('#date').click(function() { 
       switch(state) {
           case true:
              // We successfully created or recreated a session
              asyncSessionMolester('/ajax.php', 'stop');
              break;
           case false:
              // User has not yet created a session
              asyncSessionMolester('/ajax.php', 'start');
              break;
       }
    });
});
</script>

您只有一个链接,ID为date。请确保AJAX函数是更新state变量的函数,具体取决于调用是否成功。请记住,它是异步的 - 您可能希望阻止用户点击快乐。

这应该让你朝着你想去的方向前进,或者可能说明为什么它可能不是一个好主意。但是,这是实现它的一种方式。