0

我正在使用 jquery/JS 和 PHP 进行简单的客户端/服务器通信。它工作正常,直到 a'.'包含在数据中。

尝试使用以下标题:

  • asdf-wq1 --> works
  • test1 --> works
  • bigip1.local --> '.' is replaced with '_'

我已经将该escape()函数添加到我的代码中,但结果是一样的。

function xy(){
    for (var i = 0; i < nodes.length; i++) {
        var xy = escape(nodes[i].title) +"=" +escape(nodes[i].translate.x + "/" + nodes[i].translate.y);

        $.ajax({
            url: 'save_layout.php',
            data: xy,
            dataType: "text",
            type: 'post',
            success: function(output) {
                $("#output").html(output);
            },
            error: function (response, status, error) {
                alert("error" + response.responseText);
            }
        });
    }
}

PHP:

foreach($_POST as $name=>$value) {
     echo "$name $value \n";
}   

Firebug 输出请求:

发布 http /frontend/save_layout.php

200 正常 186 毫秒   
jquery....min.js (Zeile 4)
HeaderPostAntwortHTML
参数application/x-www-form-urlencoded
bigip1.local 470/390

奎尔
bigip1.local=470/390

Firebug 输出(响应):

bigip1_local 470/390

正如你所看到的——它似乎被正确地发送到了服务器,但在服务器上一读到我们的$_POST——'.''_'突然出现了。

希望有人可以在这里帮助我!

4

3 回答 3

3

您不应data手动将其转换为字符串。jQuery 就是这样做的。只需将对象而不是字符串传递给 Ajax 函数。

而且你永远不应该(永远!)使用escape(). 此功能已损坏,没有理由使用它。encodeURIComponent()如果您出于某种原因必须进行手动 URL 编码,请使用它。

function xy(nodes) {
    $.each(nodes, function (i, node) {
        $.post("save_layout.php", {
            title: node.title,
            x: node.translate.x,
            y: node.translate.y
        })
        .done(function (output) {
            $("#output").html(output);
        })
        .fail(function (response, status, error) {
            alert("error" + response.responseText);
        });
    });
}

还要注意我对您的代码所做的一些其他更改,以使其在 jQuery 的上下文中更加惯用:

  • nodes是作为参数而不是全局变量传入的事实。这使得函数更加独立。
  • 使用$.each()替换你的 for 循环。
  • 使用显式$.post()而不是更通用的$.ajax().
  • 所有数据都作为值而不是键传递的事实。每个请求的键title, x,都是相同的。y这使服务器端(客户端)的事情变得更容易。
  • 可以附加到的使用和回调,因为它们.done()的性质是一个承诺。你可以阅读更多关于和 promises的内容,或者直接接受它——一种在 jQuery 中使用 Ajax 回调的非常方便的方法。.fail().post().get().ajax()$.Deferred

您可能想要考虑将代码重构为对所有对象发出一个Ajax 请求,而不是对每个对象发出一个请求。HTTP 请求需要时间,最好将它们结合起来。

于 2013-01-06T14:44:10.233 回答
0
  1. 不推荐使用逃逸。更好地使用 encodeURIComponent。
  2. 你的情况只是使用 jQuery 功能

    for (var i = 0, l = nodes.length; i < l; i++) {
    
        var data = {};
        data[nodes[i].title] = nodes[i].translate.x + "/" + nodes[i].translate.y;
    
        $.ajax({
            url: 'save_layout.php',
            data: data,
            dataType: "text",
            type: 'post',
            success: function(output) {
                $("#output").html(output);
            },
            error: function (response, status, error) {
                alert("error" + response.responseText);
            }
        });
    
    }
    
于 2013-01-06T14:28:33.320 回答
-1

在您的 javascript 代码中,您可以尝试使用

JSON.stringify(values);

然后只是 json_decode() 在你的 php.ini 中。

于 2013-01-06T14:26:34.537 回答