繁体   English   中英

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

[英]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 --return $rlt - > second.php(jQuery part)

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

是这个问题的原因。 我已经尝试通过一个没有.load的新html页面发布我的php调用,它工作得很好。

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

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

jQuery 源码

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

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

试试这个:

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

希望这可以帮助。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM