【问题标题】:AJAX request via jQuery from PHP responses null来自 PHP 响应的通过 jQuery 的 AJAX 请求 null
【发布时间】:2019-04-21 19:21:28
【问题描述】:

我想使用来自 PHP 的 AJAX 接收数据,它要求数据库提供一些数据。我从 AJAX 得到的只是NULL

当我提醒结果(例如 data.name)时,它会显示 undefined

HTML、AJAX 和 jQuery 在 index.php 中,而 PHP 在 edit.php 中。

我使用的 AJAX 请求...

$('div[data-toggle="edit"]').click(function() {
    var editid = $(this).attr('id').replace('edit','');
    $.ajax({
        cache: false,
        type: 'GET',
        url: 'edit.php',
        data: editid,
        dataType: 'JSON',
    }).done(function(data) {
        $('#mainlabel').modal('show');
        $('input[name=add_name]').val(data.name);
        $('input[name=add_date]').val(data.date);
        $('input[name=add_image]').val(data.image);
        $('input[name=add_info]').val(data.info);
    }).fail(function(jqXHR, message) {
        alert(message);
    });
});

...从这个 PHP 代码接收数据。

<?php
    require_once('main.conf');
    require_once('db.php');

    $stmt = $con->prepare("SELECT * FROM datas d WHERE d.dataid = ?");
    $stmt->bind_param("i", $_GET["editid"]);
    $stmt->execute();
    $result = $stmt->get_result();
    $stmt->close();

    while ($row = $result->fetch_assoc()) {
        $editname  = $row["name"];
        $editdate  = date("Y-m-d", strtotime($row["date"]));
        $editimage  = $row["image"];
        $editinfo  = $row["additionalinfo"];
    }

    $return[] = array("name" => $editname,
                      "date" => $editdate,
                      "image" => $editimage,
                      "info" => $editinfo,
                      "getid" => $_GET["editid"]); //only for debugging

    header('Content-Type: application/json; charset=UTF-8');
    echo json_encode($return);
?>

当我通过edit.php?editid=547 手动调用此代码时,JSON 结果看起来应该如此。

0   
    name    "Mike Minus"
    date    "2015-05-12"
    image   "employee.jpg"
    info    "some additional info"
    getid   "547"

有了预期的信息,我想填写一些输入框。

<div class="modal-body mx-3">
    <div class="form-group">
        <label for="add_name" class="col-form-label">Name:</label>
        <input class="form-control validate" type="text" name="add_name" value="">
    </div>
    <div class="form-group">
        <label for="add_name" class="col-form-label">Datum:</label>
        <input class="form-control" type="date" name="add_date" size="8" value="">
    </div>
    <div class="form-group">
        <label for="add_image" class="col-form-label">Bild:</label>
        <input class="form-control" type="text" name="add_image" value="">
    </div>
    <div class="form-group">
        <label for="add_info" class="col-form-label">Zusatzinfos:</label>
        <input class="form-control" type="text" name="add_info" value="">
    </div>
</div>

<div class="btn btn-info btn-sm" data-toggle="edit" id="edit547">
    <i class="fa fa-pencil-square-o"></i>
</div>

我知道 SO 中有很多可能的解决方案。在 PHP 代码中使用 echo 而不是 return,适当的 application/json 标头或其他技术。在此之前没有任何帮助。

【问题讨论】:

    标签: php jquery ajax


    【解决方案1】:

    问题是$return[] = ...(方括号)。

    试试$return = ...

    那些括号将变量定义为一个数组......然后你将它分配给另一个数组。

    结果是一个包含数组的数组...内部数组将被 json 编码,因为键不是数字的。但外层不会。

    如果您想验证这一点,请保留方括号并尝试以下 ajax 成功回调:

    .done(function(data) {
        $('#mainlabel').modal('show');
        $('input[name=add_name]').val(data[0].name);
        $('input[name=add_date]').val(data[0].date);
        $('input[name=add_image]').val(data[0].image);
        $('input[name=add_info]').val(data[0].info);
    })
    

    注意[0]...,即访问第一个数组元素。


    编辑

    为了清楚起见,在 cmets 之后……试试这个:

    $row = $result->fetch_assoc();
    $editname  = $row["name"];
    $editdate  = date("Y-m-d", strtotime($row["date"]));
    $editimage  = $row["image"];
    $editinfo  = $row["additionalinfo"];
    
    $return = array("name" => $editname,
                      "date" => $editdate,
                      "image" => $editimage,
                      "info" => $editinfo,
                      "getid" => $_GET["editid"]); //only for debugging
    


    第二次编辑

    在聊天中进行了广泛(但令人愉快)的调试之后……我们解决了 ajax data 错误。

    应该是:

    data: {editid: editid}, // to have the id in $_GET['editid']
    

    【讨论】:

    • 你是对的。我纠正了这一点。但不幸的是,结果是一样的。
    • 好吧...现在肯定是因为$row 范围(在while 循环中定义。顺便说一句,由于您显然只期望一行,所以while 是无用的。删除 while ($row = $result-&gt;fetch_assoc()) { 并将其替换为 $row = $result-&gt;fetch_assoc(); 并删除该 while 的结尾大括号。
    • 我知道循环一定有问题!有时结果可能如此简单。但仍然是NULL,日期除外。现在是 1970-01-01。 (与之前的日期无关)
    • mmm... 尝试将其注释掉:$result = $stmt-&gt;get_result();
    • AJAX 现在调用parsererror。但是测试请求的.fail 部分的好方法;-)
    【解决方案2】:

    在 while 循环中包含 $return[]

    【讨论】:

      猜你喜欢
      • 2020-08-04
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      相关资源
      最近更新 更多