【问题标题】:Sending Data From A PHP Script Back To A JQuery AJAX Request将 PHP 脚本中的数据发送回 JQuery AJAX 请求
【发布时间】:2012-05-17 06:15:08
【问题描述】:

我正在创建一个 Web 应用程序并遇到以下问题。

在我的应用程序中,用户在单个页面中工作,他们在画布上绘图。有一个名为“保存”的按钮。这将获取用户 ID 以及他们在画布中创建的任何内容,并将其发送到数据库。这一切都很好。保存功能类似于:

$.ajax({
    url: "/database/write.php",
    type: "POST",     
    data: { 
        docName: name,
        docData: document_Data,
        docMode: "new"
    }, 
    success: function(html) {
        alert("Successfully Saved NEW document");
        set_Mode();
    },          
});

上面的 AJAX 请求确实将三个值发送到 PHP 脚本,然后成功地在数据库中创建了一个新文档,我现在需要做的是将应用程序模式从保存新文档更改为编辑以前保存的文档。这意味着当用户再次保存时,他们将写入同一行,覆盖文档的先前版本。

当我将数据发送到write.php 时,它确实将数据写入数据库,并查询数据库中插入的文档并检索其唯一的文档 ID。使用该 ID,应用程序可以选择该文档并覆盖它。要从查询中检索文档 ID,我在 write.php 中使用以下代码

write.php

$_SESSION['DOCUMENT_ID'] = $DOCUMENT_ID;

此 $DOCUMENT_ID 是从 SELECT 查询中检索到的文档 ID。然后脚本完成并将控制权转移回主应用程序页面。

返回应用程序页面,我尝试检索该值,但它似乎不起作用。我可以检索用户第一次访问应用程序 (id) 时设置的 $_SESSION 值,但现在由 write.php (DOCUMENT_ID) 页面设置的值。例如,AJAX请求成功后调用的函数如下:

function set_Mode()
{
    var PHPvar_01 = <?php echo($_SESSION['id']); ?>;
    alert(PHPvar_01); //WORKS FINE

    var PHPvar_02 = <?php echo($_SESSION['DOCUMENT_ID']); ?>;
    alert(PHPvar_02); //DOES NOT WORK.          
};

我应该如何将从 PHP 查询脚本检索到的数据发送到应用程序,因为 $_SESSION 似乎在这里不起作用。

感谢您的任何反馈。

【问题讨论】:

    标签: php jquery ajax session session-variables


    【解决方案1】:

    在您的 write.php 中,您应该在页面末尾回显 $DOCUMENT_ID,然后您的成功函数将在 html 参数中接收它。然后您应该使用传递给成功函数的html 变量调用set_Mode

    在页面加载之后并且之后你知道文档ID之前你不能调用set_Mode。在初始页面加载时,您正在将文档 ID 写入set_Mode 函数中。

    【讨论】:

      【解决方案2】:

      好吧,您的 PHP 代码只会在页面初始加载时执行一次。服务器检测到对您站点的请求,在内部加载 PHP 文档,对其进行解析并将其传递给客户端。

      因此,当 AJAX 调用返回时,整个 PHP 脚本不会再次执行,因为用户并没有请求整个页面,而只是向您的 write.php 发送了一个请求。

      您的write.php 脚本必须以某种方式返回$DOCUMENT_ID,例如直接回显它,然后 jQuery AJAX 调用中的成功处理程序可以通过处理程序的参数访问它(参见 jQuery 文档)。

      【讨论】:

        【解决方案3】:

        当页面已经在用户浏览器中加载时,您无法访问服务器上的变量,除了使用 ajax。

        你需要发回一些东西,而在 PHP 中你所要做的就是回显一些东西,并在你的 Ajax 调用的成功函数中捕获它。

        在/database/write.php的最后,做

        echo $_SESSION['DOCUMENT_ID'];
        

        在 JS 中

        $.ajax({
            url: "/database/write.php",
            type: "POST",     
            data: { 
                docName: name,
                docData: document_Data,
                docMode: "new"
            }, 
            success: function(data) {
                alert("Successfully Saved NEW document");
                set_Mode();
                if (data == 'something') {
                   //do something with the returned DOCUMENT_ID stored in the data variable
                }
            },          
        });
        

        【讨论】:

          【解决方案4】:

          在 write.php 的末尾:

          echo json_encode(array('id'=>$_SESSION['id'], 'DOCUMENT_ID'=>$_SESSION['DOCUMENT_ID']));
          

          在您的 ajax 调用中:

          success: function(data) {
              data = eval('('+data+')');
              alert("Successfully Saved NEW document");
              set_Mode(data.id, data.DOCUMENT_ID);
          },     
          

          这应该可以解决问题!

          【讨论】:

          • 我同意 Keil 的观点,这样就可以了。但我建议不要使用eval,这是一种不好的做法。而是在进行ajax调用时传递参数dataType: 'json',这将确保您成功收到的数据是json
          • 请不要在没有解释的情况下说 eval 是一种不好的做法。在这种情况下,源数据是可信的(不是由某些 fifo 用户输入产生的),因此无需担心。如果你想更安全,你需要 htmlentities 你响应服务器端,window.JSON.parse() 数据客户端(某些浏览器不支持它)
          • 我了解源数据是可信的,因此使用 eval 似乎没问题。但作为一名开发人员,我不会仅仅因为我认为来源是可信的就去做这些事情。我相信预防胜于治疗...网上有大量文章解释为什么应该避免使用 eval... 请仔细阅读... 例如:Why is using the JavaScript eval function a bad idea?
          • 在将字符串转换为 JSON 时,我更喜欢使用 jquery.js 中的 parseJSON 函数,它比盲目使用 eval 更小更安全
          猜你喜欢
          • 1970-01-01
          • 2017-04-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-11
          相关资源
          最近更新 更多