jquery post.fail,即使php成功


jquery post .fail even when php succeed

我的jQuery发布请求有问题:

$.post(
  'http://localhost/***/ajax_bdd-change.php',
    {'id': _id, 'id_key': id_key, 'table': table, 'data': data})
    .fail(function(jqXHR, textStatus, errorThrown){
      alert('Erreur: '+jqXHR.responseText);
    })
    .done(function(data){
      alert($(data).text());
    });

还有我的PHP:

<?php
$id     = json_decode($_POST['id']);
$id_key = json_decode($_POST['id_key']);
$table  = json_decode($_POST['table']);
$data   = json_decode($_POST['data']);
foreach ($_POST as $k=>$v) {
  unset($_POST[$k]);
}
$rlt = array(
  'erreur' => false,
  'request' => 'none'
  ); 
$tmp = 0;
$request = 'UPDATE '.$table.' SET';
foreach ($data as $target => $value) {
  if ($tmp++>0)
    $request = $request.',';
  $request = $request.' '.$target.' = "'.$value.'"';
}
$request = $request.' WHERE '.$id_key.' LIKE "'.$id.'"';
$rlt['request'] = $request;
require('BDD_connexion.php');
if (!$rlt_bdd = mysqli_query($link, $request)){
  $rlt['erreur'] = 'Erreur: Update not done';
}
$link->close();
echo json_encode($rlt);
exit();
?>

每次我运行代码时,它都遵循相同的路径:

  • PHP执行正确
  • jQuery运行.fail()
    • jqXHR.responseText为空

我试图迫使php失败,这时,jQuery正确地运行了done(函数)。

  • PHP有一些错误
  • jQuery运行.done()
    • 警报显示php错误

我尝试过很多事情,比如强制对每个php字符串变量进行UTF8编码。我甚至试图强加一个简单的字符串,比如json_encode('hello world');

经过多次测试,似乎我以前的信息:

也许解释一下是有用的:

  • 我的javascript在一个laod()php页面中

所以它必须有一个类似的结构:

  • main.php--jQuery-->load(second.php转换为div
    • second.php--jQuery-->$.post(ajax_bdd-change.php)
    • ajax_bdd-change.php--返回$rlt->second.php(jQuery部分)

我不提它,因为我觉得它不合适。

是这个问题的原因。我尝试过从一个没有.load的新html页面通过post调用我的php,它运行得很好。

如果服务器上没有发生任何错误,那么响应代码应该是200

根据您的观察结果,响应代码很可能不是200。还要注意的是,jQuery或任何其他框架都不知道在服务器上编写的自定义代码是否一致执行。通常,对客户端的唯一指示是response code

jQuery源

我找到了一个解决方案。事实上,我的代码更复杂,jQuery .post是在jQuery DialogBox的脚本部分内的<form>.submit中完成的。因此,当有数据库查询时,表单在php响应之前完成提交。

在解决方案中,我只使用.click更改此提交,并且在收到服务器的响应时手动关闭

试试这个:

//Javascript

var params = {
    id: _id,
    id_key: id_key,
    table: table,
    data: data
};
// explicitely tells javascript you're expecting json response
// with this $.post shortcut
$.post('url', params, function(data) {
    //console.log(data)
    if (data.erreur) {
        // Error occured
    } else {
        // no error
    }
}, 'json');

//PHP

<?php
// You don't need to json_decode the $_POST data, but you can sanitize or
// perform any validation check if you want
$id = $_POST['id'];
$id_key = $_POST['id_key'];
$table = $_POST['table'];
$data = $_POST['data'];
// Your process here
echo json_encode($rlt);
exit;

希望这能有所帮助。

首先,您必须决定在AJAX查询中使用JSON,如下所示:

    $.ajax({
        url:        'http://localhost/***/ajax_bdd-change.php',
        dataType:   'json',     //EXPLICITLY SET THIS TO JSON
        cache:      false,
        type:       "POST",
        data:       {
            id          : _id,
            id_key      : id_key,
            table       : table,
            data        : data
        },
        success: function (data, textStatus, jqXHR) {
            if(data){
                alert("DATA CAME BACK AS JSON...");
                console.log(data);
                // YOU REALLY DON'T WANT TO DO THIS: $(data).text() 
                // THE .text() METHOD IS FOR THE DOM AND YOU ARE IN READING MODE TOO
                // data SHOULD CONTAIN THESE: request AND erreur
                // SO YOU CAN EITHER CHECK THE SQL OR THE ERROR LIKE SO:
                // I WOULD PREFER USING console.log(data.request)
                alert(data.request);
                alert(data.erreur);
            }
        },
        error: function (jqXHR, textStatus, errorThrown) {
            alert('Erreur: '+jqXHR.responseText);
        },
        complete: function (jqXHR, textStatus) {
            //DO SOMETHING HERE IF YOU WISH TO
        } 
    });

这是你的PHP代码:

    <?php
        $id     = isset($_POST['id'])       ? htmlspecialchars(trim($_POST['id']))      : null;
        $id_key = isset($_POST['id_key'])   ? htmlspecialchars(trim($_POST['id_key']))  : null;
        $table  = isset($_POST['table'])    ? htmlspecialchars(trim($_POST['table']))   : null;
        $data   = isset($_POST['data'])     ? htmlspecialchars(trim($_POST['data']))    : null;

        foreach ($_POST as $k=>$v) {
            unset($_POST[$k]);
        }
        $rlt    = array(
            'erreur'    => false,
            'request'   => 'none'
        );
        $updateSQL  = 'UPDATE '. $table . ' SET ';
        if($data){
            foreach ($data as $target => $value) {
                $updateSQL .= ' ' . $target . ' = "' . $value . '", ';
            }
            $updateSQL  = rtrim($updateSQL, ", ");
            // LIKE CLAUSE IS NOT SO FUNKY HERE: DO YOU WANT TO DO "EQUALS"?
            // ' WHERE ' . $id_key . ' = "' . $id. '"';
            $condition  = ' WHERE ' . $id_key . ' LIKE "' . $id. '"';
            $request    = $updateSQL . $condition;
            $rlt['request'] = $request; 
            require('BDD_connexion.php');
            if (!$rlt_bdd = mysqli_query($link, $request)){
                $rlt['erreur'] = 'Erreur: Update not done';
            }
            $link->close();
        }
        die( json_encode($rlt) );

希望这有点接近。。。