PHP文件接收带有奇怪行为的jQuery AJAX帖子

时间:2013-07-28 19:54:22

标签: php javascript jquery ajax

所以这源于昨天的一个问题,由于错误不正常,很快就会失控。这个问题仍然存在,但问题被搁置,here,我被要求改革一个现在与当前问题有关的新问题。然后我问了一个问题here,然后事情很快就摆脱了主题。我决定接受解决原始问题并继续前进的答案。我现在相信我们已将问题缩小到一个非常具体的问题。

这个问题现在对我有意义。我有以下代码

的jQuery

$('#projects').click(function (e) {
$.trim(aid);
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]/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';
}

?>   

当我通过按'#projects'运行此代码时,我收到2个警报。第一个警报显示'6',这是变量'aid'的值,并且是预期的。第二个警报是空白的。

现在我在这里得到了非常的困惑。如果我通过将PHP文件更改为此类

来简化问题并找到问题的根源
<?php

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

响应现在为'6'!这意味着该文件正在接收我的$ _POST ['aid']变量并在PHP内正确设置它。现在,如果我更改代码,我再也收不到任何内容。

但是,如果我将原始PHP文件更改为此

<?php

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

    $aid = '6';             
    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());
    }    
?> 

然后直接运行PHP文件,查询成功,页面加载动态创建的表。这让我的头旋得太厉害了,我想呕吐。

所以在审查中。辅助变量设置为6,毫无疑问。如果我简化我的PHP文件,它会收到$ _POST ['aid']变量,获取数据,设置PHP $ aid变量并回显它。但是,如果我尝试将其插入到我的查询中以使我的桌子充气,我会得到没有。现在,如果我将PHP文件更改为而不是依赖于$ _POST ['aid']变量,它就可以正常工作。那么到底是怎么回事? PHP文件在没有帖子和帖子的情况下工作,没有表格膨胀查询。

我真的希望有人可以帮助我解决这个问题因为我完全迷失了

修改

我改变了我的php文件进行测试。它现在看起来非常像这样。对不起墙

<?php

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

    if(isset($_POST['aid'])) {  
        $aid = $_POST['aid'];
            echo $aid;      
        try {
            $query_projectInfo = $db->prepare("
                SELECT  projects.account_id,
                        projects.project_name,                  
                        projects.pm,    
                        projects.apm,
                        projects.est_start,
                        projects.est_end,
                        projects.contact,                   
                        projects.trips,
                        projects.tasks,
                        projects.perc_complete,
                        projects.bcwp,
                        projects.actuals,
                        projects.cpi,
                        projects.bcws,
                        projects.bac,
                        projects.comments,
                        projects.status,
                        projects.project_revenue,
                        projects.profit_margin,
                        projects.pm_perc,
                        projects.audited         
                FROM projects
                WHERE account_id = ?                        
            "); 

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

                echo "<table class='contentTable'>";
                echo "<th class='content_th'>" . "Job #" . "</th>";
                echo "<th class='content_th'>" . "Project Name" . "</th>";
                echo "<th class='content_th'>" . "PM" . "</th>";
                echo "<th class='content_th'>" . "APM" . "</th>"; 
                echo "<th class='content_th'>" . "Est. Start" . "</th>";
                echo "<th class='content_th'>" . "Est. End" . "</th>";
                echo "<th class='content_th'>" . "Contact" . "</th>";
                echo "<th class='content_th'>" . "Trips" . "</th>";
                echo "<th class='content_th'>" . "Tasks" . "</th>";
                echo "<th class='content_th'>" . "% Complete" . "</th>";
                echo "<th class='content_th'>" . "BCWP" . "</th>";
                echo "<th class='content_th'>" . "Actuals" . "</th>";
                echo "<th class='content_th'>" . "CPI" . "</th>";
                echo "<th class='content_th'>" . "BCWS" . "</th>";
                echo "<th class='content_th'>" . "BAC" . "</th>";
                echo "<th class='content_th'>" . "Comments" . "</th>";
                echo "<th class='content_th'>" . "Status" . "</th>";
                echo "<th class='content_th'>" . "Project Revenue" . "</th>";
                echo "<th class='content_th'>" . "Profit Margin" . "</th>";
                echo "<th class='content_th'>" . "PM%" . "</th>";
                echo "<th class='content_th'>" . "Audited" . "</th>";

                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>";
                    echo "<td class='content_td'>" . $row['pm'] . "</td>";
                    echo "<td class='content_td'>" . $row['apm'] . "</td>";
                    echo "<td class='content_td'>" . $row['est_start'] . "</td>";
                    echo "<td class='content_td'>" . $row['est_end'] . "</td>";
                    echo "<td class='content_td'>" . $row['contact'] . "</td>";
                    echo "<td class='content_td'>" . $row['trips'] . "</td>";
                    echo "<td class='content_td'>" . $row['tasks'] . "</td>";
                    echo "<td class='content_td'>" . $row['perc_complete'] . "</td>";
                    echo "<td class='content_td'>" . $row['bcwp'] . "</td>";
                    echo "<td class='content_td'>" . $row['actuals'] . "</td>";
                    echo "<td class='content_td'>" . $row['cpi'] . "</td>";
                    echo "<td class='content_td'>" . $row['bcws'] . "</td>";
                    echo "<td class='content_td'>" . $row['bac'] . "</td>";
                    echo "<td class='content_td'>" . $row['comments'] . "</td>";
                    echo "<td class='content_td'>" . $row['status'] . "</td>";
                    echo "<td class='content_td'>" . $row['project_revenue'] . "</td>";
                    echo "<td class='content_td'>" . $row['profit_margin'] . "</td>";
                    echo "<td class='content_td'>" . $row['pm_perc'] . "</td>";
                    echo "<td class='content_td'>" . $row['audited'] . "</td>";
                    echo "</tr>";

                }
                echo "</table>";                
        } catch(PDOException $e) {
            die($e->getMessage());
        }   
    } else {    
        echo 'could not load projects table';
    }

    ?>

