【问题标题】:Cannot get PHP session variable back to JQuery无法将 PHP 会话变量返回给 JQuery
【发布时间】:2018-07-28 00:21:01
【问题描述】:

我知道有很多关于从 JQuery 设置 PHP 会话然后将其返回到 JQuery 的问题。而且我已经查看了所有这些,但仍然无法弄清楚为什么我的代码不起作用。我正在尝试使用模态在后端 PHP 页面上设置 PHP 会话变量,然后使用 jquery 在另一个模态中显示它,但没有返回任何内容。

这是我的发送模式:

<div id="sendingModal" class="modal" tabindex="-1" role="dialog">
 <div class="modal-dialog modal-md" role="document">
  <div class="modal-content">
   <div class="modal-body">
    <button id="testSession" type="button" class="btn btn-secondary">Session Test</button>
   </div>
  </div>
</div>

这是我的后端 php:

<?php
  session_start();
  $_SESSION['testInput'] = $_POST['inputData'];
?>

这是我的接收模式:

<div id="receivingModal" class="modal" tabindex="-1" role="dialog">
 <div class="modal-dialog modal-md" role="document">
  <div class="modal-content">
   <div class="modal-body">
    <div id="testDiv"></div>
   </div>
  </div>
</div>

这是我的 JQuery:

$(document).ready(function() {
 $('#testSession').on('click',function(e){
   var testData = 'testing 123';
   $.post("backendSession.php", {"inputData": testData});
   $('#testSession').html(<?=$_SESSION['testInput']?>);
   $('#testModal').modal('show');
 });
});

我做错了什么?

【问题讨论】:

  • 我相信您已经遇到了服务器端代码和客户端代码之间的混淆区别。 PHP 完成后,生成的 html 将发送到客户端。然后客户端运行javascript。为了取回更多数据,您发送一个新请求(在 ajax 中或直接)。然后,您必须处理来自该新请求的返回数据...这是您不在 .post 调用中的地方。
  • 因此您需要遵循的数据流类似于:PHP 创建显示给用户的 HTML 内容。用户单击某些内容会触发通过 AJAX 将数据发送到后端脚本的事件。此后端脚本创建您需要的会话变​​量然后将此值返回给进行 AJAX 调用的同一脚本。发生这种情况时,您将可以使用会话值。
  • php 没有将 html 发送回客户端。它正在设置服务器端会话变量。 .post 是调用 php 来执行此操作的原因。当我将#testSession div 的 html 设置为会话变量时,我正在处理数据。不对吗?
  • 您不必返回 HTML。您可以返回 JSON 编码的值数组。看看$.ajax()。调用后端脚本后有一个success 回调处理所有返回的数据。
  • @IncredibleHat 是的,我相信 $.post()$.get() 都使用预定义的设置调用 $.ajax()。我只是更喜欢使用$.ajax() - 并不是说​​ OP 不能使用其他人。

标签: php jquery session


【解决方案1】:

您在这里只有一个小问题,它是基于您提供的代码的简单修复。您必须在 ajax 调用期间返回新数据,否则您将无法使用它(直到刷新一个全新的页面)。

首先,添加到您的backendSession.php

<?php
    session_start();
    $_SESSION['testInput'] = $_POST['inputData'];
    echo htmlspecialchars( $_SESSION['testInput'] );// new bit
?>

然后调整您的.post 用法如下:

$(document).ready(function() {
    $('#testSession').on('click',function(e){
       var testData = 'testing 123';
       $.post("backendSession.php",
              {"inputData": testData},
              function( rawdata ) {                  // add return handler callback
                  $('#testDiv').html( rawdata );     // use the return data
                  $('#testModal').modal('show');     // show the modal
              }
       );
    });
});

现在这是做出您想做的事情的基本更改。但是,如果您计划需要的不仅仅是输入的回显,那么您将来可能希望处理 JSON 返回数据。不过,这方面的一个例子将超出问题范围;)

另一方面:您可能需要清理该帖子输入。我知道你提供的只是一个最小的例子,但我只是想提一下。由于简单地将原始用户输入回显到页面中,可能会打开一些 XSS 攻击向量。

【讨论】:

  • 我在接收模式中仍然一无所获
  • 我使用了您正在使用的代码。也许您实际上并不是要设置$('#testSession').html?而是$('#testDiv').html?
  • 它应该是#testDiv。呃。谢谢,帽子。
  • 好的,我调整了答案以反映:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-07
  • 1970-01-01
  • 2016-09-22
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多