【问题标题】:How to update the SESSION value on same page after AJAX call on post JSON value without refreshing page如何在 AJAX 调用后 JSON 值后更新同一页面上的 SESSION 值而不刷新页面
【发布时间】:2020-01-23 09:26:19
【问题描述】:

如何在 AJAX 调用后 JSON 值后更新同一页面上的 SESSION 值而不刷新页面。

我被困在这里了。非常感谢任何解决问题的帮助。我根据单击的操作按钮在 PHP 中运行特定类。即当用户单击添加按钮时,它会启动 AJAX 调用并发送“添加”ID,否则如果他/她单击更新按钮,它会发送“更新 ID”。我想在不更新页面的情况下执行此操作。

我已经获得了数据,但唯一的问题是它只有在我刷新页面时才会更新

AJAX 发送数据后,如何在 PHP 中更新 SESSION。我是新手,请放轻松:)谢谢你

索引.php

<?php
session_start();
echo "SESSION: ".$_SESSION['pageType'];
?>

<!DOCTYPE>
<html lang="en-OM">

<div >AJAX: </div><div id="msg" style="display:inline"></div></div>
<a id="btnAdd" value="add" class="btnType" href="#" role="button">ADD</a><br>
<a id="btnUpdate" value="update" class="btnType" href="#" role="button">UPDATE</a><br>
<a id="btnDelete" value="delete" class="btnType" href="#" role="button">DELETE</a>

</html>

jQuery

   <script>
    $(document).ready(function () {
        $('.btnType').click(function (ev) {
            ev.preventDefault();
            ev.stopImmediatePropagation();
            let pageID;
            pageID = $(this).attr('value');
            $.ajax({
                type: 'POST',
                url: 'postData.php',
                dataType: 'json',
                data: {
                    pageType: pageID
                },
                beforeSend: function (data) {
                },
                success: function (data) {
                    $('#msg').text(data);
                    console.log(data);
                    return data;
                },
                error: function (jqXHR, textStatus, errorThrown) {
                    console.log('<p>status code: ' + jqXHR.status +
                        '</p><p>errorThrown: ' + errorThrown +
                        '</p><p>jqXHR.responseText:</p><div>' + jqXHR.responseText +
                        '</div>');
                    console.log('jqXHR:');
                    console.log(jqXHR);
                    console.log('textStatus:');
                    console.log(textStatus);
                    console.log('errorThrown:');
                    console.log(errorThrown);
                }
            });
        });
    });
</script>

postData.php

session_start();
if (!empty($_POST['pageType'])) {
    echo json_encode($_POST['pageType']);
    $_SESSION['pageType']=$_POST['pageType'];
    exit;
}

【问题讨论】:

  • 这里到底指的是什么,什么是刷新页面后才更新? “一旦 AJAX 发送数据,我如何在 PHP 中更新 SESSION” - 通过将新值分配给会话变量,就像您对 $_SESSION['pageType']=$_POST['pageType'] 所做的那样。我认为您以某种方式混淆了服务器上会话数据的实际状态,以及客户端上显示的内容......?
  • echo "SESSION: ".$_SESSION['pageType']; 移动到你的“msg”div 中。这样,当您运行 AJAX 调用时,它将被覆盖(因为 $('#msg').text(data);)。如果您打算只返回一段文本以在页面中显示,也不要使用 json_encode - 这不是必需的。
  • @ADyson 我按照你的要求做了,但还是不行。因为一旦您在服务器端分配了值,就需要刷新它才能更新。删除 json_encode 会给我错误。
  • “一旦你在服务器端分配了值,它就需要刷新才能更新”......在这种情况下,您的 AJAX 调用可能无法正常工作。你需要做一些调试。
  • P.S.我应该说,当您删除 json_encode 时,您还应该从 AJAX 中删除 dataType: 'json'。您没有使用或不需要任何 JSON 来实现此功能。

标签: php jquery json ajax


【解决方案1】:

这应该会更好:

索引.php

<?php
session_start();
?>
<!DOCTYPE>
<html lang="en-OM">

