【问题标题】:jquery post .fail even when php succeedjquery post .fail 即使 php 成功
【发布时间】:2016-08-27 07:21:11
【问题描述】:

我的 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(function)。

  • 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 --return $rlt -->second.php(jQuery 部分)

我没有提到它,因为我觉得它不相关。

是这个问题的原因。我已经尝试从一个没有.load 的新 html 页面通过邮寄方式调用我的 php,它运行良好。

【问题讨论】:

  • 你想在你的失败回调中检查textStatus
  • 我尝试检查错误,因为我不明白为什么我总是运行fail()function。我只是尝试textStatus 它包含error
  • 我建议不要直接使用 $_POST 变量构建动态查询,除非您明确定义id_keytable中允许的值,以及实际使用 mysqli 使其有价值 - 用于 SQL 注入预防的数据绑定/准备语句。该脚本原样非常危险。绑定见这里:php.net/manual/en/mysqli-stmt.bind-param.php
  • 您的建议似乎会产生影响...我发现一切正常,但是当我添加 mysqli_query($link, $request) 时,它开始没有错误。
  • “Nate I”我的$_POST是明确定义的,大部分不是用户给出的,而是代码直接传输的数据。

标签: javascript php jquery


【解决方案1】:

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

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

jQuerysource

【讨论】:

  • 实际上我的状态响应码是0 所以这意味着我没有响应?如果正确执行 php,这怎么可能? (也许不是,但我的数据库已正确更新...如果我在执行此代码后执行另一个代码...)
  • 用 jquery 中的源更新了我的答案,其中条件基于responsecode
  • 听起来,在PHP中,你必须直接设置响应头;以这篇文章中描述的方式:stackoverflow.com/questions/3258634/…
  • 我只是在die(json_encode(...)); 之前尝试http_response_code(200); 但这没有影响。它必须以其他方式添加?
  • 检查你的配置文件,必须是你正在使用的代码之外的东西......
【解决方案2】:

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

在解决方案中,我只用一个 .click 更改了这个提交,当我收到来自服务器的响应时,我手动关闭。

【讨论】:

    【解决方案3】:

    试试这个:

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

    希望这会有所帮助。

    【讨论】:

    • 对不起,我错过了我所有的变量在那之前都是JSON.stringify
    • 我试试你的javascript,然后放一个` echo json_encode('ok'); exit();` 但没有附加任何内容...它在 fail() 中运行
    • 如果你只放 echo json_encode('ok') ,它不会工作,因为 javascript 需要一个结构为 {erreur: boolean, request: '...'} 的对象。您可以在 PHP 中使用 echo json_encode(['erreur' =&gt; true]); exit; 进行测试。
    • 我不确定我是否理解您的问题。如果您的 php 仅包含 echo json_encode(['erreur' =&gt; true]); exit;,则 javascript 应执行 if (data.erreur) { ... } 部分。也许您可以发布您的完整脚本(js 和 php),以便我们更好地了解发生了什么
    • 是的,这仅适用于 echo json_encode(['erreur' =&gt; true); exit;
    【解决方案4】:

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

    希望这有点接近......

    【讨论】:

    • 我尝试您的更正,但同样的事情附加: - PHP 正确执行 - jQuery 运行 error()responseText 是空的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2013-02-09
    • 1970-01-01
    • 2011-04-04
    • 2011-08-05
    • 2013-04-18
    • 1970-01-01
    相关资源
    最近更新 更多