PHP - 在ajax请求后丢失会话

时间:2014-04-14 17:40:50

标签: php ajax session

我正在尝试实施一个"添加朋友"用户个人资料页面上的按钮,用于我的社交网络。单击时,它应发送一个AJAX请求,并更改它的值。有四种可能的值:"添加朋友","取消请求","删除朋友"和"接受朋友"。

我将用户的ID保存在会话变量中,以及当前正在查看其个人资料的用户的ID。

这是我的代码:

(function (jQuery) {
var friendButton = $('.friend_button');
friendButton.on('click', function (e) {
    e.preventDefault();
    var self = $(this),
        buttonClicked = self.attr('name');
    $.ajax({
        type: 'post',
        url: '../php/profile.php',
        data: { 'buttonClicked': buttonClicked },
        dataType: 'json',
        success: function (data) {
            self.attr('name', data['name'].trim());
            self.attr('value', data['value'].trim());
        }
    });
});

})($);

这是我的服务器端:

if ($_SERVER['REQUEST_METHOD'] == 'POST'){

    if ($_POST['buttonClicked']) {
        if (!session_id()){
                session_save_path($_SERVER[DOCUMENT_ROOT]."/tmp");
                session_start();  
            }
        if ($_POST['buttonClicked'] === 'remove_friend'){
            session_save_path($_SERVER[DOCUMENT_ROOT]."/tmp");
            if (!session_id()){
                session_start();  
            }
            remove_friend_db($conn, $_SESSION['id'], $_SESSION['current_id']);
            echo json_encode(array('name' => 'add_friend', 'value' => 'Add friend'));
        }//end of checking remove_friend

        if ($_POST['buttonClicked'] === 'add_friend'){

            if (!session_id()){
                session_save_path($_SERVER[DOCUMENT_ROOT]."/tmp");
                session_start();  
            }
            add_request($conn, $_SESSION['id'], $_SESSION['current_id']);
            echo json_encode(array('name' => 'cancel_request', 'value' => 'Cancel request'));
        }//end of checking add_friend

        if ($_POST['buttonClicked'] === 'cancel_request'){

            if (!session_id()){
                session_save_path($_SERVER[DOCUMENT_ROOT]."/tmp");
                session_start();  
            }
            cancel_request_db($conn, $_SESSION['id']);
            echo json_encode(array('name' => 'add_friend', 'value' => 'Add friend'));
        }//end of checking cancel_request

        if ($_POST['buttonClicked'] === 'accept_friend'){
            session_save_path($_SERVER[DOCUMENT_ROOT]."/tmp");
            if (!session_id()){
                session_start();  
            }
            add_friendship($conn, $_SESSION['id'], $_SESSION['current_id']);
            echo json_encode(array('name' => 'remove_friend', 'value' => 'Remove friend'));
        }//end of checking accept_friend


    }//end of checking buttonClicked
}//end of checking POST

现在,问题是当我点击"添加朋友"这是第一次,一切都运作良好。请求被发送到数据库,按钮将其值更改为"取消请求"。然后,当我点击"取消请求"时,一切仍然正常,请求从数据库中删除,按钮将其值更改为"再次添加好友"

但是,当我点击"添加朋友"再次(第二次),它发送一个AJAX请求,但我的会话变量是空的,并且请求不能插入数据库。如果我刷新页面,情况是相同的,按钮只在第一次工作。

那么为什么会话变量是空的?

以下是表格:

<form action="../php/profile.php" method="post">
            <?php if (is_friend($conn, $_SESSION['id'], $_SESSION['current_id'])) : ?>
                <input class="friend_button" type="submit" name="remove_friend" value="Remove friend">

            <?php elseif  (is_sent_request($conn, $_SESSION['id'])) : ?>
                <input class="friend_button sent" type="submit" name="cancel_request" value="Friend request sent">

            <?php elseif  (requested_friendship($conn, $_SESSION['id'])) : ?>
                <input class="friend_button" type="submit" name="accept_friend" value="Accept friendship">

            <?php else : ?>
                <input class="friend_button" type="submit" name="add_friend" value="Add friend">
            <?php endif; ?>
        </form>

编辑:我现在意识到只有$ _SESSION [&#39; current_id&#39;]正在丢失。我从查询字符串中获取了它的值。但我仍然不明白发生了什么。

EDIT2:无论如何,我不知道如何解决这个问题,所以我修改了我的代码。我已将用户的ID连接到按钮名称属性。例如,name =&#34; add_friend-2&#34;,或name =&#34; cancel_request-2&#34;。在AJAX请求之前,我拆分该字符串,然后分别发送按钮名称和ID。在服务器端,我处理请求,使用给定的ID和我自己的ID(保留在会话变量中),然后返回用户的ID,在AJAX回调中,我将它连接回新的按钮名称。现在一切正常,但我仍然对那个会话问题感到困惑。

1 个答案:

答案 0 :(得分:0)

我做的最好的方法是首先set_flashdata($ data)然后在ajax调用函数或控制器结束时再次设置flashdata()中的数据,这样每次你的ajax调用重复它时数据都可用自。