我在浏览器中收到的回复现在是

6<table class='contentTable'><th class='content_th'>Job #</th><th class='content_th'>Project Name</th><th class='content_th'>PM</th><th class='content_th'>APM</th><th class='content_th'>Est. Start</th><th class='content_th'>Est. End</th><th class='content_th'>Contact</th><th class='content_th'>Trips</th><th class='content_th'>Tasks</th><th class='content_th'>% Complete</th><th class='content_th'>BCWP</th><th class='content_th'>Actuals</th><th class='content_th'>CPI</th><th class='content_th'>BCWS</th><th class='content_th'>BAC</th><th class='content_th'>Comments</th><th class='content_th'>Status</th><th class='content_th'>Project Revenue</th><th class='content_th'>Profit Margin</th><th class='content_th'>PM%</th><th class='content_th'>Audited</th></table>

这意味着两件事。正在传递和设置辅助变量。但是当我在查询中运行它时失败了。但如果我把$ aid ='6';然后绑定援助作为其工作的价值。

为什么?

第二次编辑

因此,在其他人的帮助下,我们发现这是js错误而不是php错误。变量在js中被设置为6,但它有一些隐藏的字符,我想我找到了它们。当我看到萤火虫时,我将此视为来源

aid=%0D%0A6

应该是换行权吗?我认为这就是造成错误的原因。

这就是我得到援助的方式

var title;
var aid;
$(".sa").click(function (e) {
    title = $(this).text();
    $.post('core/functions/getAccountId.php', { 
        title: title              
    })
    .done(function(data) {
        aid = data;     
        $("#acc_title").html(title);    
        $('#accountsSelectDiv').hide();
        $('#acc_home').fadeIn(1000);
        $('#home_div').show();      
    })
    .fail(function(jqXHR, status, error) {
        alert(error);
    });     
});

这可能是因为我如何得到它,我不知道。如何删除源中的额外字符?这就是我认为的问题是

2 个答案:

答案 0 :(得分:1)

*编辑*

虽然这是公认的答案,但从某种意义上说它与真正的解决方案无关。这是评论的问题,包括这里和问题的评论,最后是来自JS文件的字符串中的CR / NL(“\ r \ n”)组合,该文件从另一个PHP文件读取......你明白了。 “如果发生奇怪的事情,请检查隐藏的字符!”


我现在没时间,星期天晚上10点工作!但..

如果我理解,这是你的问题:

定义数据时:{'aid':aid}援助尚未定义!

不要因为$('#projects').click(function (e) { alert(aid);之前的事实而感到困惑。单击时会调用它,因此在定义辅助时可以执行它。虽然{'aid':aid}在解析代码时获取了援助的价值,但如果没有在其上定义援助,则它将是未定义的。

如果您之前使用aid="hello";,则点击脚本会看到它有用,或者至少会显示“你好”。

你必须小心JQuery和Ajax以及回调。准确地考虑一切都在什么时候执行,不要依赖“写在上面=先执行”。

希望这是你的问题,你可以解决它,g'nite ..:)

还有一件事......一个解决方案是在点击处理程序中准备Ajax内容。

$(“..”)。click(){       //在这里准备东西       // {'aid':aid}这里定义了援助    }

答案 1 :(得分:0)

这可能无效但请尝试更改:

type: 'post',

type:'POST',

如果它区分大小写,则它不会识别它并默认为$ _GET,这可以解释为什么寻找$ _POST ['aid']无效。