从jQuery接收$ .post时索引是否未定义?

时间:2013-07-27 22:26:25

标签: php javascript jquery

我得到一个非常自我解释的错误。但是,就我所知,索引不仅是100%定义的,它还包含一个值。这是一系列愚蠢问题中的最新一例,这让我今天感到疯狂。

以下是您可能已经看过一百万次的代码。

的jQuery

$('#projects').click(function (e) {
    alert(aid); 
    $.post('core/functions/projects.php', { aid: aid })
    .done(function(data) {
        alert(aid);             
        $('#home_div').hide();      
        $('#pcd').fadeIn(1000);     
    })
    .fail(function(jqXHR, status, error) {
        alert(error);
    }); 
});

使用6

的值提醒我两次

PHP

<?php
require_once "$_SERVER[DOCUMENT_ROOT]/core/init.php";
if(isset($_POST)) {             
    $aid = $_POST['aid'];
    echo $aid;
} else {
    echo 'fail';
}
?>

我收到此错误:

Notice: Undefined index: aid in C:\xampp\htdocs\core\functions\projects.php on line 5

所以我添加了一些更深入的检查我的if else,它现在看起来像这样

<?php
require_once "$_SERVER[DOCUMENT_ROOT]/core/init.php";
$account_id;
if(isset($_POST['aid'])) {          
    $aid = $_POST['aid'];
    echo $aid;
} else {
    echo 'fail';
}

现在它吐回fail。我已经去了here,检查错误,它就像我想象的那样。这并不意味着它对我来说更有意义为什么我正在接受它。

所以让我们回顾一下。我的jQuery正在点击正确的PHP文件,因为我收到了该特定PHP文件的回复。我的变量保存一个值,因为jQuery使用它保存的值6提醒我两次。但是我的PHP文件没有收到此值?有人可以向我解释原因吗?

修改

如果我在jQuery添加一行,我会收到另一条消息,证明正在发送数据。然而,我仍然收到未设置$ _POST索引的错误。这太疯狂了

$('#projects').click(function (e) { 
    alert(aid); 
    $.post('core/functions/projects.php', { aid: aid })
    .done(function(data) {  
        alert(aid);
        alert(data);            
        $('#home_div').hide();      
        $('#pcd').fadeIn(1000);     
    })
    .fail(function(jqXHR, status, error) {
        alert(error);
    }); 
}); 

现在我得到3个警告框,其值为6。

在发送帖子之前发出1个警告框,其中$ aid变量信息为'6' 使用$ aid变量'6'再次接收数据后,将触发1个警报框 现在收到数据后,1个警报框会被激活,同时再次显示“6”!

我的意思是WTF?这场噩梦会不会结束?这意味着即使php中的变量也是从帖子设置的!这怎么可能?我的意思是看php代码所有它回声是'失败'或$ aid和$援助不能有一个值,除非它由帖子设置,而且它不会给我错误的未定义索引。我需要休息一下,我会失去它。

萤火

在萤火虫中我看到了

我看到POST - &gt;
projects.php - &gt;
POST - &gt;
参数 - &gt;
援助6 - &gt;
消息来源 - &gt;援助=%0D%0A6
响应 - &gt;

回复中没有任何内容,我在这里发布回复的短暂时间是因为我离开了'require_once'并且我的代码被注释掉了。

虽然源中有些奇怪的东西。它表示SOURCE援助=%0D%0A6而不是正常的SOURCE援助= 6

2ND EDIT

我有一大段代码被注释掉以简化这个例子。代码使用变量和查询数据。然后返回在php中创建的表。如果取消注释代码,我可以在我的RESPONSE中以html格式看到该表。如果我转到HTML,我实际上可以看到可视表。发生什么了?为什么这种反应会使我的div而不是表格膨胀?我现在将发布一些代码来解释

<?php
require_once "$_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,    
                    //...more columns    
            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>";              
            //...more table headers      
            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>";                
                         //.. more data 
                echo "</tr>";
            }
            echo "</table>";            
        }       
    } catch(PDOException $e) {
        die($e->getMessage());
    }   
} else {
    echo 'could not load projects table';
}

?>    

因此,您可以看到我的完整php文件实际上发回了一个数据表。我可以在FireBug中看到这个表 - &gt; NET - &gt; XHR - &gt; HTML。我还可以看到FireBug中的所有php代码 - &gt; NET - &gt; XHR - &gt;响应。但是,应该保存表的div只保存else语句“无法加载项目表”。所以我觉得我越来越近了,但我还是被卡住了。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

POST -> aid 6表明服务器确实正在接收数据。还有其他东西在到达if语句之前清除$ _POST。

当您require_once "$_SERVER[DOCUMENT_ROOT]/core/init.php";注释掉时,您的jQuery data包含预期值。当您发布Firebug信息时,它仍然被注释掉,因此数据库连接错误消息。这些消息,你已经删除,表明projects.php第7行的错误告诉我你测试的文件的代码比你在这里发布的代码多。人们向我们展示他们的部分代码并不罕见,事实上,它是鼓励的;但是,在这种情况下,这是有问题的,因为错误不在于你给我们的代码。

为了验证此发现并保存您的理智,请将 projects.php 暂时重命名为 projects.backup.php 。 创建一个名为“projects.php”的新文件,并通过AJAX运行以下代码(以及以下代码):

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

顺便提一下,%0D%0A是Windows®换行组合,CRLF(回车+换行)