jQuery.ajax+php5.3-始终执行错误函数


jQuery.ajax + php 5.3 - always executing error function

(此处为Newb)我有一个PHP函数,它从服务器获取2个csv文件,并用这些文件中包含的值之间的差异创建一个新文件。这个PHP函数位于一个单独的文件test.php中,如下所示:

<?php
require_once('libs/parsecsv-for-php-master/parsecsv.lib.php');
$csv1name = $_POST['csv1'];  
$csv2name = $_POST['csv2'];
$data1 = 'data/'.$csv1name.'.csv';
$data2 = 'data/'.$csv2name.'.csv';
$csv1 = new parseCSV($data1);
$csv2 = new parseCSV($data2);
$csv = new parseCSV();
$csv->data[0] = array('label','difference');
$j = 1;
for ($i = 0; $i < count($csv1->data); $i++) {
        $csv->data[$i+1] = array($j.'d',$csv1->data[$i][$csv1name] - $csv2->data[$i][$csv2name]);
        if($i == 0) {$j += 20;}
        else {$j += 21;}
}
$csv->save('test.csv');
?>

此函数工作正常并生成预期的csv文件。我有一个JavaScript函数,它位于另一个页面(即update.html)上,并通过ajax调用前面提到的php函数:

    function callPHP() {
        $.ajax({
            type:"POST",
            url:"test.php",
            dataType:"json",
            data:{csv1: '02-01-2015', csv2: '02-12-2014'},
            error: function(requestObject, error, errorThrown) {
                alert(error);
                alert(errorThrown);
            },
        });         
    }

问题:错误函数总是执行,也就是说,每当我运行callPHP()时,我都会收到两个警报。

问:为什么总是调用error?

(额外:是否可以使用response变量?如何调试它而不必每次都将文件上传到服务器?是否可以保证在调用complete函数时,$csv->data函数已经解析?)

谢谢你的帮助!!!:D

UPDATE 1:我通过从ajax中删除complete函数来更改上面的代码,并为error函数添加了一些额外的参数。

complete无论成功与否都会被调用。所以,您正在遇到错误条件,并且在执行错误后,无论如何都会调用complete。您可以在error函数中添加额外的参数(jqXHRjqXHR、StringtextStatus、StringerrorThrown)来确定错误是什么。

尝试使用success而不是complete,并在PHP脚本中添加一个JSON答案,例如echo json_encode((object) array('success'=>true));,因为AJAX调用具有用于JSON响应的dataType:"json"参数,所以AJAX调用将尝试解析JSON。

PHP代码:

header('Content-Type: application/json');
echo json_encode((object) array('success'=>true));

AJAX:

function callPHP() {
    $.ajax({
        type:"POST",
        url:"test.php",
        dataType:"json",
        data:{csv1: '02-01-2015', csv2: '02-12-2014'},
        success: function(response) {
            alert(response);
        },
        error: function(response) {
            alert(response);
        },
    });         
}