【问题标题】:When I run a $.post with jquery ajax, my Post is empty when I decode with the json parameter. How do I fix that?当我使用 jquery ajax 运行 $.post 时,当我使用 json 参数解码时,我的 Post 是空的。我该如何解决?
【发布时间】:2021-10-07 18:18:04
【问题描述】:

代码从 php 文件请求关联数组。 有一个我正在使用的代码示例:

function cOffices() {
    return $.post('../../init.php', {
        getOffice: ''
    }, (data) => {
    }, 'json');
}
cOffices()
        .done((data) => {
            console.log(data);
        });

那段代码没有在控制台上显示任何数据。 但是如果我更改代码并且不使用“json”数据类型,它会在字符串中显示所有数组

function cOffices() {
    return $.post('../../init.php', {
        getOffice: ''
    }, (data) => {
    }, 'json');
}

这是我的 php 文件

if (isset($_REQUEST['getOffice'])) {
            $oficModel = new User();

            $getO = $oficModel -> getOfficeData($config['dirLogin'], $config['dirPass']);

            echo json_encode($getO);
        }

顺便说一下,这些是我的脚本:

<script src="../js/jquery-3.6.0.min.js"></script>
<script type="module" src="../js/users.js"></script>

更新: 我想在另一个请求中请求数据后使用该请求。 这是一个例子:

$.post('../../init.php', {
        getCreate: ''
    }, (data) => {
        let lOptions = '';

        data.forEach((d) => {
            lOptions += `<option value="${d.id_grupo}">${d.nom_grupo}</option>`;
        });

        let formCreate = `<div class="formCreate">
            <form action="../../init.php" method="POST" id="formCreate" autocomplete="off">
                <button type="button" class="closeForm"><i class="fas fa-times"></i></button>
                <h2>Create User</h2>
                <input required type="email" name="cMail" placeholder="Insert E-Mail"
                maxlength="35" id="cMail">
                <input required type="password" name="cPass" placeholder="Insert Password"
                maxlength="24" id="cPass">
                <input required type="text" name="cName" placeholder="Insert Name"
                maxlength="40" id="cName">
                <div class="selectOffice">
                    <select name="cOffice" id="cOffice" required>
                        <option value="" disabled selected>Select an Office</option>
                        ${lOptions}
                    </select>
                </div>
                <div class="selectCreate">
                    <select name="cGroup" id="cGroup" required>
                        <option value="" disabled selected>Select a Group</option>
                        ${lOffices}
                    </select>
                </div>
                <button type="submit" name="saveUser">Save</button>
            </form>
        </div>`;

        $('.container1').prepend(formCreate);
        $('.formCreate').fadeTo(400, 1);
    },'json');
}

另一个更新 [已解决] 我发现了错误,在我的 php 中有 2 个同名的进程,所以当我进行 ajax 调用时,数据是 2 个 json 编码的字符串,而 ajax 无法解码。给您带来的不便敬请谅解

【问题讨论】:

  • 您在此代码中返回了一个 Promise,而不是结果。 Done 应该从回调中获取数据。

标签: javascript php jquery ajax


【解决方案1】:

尝试使用

cOffices.error(function(jqXHR, textStatus, errorThrown) {
        console.log("error " + textStatus);
        console.log("incoming Text " + jqXHR.responseText);
    })

定义错误的原因。 可能是您在响应中损坏了 JSON。

同时在开发控制台的网络选项卡中检查您的请求

【讨论】:

  • 我使用了 cOffices().fail() 因为 .error() 不是一个函数。第一个 consol.log() 的响应是“error parsererror”,第二个是括号内的所有 json 数据。
  • 这意味着您的响应中有错误的 json 格式
【解决方案2】:

考虑以下示例。

$(function() {
  function cOffices() {
    $.ajax({
      url: "../../init.php",
      type: "POST",
      data: {
        getOffice: true
      },
      dataType: "json",
      success: function(results) {
        return results;
      },
      error: function(x, status, error) {
        console.log("Error:", status, error);
      }
    });
  }

  $("button").click(function() {
    console.log(cOffices());
  });
});
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"&gt;&lt;/script&gt;

