请求ajax写入数据并返回ok但带来json和html

问题描述 投票:0回答:2

我正在尝试制作一个AJAX请求。更新是在数据库中完成的,但它没有成功,如果我删除dataType,它就会成功,但是在两种形式它返回JSON和HTML时应该只返回JSON。

我在代码中看不到任何与众不同的东西。为什么会这样。我的JSON会以任何方式无效吗?

使用Javascript

$(document).ready(function () {
    $('#depositar').submit(function () {
        var form = $(this);
        var dados = $(this).serialize();

        $.ajax({
            url: 'http://localhost/caixamvc/conta/depositar',
            method: 'POST',
            dataType: 'json',
            data: dados,
            beforeSend: function () {
                $("#retorno").html('Aguarde, validando dados...');
            },
            success: function (resposta) {
                $("#retorno").html(resposta.dados);
            }
        });
        return false;
    });
});

调节器

public function depositar() {
    if (isset($_POST['valor'])) {
        $value = $_POST['valor'];
        $json = [];

        if ($_SESSION['tipo_conta'] == 1) {
            $conta = new ContaCorrente;
        } else {
            $conta = new ContaPoupanca;
        }

        $conta->depositar($_SESSION['user'], $value);
        if ($conta->getResult()) {
            $json['dados'] = "Tudo certo";
        }else{
            $json['retorno'] = "Nada aqui";
        }
        echo json_encode($json);
    }

    $this->loadTemplate('depositar', $this->getData());
}

视图

<h4>Depositar</h4> 
<form id="depositar" method="POST">
    Conta:<br/>
    <input type="text" name="valor" /><br/><br/>
    <input type="submit" name="depositar" value="Depositar"/>
    <div id="retorno"></div>
</form>

响应

Response

php jquery json ajax
2个回答
0
投票

在您的控制器中,您有条件地返回JSON:

if (isset($_POST['valor'])) {
    //...
    echo json_encode($json);
}

但随后总是返回HTML:

$this->loadTemplate('depositar', $this->getData());

如果不返回JSON(条件为false),则返回有效的HTML。但是当条件成立时,你最终都会返回到客户端。因此,响应既不是有效的JSON也不是有效的HTML。

返回JSON时,不要返回HTML。它必须是一个或另一个:

if (isset($_POST['valor'])) {
    //...
    echo json_encode($json);
} else {
    $this->loadTemplate('depositar', $this->getData());
}

理想情况下,您将完全使用两个不同的控制器操作。一个显示页面,另一个返回数据。这样你就没有一个功能可以做多个事情,需要if条件来检查它应该做什么。

每个功能都应该做一件事。


0
投票

The docs saydataType是:

您期望从服务器返回的数据类型。

当你回应一些JSON时,你实际上是在返回HTML。这是因为你正在做这些中的一个(或两个):

  1. 仍在渲染模板。所以响应是一些JSON,然后是一个HTML页面,两者都粘在一起。
  2. 仅仅因为你回应JSON,并不意味着它是JSON。查看Returning JSON from a PHP Script之类的问题,了解如何正确地将JSON作为JSON返回。
© www.soinside.com 2019 - 2024. All rights reserved.