即使php成功,jquery post .fail也是如此

时间:2016-05-02 13:42:53

标签: javascript php jquery

我的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 - &gt; load(second.php到div)      
        
    • second.php --jQuery - &gt; $.post(ajax_bdd-change.php)
    •   
    • ajax_bdd-change.php --return $rlt - &gt; second.php(jQuery part)
    •   
  •   
     

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

是这个问题的原因。我在没有.load的新html页面上通过帖子尝试调用我的php,它运行正常。

4 个答案:

答案 0 :(得分:1)

如果服务器上没有发生任何问题,响应代码应为200

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

jQuery source

答案 1 :(得分:0)

首先,您必须决定在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) );

希望这有点接近...

答案 2 :(得分:0)

试试这个:

// 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;

希望这有帮助。

答案 3 :(得分:0)

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

在解决方案中,我只使用 .click 更改此提交,并且当我从服务器返回响应时,我会手动关闭。