jQuery $ .ajax发布到PHP文件无法正常工作

时间:2013-07-28 18:34:18

标签: php javascript jquery ajax

所以这源于昨天的一个问题,由于错误不正常,很快就会失控。这个问题仍然存在,但问题被搁置,here,我被要求改革一个现在与当前问题有关的新问题。所以我们走了。

问题是基本的。如果你昨天在帮助我已经从$ .post切换到$ .ajax帖子,将变量传递给我的PHP文件。但是,我的PHP文件似乎永远不会收到此变量,表明索引未定义'。

现在这通常意味着变量没有值,命名不正确或发送错误。好了一整天搞乱这个(杀了我)后,我仍然认为没有理由我的PHP文件不应该收到这些数据。由于我对此很陌生,我真的希望有人能发现明显的错误或推荐另一种可能的解决方案。

这是代码

的jQuery

$('#projects').click(function (e) {
alert(aid); 
$.ajax({    
    url:'core/functions/projects.php',
    type: 'post',
    data: {'aid' : aid},
    done: function(data) {
    // this is for testing
    }
    }).fail (function() {
        alert('error');
    }).always(function(data) {
        alert(data);                                        
        $('#home_div').hide();          
        $('#pcd').fadeIn(1000);
        $('#project_table').html(data); 
    });         
});

PHP

<?php

include "$_SERVER[DOCUMENT_ROOT]/TrakFlex/core/init.php";

if(isset($_POST['aid'])) {  
    $aid = $_POST['aid'];               
    try {
        $query_projectInfo = $db->prepare("
            SELECT  projects.account_id,
                    projects.project_name,                  
                    projects.pm,    
                    //..irrelevant code      
            FROM projects
            WHERE account_id = ?                        
        "); 

        $query_projectInfo->bindValue(1, $aid, PDO::PARAM_STR);
        $query_projectInfo->execute();
        $count = $query_projectInfo->rowCount();

        if ($count > 0) {
            echo "<table class='contentTable'>";
            echo "<th class='content_th'>" . "Job #" . "</th>";
            echo "<th class='content_th'>" . "Project Name" . "</th>";
            //..irrelevant code          
            while ($row = $query_projectInfo->fetch(PDO::FETCH_ASSOC)) {                
                echo "<tr>";
                echo "<td class='content_td'>" . "<a href='#'>" . $row['account_id'] . "</a>" . "</td>";
                echo "<td class='content_td'>" . $row['project_name'] . "</td>"; 
                //..irrelevant code
                echo "</tr>";
            }
            echo "</table>";            
        }       
    } catch(PDOException $e) {
        die($e->getMessage());
    }   
} else {
    echo 'could not load projects table';
}

?>   

当我通过按&#39; #projects&#39;来运行此代码时我得到2个警报。第一个警告说“&#39; 6&#39;”,这是变量&#39;援助的价值。并且是预期的。第二个警报是空白的。

现在我感到很困惑。如果帖子的值为6,那​​么$ _POST [&#39;援助&#39;]设置?另外,如果真的不应该执行条件语句if部分而不是我的else。无论哪种方式,这让我感到奇怪。我不能从我的PHP文件中收到某些吗?

所以在Firebug我们相信,对吗?如果我打开Firebug并像这样经历 Firebug -> POST projects.php -> XHR -> POST(tab) ->
我在&#39;参数&#39;中看到了6。窗口和&#39; 6&#39;在&#39;来源&#39;窗口。然后,如果我点击“响应”&#39;和&#39; HTML&#39;标签他们都没有价值。

无论如何,文本墙是我的问题。再一次,我真的希望有人可以帮助我。我不想再把时间浪费在一个简单的解决方案上。

修改

如果我将我的php文件更改为这样

<?php

if(isset($_POST['aid'])) {  
    $aid = $_POST['aid'];
    echo $aid;
} else {
    echo 'fail';    
}

现在回复#6;&#39;!万岁!我们取得了突破!现在为什么它不会加载我的查询产生的表格?

旁注 如果我拿走

,这应该是最初注意到的
if(isset($_POST['aid'])){
//all my code
} else {
    //response
}

只需像这样硬编码变量$ aid

$aid = '6';

然后直接运行PHP文件,查询成功,页面加载动态创建的表。

同样回应其中一个要求我使用的答案

$('#projects').click(function (e) {
    alert(aid); 
    $.ajax({    
        url:'core/functions/projects.php',
        type: 'post',
        data: aid,
        success: function(data) {
        // this is for testing
        }
        }).error (function() {
            alert('error');
        }).complete (function(data) {
            alert(data);                                        
            $('#home_div').hide();              
            $('#pcd').fadeIn(1000);
            $('#project_table').html(data); 
        });     
});

我正在使用它,但我使用jQuery v1.10.2并根据this这些方法已弃用或将被弃用。无论哪种方式,结果都有0差异。

无论如何,问题是现在。为什么如果我使用简单的版本我得到回应&#39;支持我的$ aid变量&#39; 6&#39;。但是,当我尝试使用它运行查询时,我得到没有。另外请尝试记住,如果我硬编码6,表创建。

6 个答案:

答案 0 :(得分:1)

我认为这可能是错误:

data: aid,

应该是

data: {'aid':aid},

这将提供您在php页面中寻找的$ _POST ['aid']标签和值。

编辑:

如果您遇到此问题,我会对其进行简化以进行测试,这样做的主要原因不符合我的经验:

它没有到达文件

它到达文件但是文件期望与它接收的东西不同,并且由于控制结构它没有返回任何东西

它正在使用正确的数据到达文件,但是php文件中还有其他错误阻止它返回它。

在您的案例中,您可以轻松排除其中的每一项。

答案 1 :(得分:1)

ajax方法的jQuery数据参数应该是一个对象,例如{'aid': aid}。我认为这是你的问题。我还注意到你的always方法缺少数据参数。

答案 2 :(得分:1)

如果您现在正确发布数据可能问题出在您的PHP页面中? init.php包含无法更改$ _POST ['aid']的值吗?

答案 3 :(得分:1)

我不确定是否会表现得像那样,通常你会这样做:

$.ajax({
    //...
})
.done(function(data){
    //...
});

就这样做:

var fetch = true;
var url = 'someurl.php';
$.ajax(
{
    // Post the variable fetch to url.
    type : 'post',
    url : url,
    dataType : 'json', // expected returned data format.
    data : 
    {
        'aid' : aid
    },
    success : function(data)
    {
        // This happens AFTER the backend has returned an JSON array (or other object type)
        var res1, res2;

        for(var i = 0; i < data.length; i++)
        {
            // Parse through the JSON array which was returned.
            // A proper error handling should be added here (check if
            // everything went successful or not)

            res1 = data[i].res1;
            res2 = data[i].res2;
            // Do something with the returned data
        }
    },
    complete : function(data)
    {
        // do something, not critical.
    }
});

如果需要,您可以添加失败部分。无论如何,这是有保证的。我只是不熟悉做了更多关于它的评论。

答案 4 :(得分:1)

尝试

include "{$_SERVER['DOCUMENT_ROOT']}/TrakFlex/core/init.php";

导致$ _SERVER [DOCUMENT_ROOT]无法支架无法正常工作。在字符串中使用数组时,需要这些括号。

答案 5 :(得分:0)

由于某些浏览器会缓存ajax请求,因此它不会按预期响应。因此明确禁用缓存特定的ajax请求有助于使其工作。请参阅以下内容:

$.ajax({
    type: 'POST',        
    data: {'data': postValue},
    cache: false,
    url: 'postAjaxHandling.php'
}).done(function(response){
});