【问题标题】:Ajax throwing fail function... But it does what it should doAjax 抛出失败函数......但它做了它应该做的事情
【发布时间】:2016-09-26 07:08:53
【问题描述】:

我的 PHP/jQuery 项目中有一个奇怪的行为。

当我调用 Ajax 请求时,它按预期工作,但不是调用“完成”函数,而是调用“失败”函数。

这是我目前的代码。

$("#form").submit(function(){

    var _this = $(this);
    var values = {};
    $.each($('#form').serializeArray(), function(i, field) {
        values[field.name] = field.value;
    });
  //  _this.button('loading');
    $.ajax({
      method: "POST",
      url: "include/ajax/install_ajax.php",
      data: values,
      dataType: 'json'
    })
      .done(function( msg ) {
        console.log( "Done: " + msg );
      })
      .fail(function(xhr, textStatus, errorThrown){
            console.warn('Xhr: ' + xhr.responseText);
            console.warn('textStatus: ' + textStatus);
            console.warn('errorThrown: ' + errorThrown);

      }); 
});

这是我的 install_ajax.php

<?php

// Chiama le funzioni del sito
require('../functions.php');

// Controlla se è una richiesta AJAX.
is_ajax();


    try {

    $args['db_host'] = $_POST['db_host'];
    $args['db_username'] = $_POST['db_username'];
    $args['db_password'] = $_POST['db_password'];
    $args['db_name'] = $_POST['db_name'];
    $args['admin_email'] = $_POST['admin_email'];
    $args['admin_username'] = $_POST['admin_username'];
    $args['admin_password'] = $_POST['admin_password'];

    $structure = 
    "-- --------------------------------------------------------

    --
    -- Struttura della tabella `users`
    --

    CREATE TABLE IF NOT EXISTS `users` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `username` text COLLATE utf8mb4_unicode_ci NOT NULL,
      `email` text COLLATE utf8mb4_unicode_ci NOT NULL,
      `name` text COLLATE utf8mb4_unicode_ci NOT NULL,
      `surname` text COLLATE utf8mb4_unicode_ci NOT NULL,
      `password` text COLLATE utf8mb4_unicode_ci NOT NULL,
      `admin` enum('0','1') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0',
      `validated` enum('0','1') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci AUTO_INCREMENT=1 ;";

    installDB($args['db_host'],$args['db_username'],$args['db_password'],$args['db_name'],$structure);

    createAdmin($args['db_host'],$args['db_username'],$args['db_password'],$args['db_name'],$args['admin_email'], $args['admin_username'], $args['admin_password']);

    createConfig($args['db_name'],$args['db_username'],$args['db_password'],$args['db_host']);
    $return = array();

    $return['success'] = true;

    return_json($return);

} catch (Exception $e) {
   error_log($e->getMessage() . "\n", 3, "/var/tmp/error.log");
}

?>

我在控制台上收到的警告消息是..

core.js:31 Xhr: undefined
core.js:32 textStatus: error
core.js:33 errorThrown: undefined

但是表'users'、配置文件和管理员用户却被创建了。

我该如何解决?

我会根据要求提供函数的代码。

【问题讨论】:

  • /var/tmp/error.log 说什么?
  • 绝对没有,没有错误被打印出来。
  • 您必须确保您确实点击了该 URL,尝试检查 Chrome 检查器中的 network 选项卡以查看响应是什么......只是为了消除 404 或类似的东西一路上..
  • 网络错误状态为:CANCELED。不过不知道是什么意思..
  • 好的,那就是jquery错误,现在看看控制台输出提交表单时有没有错误

标签: php jquery ajax post


【解决方案1】:

我认为您看到的错误是您的代码提交了 2 次.. 尝试添加此行:

$("#form").submit(function(event){
    event.preventDefault();  //prevent form from submitting, and only do ajax call
    var _this = $(this);
    // etc code..
}

现在应该可以正常工作了..

【讨论】:

  • 这很完美!如果它是 $("#button").click ,行为将是相同的吗?或者按钮上带有 preventDefault 的提交事件和普通的点击事件之间没有区别?
【解决方案2】:

试试这个

$("#form").submit(function(){
    var _this = $(this);
    var values = {};
    $.each($('#form').serializeArray(), function(i, field) {
        values[field.name] = field.value;
    });
  //  _this.button('loading');
    $.ajax({
      method: "POST",
      url: "include/ajax/install_ajax.php",
      data: values,
      dataType: 'json',
      success: function(response){
        alert(response);
      },
      error: function(error){
        alert(error);
      }
    });
});

【讨论】:

  • [对象对象]
  • echo json_encode($return) 在您的 php 中使用此代码而不是 return_json
  • 这也不起作用.. 对不起 dass.. [Object object] 一如既往地响应失败
  • 您能否检查网络元素以查看错误?
【解决方案3】:

尝试使用

返回您的输出
return json_encode($return);

而不是

return_json($return);

【讨论】:

  • 这也不行.. 抱歉 odai.. [Object object] 响应失败,和以前一样
【解决方案4】:
    In PHP
    in try 
    statement add echo json_encode(array('success'=>'1')); die;

and in Catch statement add echo json_encode(array('failed'=>'1')); die;


    replace your jquery submit code with below

    $("#form").submit(function(submitEvent){
        submitEvent.preventDefault();
        var _this = $(this);    
      //  _this.button('loading');
        $.ajax({
          method: "POST",
          url: "include/ajax/install_ajax.php",
          data: _this.serializeArray(),
          dataType: 'JSON',
          success: function(response){
            console.log(response);
          },
          error: function(error){
            console.warn(error);
          }
        });      
    });

and check browser console

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    相关资源
    最近更新 更多