【问题标题】:Storing Data into PHP Array将数据存储到 PHP 数组中
【发布时间】:2012-07-19 21:29:58
【问题描述】:

total_stars这里是代码,它是我尝试要做的最好的解释:

$total_stars = array();
$query = "SELECT items_id FROM items";
$result = mysql_query($query);

while ($row = mysql_fetch_array($result)) {
    $item_id = $row['items_id'];
    $sql = "Select Count(item_id) FROM ratings WHERE item_id = '{$item_id}'";
    $result = mysql_query($sql);
    $total_stars[] = mysql_fetch_array($result);
}

//  To see the output by entering the URL I want to print_r  
print_r($total_stars);

// In the end, I am trying to JSON encode this and will later output in Java for Android
print(json_encode($total_stars));

(为了不混淆,items_id在items表中,item_id(没有's')在ratings表中)

现在用简单的英语:

我正在遍历 items 表中的每一行。当我这样做时,在每个循环中,我指的是另一个名为“评分”的表,并计算该项目有多少评分。

例如,我希望数组看起来像(65、43、55、43 等)。当然是样本数。但每个都代表表中每个项目的评分总数。如何让 print__r 在循环内显示 SQL 语句的结果?

尝试使用联接的更新代码:

$query = "SELECT items_id FROM items";

$q = 'SELECT 
    items.items_id, 
    COUNT(ratings.item_id) AS rate 
    FROM `items`
    LEFT JOIN ratings ON (ratings.item_id = items.items_id)
    GROUP BY items_id';
$result = mysql_query($q);

while ($row = mysql_fetch_array($result)) {

    $total_stars = mysql_fetch_array($result);

}

print_r($total_stars);

print_r 输出: 数组([0] => 783 [items_id] => 783 [1] => 0 [rate] => 0)

【问题讨论】:

  • 您应该考虑改用连接查询。

标签: php mysql arrays while-loop


【解决方案1】:
$total_stars = array();
while ($row = mysql_fetch_array($result))
{
    $item_id = $row['items_id'];
    $sql = "Select Count(item_id) FROM ratings WHERE item_id = '{$item_id}'";
    $result = mysql_query($sql);
    $row = mysql_fetch_row($result);
    $total_stars[] = row[0];
}

应该这样做。

不要忘记 mysql_fetch_array 返回一个带有列索引的数组。所以 mysql_fetch_array($result) 将是一个你想要第一个元素的数组(来自 MySQL 函数 COUNT()),而不是计数本身。

但正如我在评论中所说,请改用连接查询。您将对 mysql 服务器的查询量从第一个查询中的行数+1(可能很多!)减少到只有一个,这是一个巨大的改进。

更新:以下是使用连接查询(Sven 查询)的方法:

$q = 'SELECT 
    items.items_id, 
    COUNT(ratings.item_id) AS rate 
    FROM `items`
    LEFT JOIN ratings ON (ratings.item_id = items.items_id)
    GROUP BY items_id';
$result = mysql_query($q);

$total_stars = array();
while ($row = mysql_fetch_array($result))
{
    $total_stars[] = $row['rate']; // Stars count is stored in $row['rate']
    echo "Item id ".$row['items_id']." has rating ".$row['rate'];

}

【讨论】:

  • 嘿,谢谢...但是,我刚刚意识到我交叉了一些代码。我在下面描述的与我在上面尝试做的不同。在代码中,我得到了单个 items_id 的评分。我想要做的是遍历每个项目行并参考评级表并计算与第一个表行的 items_id 匹配的相应评级。我稍微调整了第一个查询以使其更符合我所说的。所以我希望它转到 items_id 1 并计算具有该 ID 的总评分,然后到 items_id 2 等 - 并将结果存储在数组中
  • 我很确定这就是它的作用,你试过了吗?它在循环的每次迭代中获取单个 item_id 的评分,是的并将其存储在数组中,因此最终它将适用于您的第一个查询中的每个项目。
  • 我正在检查它......会让你知道......现在我用 print_r 'Array ( [0] => 29 )' 得到这个,不确定它来自哪里。我可以告诉你一个事实,我有 30 多个项目,并且预计数组中有大约 30 个数字(每个都是项目的总评分)。
  • 我刚刚确认了;项目 1 有 29 个评分。所以它不会遍历 30 多行中的每一行并将总计放入 Array。
  • 您尝试了我的更新还是旧帖子?否则我不确定。通过在循环内放置一个回显以进行调试,检查循环迭代的次数。如果它只回显一次,则不能有 30 个项目。
【解决方案2】:

为什么不使用 cmets 中建议的 JOIN?如果您想要一个包含所有项目评分的数组,那么这是一种方法(没有测试 PHP db 代码,但我确实测试了查询)。

$total_stars = array();

$q = 'SELECT 
        items.item_id,
        COUNT(ratings.item_id) AS rate 
      FROM `items`
      LEFT JOIN ratings ON (ratings.item_id = items.item_id)
      GROUP BY item_id';
$result = mysql_query($q);

$total_stars = mysql_fetch_array($result);

您应该改用 MYSQLi 或 PDO_MYSQL。 more info MYSQLi, more info PDO

您可以在此处找到有关 JOINS 的更多信息:Info about MYSQL joins

【讨论】:

  • 你真的需要 GROUP BY 语句吗?因为 COUNT() 无论如何,每个项目只给你一行。还是我错了?
  • 我试过这个方法,这就是我得到的 Array ( [0] => 1 [items_id] => 1 [1] => 29 [rate] => 29 ) - 仍然没有设法遍历每一行。仅获取第 1 行的总评分。将更新代码。
  • 你不应该只是复制这样的代码,你应该了解它的作用,这不会是一个问题。这个查询应该在顶部,并且循环中根本不应该有任何查询。
  • 再次编辑代码并输出。现在它显示了 783 个项目。实际上,我以前从未使用过 JOIN 语句。我正在努力理解它,并通过我在复制时得到的结果来理解它。是的,理想情况下,我会研究它然后应用它。我现在没有那种奢侈。但我真的很感谢你的帮助。
  • @MrAzulay 是的,您确实需要GROUP BY。由于JOIN LEFT,该查询还将返回在ratings 中找到的行。我们希望每个项目有 1 行,因此通过使用 GROUP BY 我们删除所有双打。 @KickingLettuce 我用给定数据的副本测试了查询。查询将返回正确的结果。这段代码的 sn-p 设置了 $total_stars 变量。如果要循环遍历每个项目的所有总星数,则循环遍历代码后的$total_stars,即foreach($total_stars as $stars) { .. }
猜你喜欢
  • 2016-07-10
  • 2019-11-27
  • 2021-04-27
  • 2022-10-17
  • 2016-07-17
  • 2012-01-13
  • 2013-08-14
  • 1970-01-01
  • 2015-01-18
相关资源
最近更新 更多