<div >SESSION: </div><div id="msg" style="display:inline"><?php echo $_SESSION['pageType']; ?></div></div>
<a id="btnAdd" value="add" class="btnType" href="#" role="button">ADD</a><br>
<a id="btnUpdate" value="update" class="btnType" href="#" role="button">UPDATE</a><br>
<a id="btnDelete" value="delete" class="btnType" href="#" role="button">DELETE</a>

</html>

jQuery

$(document).ready(function () {
    $('.btnType').click(function (ev) {
        ev.preventDefault();
        ev.stopImmediatePropagation();
        let pageID;
        pageID = $(this).attr('value');

        $.ajax({
            type: 'POST',
            url: 'postData.php',
            data: {
                pageType: pageID
            },
            success: function (data) {
                $('#msg').text(data);
                console.log(data);
            },
            error: function (jqXHR, textStatus, errorThrown) {
                console.log('<p>status code: ' + jqXHR.status +
                    '</p><p>errorThrown: ' + errorThrown +
                    '</p><p>jqXHR.responseText:</p><div>' + jqXHR.responseText +
                    '</div>');
                console.log('jqXHR:');
                console.log(jqXHR);
                console.log('textStatus:');
                console.log(textStatus);
                console.log('errorThrown:');
                console.log(errorThrown);
            }
        });
    });
});

postData.php

session_start();
if (!empty($_POST['pageType'])) {
    echo $_POST['pageType'];
    $_SESSION['pageType']=$_POST['pageType'];
}
else
{
  echo "error - no pagetype specified";
}
exit;

我做了什么:

1) 将 Session 值的初始回显移动到“msg” div 中,这样它就可以被 AJAX 调用的结果覆盖

2) 从 AJAX 选项和 PHP 中删除所有对 JSON 的引用。您在这里没有使用(也不需要使用)JSON 来发送一条文本。

3) 为 postData.php 添加了一些基本的容错功能,以确保始终有某种输出。

【讨论】:

  • 感谢您向我发送详细信息代码。我做了改变。问题仍然存在。如何将 JSON 值添加到 PHP SESSION,以便在不刷新页面的情况下动态检查按钮操作?
  • 这里没有 JSON 值!当您通过 AJAX 发送值时,它不会以 JSON 格式发送,除非您明确告诉 JQuery 这样做。但是没有必要,所以不要。无论如何,此代码应确保您的会话更新为新值。它还应该回显该新值,以便您可以将其显示回屏幕上。如果这没有发生,那么您需要进行一些详细的调试,并准确地向我们解释执行代码时发生了什么,以便我们可以帮助您修复它。你知道如何使用浏览器的开发者工具调试 JS 和 AJAX 吗?
  • 为了更好地向您解释我的意思,我添加了代码,该代码应在基于 ID 的按钮单击时启动每个会话。对不起,如果我是书呆子。 &lt;div &gt;SESSION: &lt;/div&gt;&lt;div id="msg" style="display:inline"&gt; &lt;?php if(Session::get('pageType')=='add'){ echo "ADD button Clicked"; }elseif(Session::get('pageType')=='update'){ echo "UPDATE button Clicked"; }elseif(Session::get('pageType')=='delete'){ echo "DELETE button Clicked"; } ?&gt;&lt;/div&gt;
  • 正确,但该代码在您首次加载页面时执行。它发生在在您单击按钮之前。因此它不能按你的意愿工作。当您单击该按钮并运行 AJAX 时,它会单独调用 postData.php。这改变了会话。然后它会响应响应。该响应返回到 $.ajax 的“成功”函数内的data。然后,您使用 JavaScript 将该值放入页面中的“msg”div 中。这就是它必须工作的方式。你为什么不把我上面给你的代码放在上面?像我写的那样试一试,然后看看。
  • 知道了!谢谢你让我明白:)
猜你喜欢
  • 2018-11-09
  • 2019-08-31
  • 2013-04-26
  • 1970-01-01
  • 1970-01-01
  • 2015-03-01
  • 2017-03-14
  • 2020-03-05
  • 1970-01-01
相关资源
最近更新 更多