【问题标题】:AJAX POST sending blank space instead of JSON objectAJAX POST 发送空格而不是 JSON 对象
【发布时间】:2019-09-05 05:29:00
【问题描述】:

我正在使用一个名为 register.php 的 PHP 文件在我的数据库中注册新用户,其中一些数据来自注册表单,但是,我数据库中的最后两个数据字段是两个默认的 JSON 对象.为此,我在注册按钮单击事件的 js 文件中创建变量,然后使用 JSON.stringify() 使用 AJAX/JQuery 发送它,如下所示:

除了这个 AJAX/JQuery 的东西,我还尝试使用 xmlhttp,创建一个请求并使用 open("GET", ...)、send(...) 发送数据并以相同的方式接收它在 PHP 文件上。两种方式最终都会收到空格而不是 JSON 对象。


    $("#registerButton").click(function(){

        cards = {"idcards": [1,4,7,10,13,16,17,19,23,27,29,35,39,41,43,46,58,77,95,120]};
        cardsJSON = JSON.stringify(cards);


        $.ajax({
            type: 'POST', 
            url: 'php_includes/register.php',
            data: {cards: cardsJSON},
            dataType: 'json'
        });
    });

这是 PHP 代码:

...

$freecards = $_POST['cards'];
...

#I'm omitting the other query values to simplify this.

$query = "INSERT INTO users VALUES ('{$freecards}')";

我希望收到我在 JS 文件开头声明的相同 JSON 对象,而不是我进入数据库的空白空间。

【问题讨论】:

  • 危险:你很容易受到SQL injection attacks的影响,你需要defend你自己。
  • 什么是registerButton? Ajax 请求是实际运行 PHP 的请求吗?还是被发送空白数据的表单提交取消了?
  • @Quentin registerButton 是按钮的 id。运行 AJAX 的 PHP 文件称为 index.php,这是我们拥有注册表单的地方。当点击按钮registerButton时,会运行另一个PHP文件,名为register.php,我们要在其中接收卡片数据,然后我们可以将其发送到数据库。
  • 在测试您的代码并生成echo $query 时,我得到INSERT INTO users VALUES ('{\"idcards\":[1,4,7,10,13,16,17,19,23,27,29,35,39,41,43,46,58,77,95,120]}')。在这里看到它:codepen.io/lipsumar/pen/qwPJJx
  • @Inês — 听起来您正在提交表单,这正在取消 Ajax。

标签: php jquery json ajax xmlhttprequest


【解决方案1】:

通过 $_POST 变量获取值 -

JavaScript:

$("#registerButton").click(function(){

    var cardsObj = {"idcards": [1,4,7,10,13,16,17,19,23,27,29,35,39,41,43,46,58,77,95,120]};

    $.ajax({
        type: 'POST',
        contentType: "application/x-www-form-urlencoded; charset=UTF-8",
        dataType : "json",
        url: 'php_includes/register.php',
        data: {cards: cardsObj},
        success: function(data) {
            console.log(data);
        }
    });

});

PHP:

$jsonString = $_POST['cards'];
$cardsJsonString = json_encode($jsonString);

header('Content-Type: application/json');
echo $cardsJsonString;

想要将 JSON 从 JavaScript 发送到 PHP:

    $.ajax({
        type: 'POST',
        contentType: "application/json",
        dataType : "json",
        url: 'php_includes/register.php',
        data: {cards: cardsObj},
        success: function(data) {
            console.log(data);
        }
    });

PHP:

$jsonString = file_get_contents("php://input");
$phpObject = json_decode($jsonString);

$newJsonString = json_encode($phpObject);
header('Content-Type: application/json');
echo $newJsonString;

【讨论】:

  • 现在我得到了字符串中的值'null',但至少它不是空格。你知道我们为什么会得到“null”字符串吗?
  • 如何将帖子数据分配给变量?
【解决方案2】:

你需要在$freecards上使用json_decode()

$freecards = json_decode($freecards, true);

【讨论】:

  • 即使使用json.decode(),我也会不断获得空白空间
  • @Inês: 你没有在你的 ajax 请求中使用成功方法
  • @Inês:在浏览器控制台中?你能展示一下你的成功方法吗?
  • @devpro 在成功方法中,我执行了alert(data),但由于页面被重定向,它没有显示。
  • “你需要使用 json_decode()”——这会将它从一个字符串转换成一个数组,但是 OP 正试图将它插入到一个字符串中。
【解决方案3】:

您不需要 JSON.stringify(cards)。您可以直接发送 cards 而不是 cardsJSON

$.ajax({
            type: 'POST', 
            url: 'php_includes/register.php',
            data: {cards: cards},
            dataType: 'json'
        });

【讨论】:

  • "你不需要 JSON.stringify(cards)" — 如果你想让 $_POST['cards'] 成为一个字符串,你可以这样做。
  • 我也试过了,但它仍然没有发送 JSON 对象。
  • @Quentin.. 你会将它作为 JSON 对象获取,因为问题是关于将其作为 JSON 而不是字符串获取。
  • @PoojaMaurya — There's no such thing as a JSON object。如果您使用 JSON.stringify,您将在 cards 中获得 JSON 文本的字符串表示形式,然后将其传递给 $_POST['cards']。如果您不使用JSON.stringify,您将拥有一个JavaScript 数组,jQuery 将把urlencode 形成为cards[]=1&cards[]=4&etc,PHP 将解码为$_POST['cards'] 中的PHP 数组。像 OP 那样在字符串插值中使用数组是没有意义的。如果您使用JSON.stringify,您会获得 JSON。
猜你喜欢
  • 2022-07-12
  • 2022-06-14
  • 2012-03-09
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 2021-12-19
  • 2018-06-10
  • 2013-08-04
相关资源
最近更新 更多