使用$.post() 非常相似。它还应该识别 JSON 数据,但这只是更具体一点。

更新

现在看到你的 PHP,我建议在 getOffice 变量中输入一个值。是的,"" 应该可以工作,isset() 应该检测到它是一个带有空字符串集的变量,并且最好传递一个变量以防万一。例如,我用getOffice: true 更新了我的。

更新 2

我创建了以下 Fiddle 示例:https://jsfiddle.net/Twisty/7oh29dyj/

JavaScript (jQuery 3.6.0)

$(function() {
  var testData = JSON.stringify([{
    "id_lugar": "1",
    "desc_lugar": "Oficina N\u00famero 1",
    "dir_lugar": "Calle Random 1",
    "depart_lugar": "Montevideo",
    "ciudad_lugar": "Montevideo",
    "tel_lugar": "94132471",
    "fk_dep": "0"
  }]);

  var myData = [];

  function cOffices() {
    var myPost = $.ajax({
      url: "/echo/json/",
      type: "POST",
      data: {
        json: testData
      },
      dataType: "json",
      success: function(results) {
        myData = results;
        $(".results").html(JSON.stringify(results));
      }
    });
  }

  $("button").click(function() {
    cOffices();
  });
});

这在小提琴中起作用。请记住,resultsdata 的范围仅存在于该回调中。通常最好在同一个回调中对数据做你想做的事情。

我的示例将数据放在一个更全局范围的变量中,因此如果需要,您可以从其他函数中获取它。如果要管理数据,则必须等到 AJAX 完成。由于 JS 的异步特性,您可能需要等到就绪状态完成才能确保填充变量。

更新 3

试试下面的。

$.post('../../init.php', {
  getCreate: ''
}, (data) => {
  var formCreate = "<div class='formCreate'><form action='../../init.php' method='POST' id='formCreate' autocomplete='off'><button type='button' class='closeForm'><i class='fas fa-times'></i></button><h2>Create User</h2><input required type='email' name='cMail' placeholder='Insert E-Mail' maxlength='35' id='cMail'><input required type='password' name='cPass' placeholder='Insert Password' maxlength='24' id='cPass'><input required type='text' name='cName' placeholder='Insert Name' maxlength='40' id='cName'><div class='selectOffice'><select name='cOffice' id='cOffice' required><option value='' disabled selected>Select an Office</option></option></select></div><div class='selectCreate'><select name='cGroup' id='cGroup' required><option value='' disabled selected>Select a Group</option></select></div><button type='submit' name='saveUser'>Save</button></form></div>";

  $.each(data, function(k, v) {
    $("<option>", {
      value: v.id_grupo
    }).html(v.nom_grupo).appendTo($("#cOffice", formCreate));
    $("<option>", {
      value: v.id_grupo
    }).html(v.nom_grupo).appendTo($("#cGroup", formCreate));
  });

  $('.container1').prepend(formCreate);
  $('.formCreate').fadeTo(400, 1);
}, "json");

这首先创建了所有相关的 HTML,然后从数据中附加动态元素。

【讨论】:

  • 返回未定义。
  • @GLPG35 您在“网络”选项卡中看到的有效负载和响应是什么?
  • 现在它返回一些更具体的东西:错误:parsererror SyntaxError: Unexpected token [ in JSON at position 1226 at parse () at jquery-3.6.0.min.js:2 at l (jquery-3.6.0.min.js:2) 我所有的 ajax 请求在响应的开头都有 [ 所以,我不知道为什么会这样。
  • 在网络选项卡中,它似乎是从 cOffices() 发送数据,但是当它返回时,cOffices() 并没有出现,所以我无法确定。
  • @GLPG35 听起来返回的 JSON 数据存在问题。在尝试解析它时,它在 JSON 字符串中发现了一个意外的标记 [。你能提供一个原始结果的例子吗?
猜你喜欢
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
相关资源
最近更新 更多