1

所以这源于昨天的一个问题,由于错误不寻常,该问题迅速失控。这个问题仍然存在,但问题被搁置了,在这里,我被要求修改一个现在与当前问题相关的新问题。所以我们开始吧。

这个问题本质上是基本的。如果您昨天提供帮助,我已经从 $.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';
}

?>   

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

现在这是我感到困惑的地方。如果正在发送值为 6 的帖子。$_POST['aid'] 不是设置了吗?此外,如果这是真的,我的代码不应该执行if我的条件语句的一部分不是我的else?。不管怎样,这让我觉得很奇怪。我不应该从我的文件中收到一些东西吗?PHP

所以我们信任 Firebug,对吗?如果我打开 Firebug 并像这样通过,
Firebug -> POST projects.php -> XHR -> POST(tab) ->
我会在“参数”窗口中看到 6,在“源”窗口中看到“6”。然后,如果我单击“响应”和“HTML”选项卡,它们都没有任何价值。

所以无论如何,那堵文字墙是我的问题。再说一次,我真的希望有人可以在这里帮助我。我不想再浪费时间在应该是一个简单的解决方案上。

编辑

如果我将我的 php 文件更改为如下所示

<?php

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

响应现在是“6”!万岁!我们取得了突破!现在为什么它不加载我的查询产生的表?

旁注 如果我拿走

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,根据这个,这些方法已经或将被弃用。无论哪种方式,结果都是0差异。

无论如何,问题是现在。如果我使用简单版本,为什么会回显我的 $aid 变量“6”。但是,当我尝试用它运行查询时,我什么也得不到。另外请尽量记住我是否对表格创建的 6 进行了硬编码。

4

6 回答 6

2

我认为这可能是错误:

data: aid,

它应该是

data: {'aid':aid},

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

编辑:

如果您遇到问题,我会简化它以进行测试,根据我的经验,这样的事情不起作用的主要原因是:

它没有到达文件

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

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

在您的情况下,您可以轻松地排除其中的每一个。

于 2013-07-28T18:39:28.967 回答
1

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

于 2013-07-28T18:39:52.150 回答
1

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

于 2013-07-28T18:51:34.560 回答
1

我不确定 done 是否应该表现得像那样,通常你使用 done 像这样:

$.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.
    }
});

如果需要,您可以添加失败部分。无论如何,这可以保证工作。我只是对 done 不够熟悉,无法对此发表更多评论。

于 2013-07-28T18:54:06.580 回答
1

尝试

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

而是导致 $_SERVER[DOCUMENT_ROOT] 没有括号将不起作用。当您在字符串中使用数组时,您需要这些括号。

于 2013-07-28T18:54:08.167 回答
0

由于某些浏览器会缓存 ajax 请求,因此它不会按预期响应。因此,显式禁用特定 ajax 请求的缓存有助于使其正常工作。参考以下:

$.ajax({
    type: 'POST',        
    data: {'data': postValue},
    cache: false,
    url: 'postAjaxHandling.php'
}).done(function(response){
});
于 2018-05-08T16:56:56.157 回答