2

我收到一个非常不言自明的错误。然而,据我所知,索引不仅是 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。我已经去了这里,检查错误,它与我想象的完全一样。这并不意味着为什么我得到它对我来说更有意义。

所以让我们回顾一下。我的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'
1 个警报框在使用 $aid 变量 '6' 再次接收数据
后触发 1 个警报框在现在使用 php 接收数据后触发响应又是“6”!

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

萤火虫

在萤火虫我看到

我看到 POST ->
projects.php ->
POST ->
PARAMETERS ->
aid 6 ->
SOURCE ->aid=%0D%0A6
RESPONSE ->

响应中没有任何内容,我在这里发布响应的短暂时间是因为我关闭了“require_once”并且我的代码被注释掉了。

不过,源代码中有一些奇怪的东西。它说 SOURCE aid=%0D%0A6 而不是正常的 SOURCEaid = 6

第二次编辑

我注释掉了一大段代码来简化这个例子。该代码使用变量和查询的数据。然后返回在 中创建的表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 -> NET -> XHR -> HTML 中看到这个表。我还可以在 FireBug -> NET -> XHR -> RESPONSE 中看到所有 php 代码。然而,应该保存表的 div 只保存else语句“无法加载项目表”。所以我想我越来越近了,但我仍然卡住了。有任何想法吗?

4

1 回答 1

1

POST -> aid 6表明服务器确实在接收数据。在到达语句之前的某个时间点,其他东西正在清除 $_POST 。if

当您require_once "$_SERVER[DOCUMENT_ROOT]/core/init.php";注释掉时,您的 jQuerydata包含预期值。当您发布 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(回车 + 换行)

于 2013-07-27T23:16:34.447 回答