PHP while while循环中的循环工作一次

时间:2012-10-14 10:00:13

标签: php mysql

我有两个查询发送到数据库带回帖子(op_ideas 16 cols),然后是另一个持有每个帖子的投票数(op_idea_vote cols 4)和匹配的idea_id

数据示例:

查询:op_ideas:

  

[{“idea_id”:“2211”,“author_id”:“100000”,“date”:“2012-09-06   10:02:28“,”idea_title“:”另一个测试“,”4“等等

查询:op_idea_votes:

  

idea_id = 2211,同意= 3,不同意= 1,弃权= 0

下面的代码应该查看op_ideas,然后在op_ideas_vote上循环,直到它在'idea_id'下找到匹配项。然后它转到op_ideas下的下一条记录,再次使用该idea_id在op_idea_vote列表中搜索它,找到匹配项,并将其添加到数组中。

这仅适用于第一条记录,而不适用于其他三条记录。我正在测试,所以每个行中有3行与idea_id相匹配,op_idea_vote中的结果不同。

$votes = mysql_query($commentVotes);

$result = mysql_query($gl_query);

while ($gce_result = mysql_fetch_array($result)) {
    $voteid = $gce_result['idea_id'];

    while($allvotes= mysql_fetch_array($votes)) {
        if($voteid = $allvotes['idea_id']) 
        {
        //echo $voteid . " main idea and the votes: " . $allvotes;
            $gce_result["agree"] = $allvotes['agree'];
            $gce_result["disagree"] = $allvotes['disagree'];
            $gce_result["abstain"] = $allvotes['obstain'];
        } 
        else 
        {
            $gce_result["agree"] = 0;
            $gce_result["disagree"] = 0;
            $gce_result["abstain"] = 0;
        }
        //print_r($gce_result);
    }
    $data_result[] = $gce_result;
}

echo json_encode($data_result);

如果我使用print_f(&gce_result),它在phpfiddle中工作正常。但是当我使用上面的代码时,它适用于第一个记录,但它完全没有第二个记录。它似乎缺少第二个,因为它甚至没有给我0 0 0的结果。

查询op_ideas:

$gl_query = "SELECT DISTINCT * FROM heroku_056eb661631f253.op_ideas INNER JOIN op_organs ORDER BY date ASC;";
if (!mysql_query($gl_query)) {
    die('Error: ' . $gl_query . " " . mysql_error());
}
$result = mysql_query($gl_query);

查询op_idea_vote:

$commentVotes = "SELECT v.idea_id, COUNT(v.agree = 1 or null) as agree, COUNT(v.disagree =   1 or null) as disagree, COUNT(v.obstain = 1 or null) as obstain FROM op_idea_vote v GROUP BY  v.idea_id";
if (!mysql_query($commentVotes)) {
    die('Error: ' . $commentVotes . " " . mysql_error());
}
$votes = mysql_query($commentVotes);

3 个答案:

答案 0 :(得分:1)

您只能扫描一次资源。 所以内心的时间只会运行一次。

答案 1 :(得分:0)

使用==代替=来检查if&的条件while 在while循环中,你必须分配$ allvotes的值,但你从未分配过,

while ($gce_result == mysql_fetch_array($result)) {
    $voteid = $gce_result['idea_id'];

    while($allvotes== mysql_fetch_array($votes)) {
        if($voteid == $allvotes['idea_id']) 
        {
        //echo $voteid . " main idea and the votes: " . $allvotes;
            $gce_result["agree"] = $allvotes['agree'];
            $gce_result["disagree"] = $allvotes['disagree'];
            $gce_result["abstain"] = $allvotes['obstain'];
        } 
        else 
        {
            $gce_result["agree"] = 0;
            $gce_result["disagree"] = 0;
            $gce_result["abstain"] = 0;
        }
        $data_result[] = $gce_result;
    }

}

答案 2 :(得分:0)

您的问题是尝试不止一次扫描$ votes结果。

您应首先存储该查询的结果。

例如

while ($vote = mysql_fetch_array($votes)) {
    $allvotes['idea_id'] = $vote;
}

while ($gce_result = mysql_fetch_array($result)) {
    $voteid = $gce_result['idea_id'];
    if (array_key_exists[$voteid, $allvotes]) {
       //assign results
    } else {
       //default
    }
}

另一种选择是使用连接进行查询,因此您可以在一个查询中执行所有操作。然后只是循环结果。