2

我有一个 session_id,我用它来识别购物篮类型应用程序中的用户。

session_id 作为会话 id 存储在数据库中。

当我更新购物车时,session_id、product_id 和 qty 存储在 Basket 表中。

我正在尝试将一个项目添加到篮子,然后在屏幕上显示更新的篮子而不使用 jquery 刷新页面。

我是否将会话 ID 存储在隐藏的 html 字段中,还是有更好的方法让 jQuery 知道 session_id 是什么?

更新: 好的,所以现在根据下面的答案和评论,我真的不想在隐藏字段中使用会话 ID。我当然不想在 html 页面中显示会话 ID。

我可能需要回溯一点……

当 ajax 调用我的更新篮子函数时,我遇到了以下错误...

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at ..... /ajaxData.php on line 105

我用来启动会话的代码是......

if (!session_id()){
session_start();
}

我真的不明白这个警告是什么意思,所以这就是为什么我想通过隐藏的 html 字段发送会话 ID。

我想解决方案是修复警告并尝试正确地做事......

对我的警告信息有什么建议吗?

4

3 回答 3

2

IMO 所有会话数据都必须在服务器中进行管理,如果您确实需要在前端异步获取它。例如:

1.- jQuery 的东西

$.get(
        window.location.href,
        {
            get_session_id : 1
        },
    function(data) {
    var session_id = data.session_id
    if ("" == session_id){
            // alert user
            // give a friendly way to proceed without loss user's time
            // return;
    }
    // use session_id
}, "json");

更新 为避免Warning: session_start() [function.session-start]...错误,请尽早将此代码段放入您的脚本中。在任何 html 输出之前。

2.- 服务器的东西

// none output before this snippet

if ($_GET['get_session_id'])
{
    // get $session_id
    $output['session_id'] = $session_id ? $session_id : '';
    echo json_encode($output);
    exit;
}

更新 2:

我向您提出此解决方案的原因是,我认为最好在需要时动态获取会话 ID,而不是以静态方式存储它,因为此标识符可能会被修改、删除等,而用户花时间填写表格。
不幸的是,这个缺陷很常见而且很烦人。提交一个表单,而不是被处理,我们被重定向到一个登录页面,丢失所有发送的数据。

于 2013-01-01T22:43:05.113 回答
1

使用这个 JavaScript 代码(结合 PHP):

<script type="text/javascript">
var sessionid = "<?php echo session_id(); ?>";
</script>

然后在您的 jQuery (AJAX?) 调用中使用sessionid变量。

于 2013-01-01T22:18:50.950 回答
0

你可以使用一个data-属性:

<form id="cart-form" action="" data-sessionid="<?php echo session_id(); ?>">
    <!-- rest of form code -->
</form>

然后在您的 jQuery 中,只需使用$(this).data('sessionid')它来检索它:

$('#cart-form').submit(function() {
    var session_id = $(this).data('sessionid'); 
    // ... rest of your code here ...
});
于 2013-01-01T22:24:26.193 回答