【问题标题】:How to fetch results in while loop如何在while循环中获取结果
【发布时间】:2019-04-21 08:18:51
【问题描述】:

我有以下 2 个表。

| ID | Name        | Category |
|----|-------------|----------|
|  1 | Foo bar     | 3        |
|  2 | Bar foo     | 2        |
|  3 | Baz Foo     | 3        |
|  4 | Baz Foo2    | 1        |
|  5 | Baz Foo3    | 1        |
|  3 | Baz Foo     | 1        |

| ID | Category_name |
|----|---------------|
|  1 | Cat 111       | 
|  2 | Cat 222       | 
|  3 | Cat 3333      | 

我想用计数器显示所有类别,例如:

Cat111 - 3
Cat222 - 2
Cat333 - 2

我尝试通过以下方式做到这一点,但它不起作用:

$query = mysqli_query('SELECT * FROM gallery');

while($row = mysqli_fetch_assoc($query)) {
    $query_cat = mysqli_query($conn, "SELECT * FROM `pics_cat` WHERE id = '".$row['category']."' GROUP BY category_name"); 
    $rowCat = mysqli_fetch_assoc($query_cat);
    echo $rowCat['category_name'];
    echo $rowCat['cnt'];
}

【问题讨论】:

  • 在while循环外设置一个空数组,并将结果推送到while循环内的数组中。之后,您可以使用 foreach 循环显示结果。
  • 仅供参考 mysqli_query() 需要 mysqli 连接对象作为第一个参数

标签: php mysql loops


【解决方案1】:

您没有共享表的名称,但我假设第一个是 Gallery,第二个是 pics_cat

如果您的表不会很大,我建议您使用单个连接查询来解决所有问题,这样可以简化脚本的逻辑。

$query = mysqli_query($conn, 'SELECT p.Category_name,COUNT(g.ID) AS cnt FROM `gallery` AS g LEFT JOIN `pics_cat` AS p ON p.ID = g.Category GROUP BY p.ID');

while($row = mysqli_fetch_assoc($query)) {
    echo $rowCat['Category_name'];
    echo $rowCat['cnt'];
}

如果您更喜欢在一个循环中使用 2 个查询来执行此操作,则从类别表开始然后移动到图库会容易得多

$query = mysqli_query($conn, 'SELECT * FROM `pics_cat` ORDER BY ID');

while($row = mysqli_fetch_assoc($query)) {
    $query_count = mysqli_query('SELECT COUNT(ID) AS cnt FROM `gallery` WHERE Category = '.$row['ID'].'');
    $row_count = mysqli_fetch_assoc($query_count);
    echo $row['Category_name'];
    echo $row_count['cnt'];
}

【讨论】:

  • 第二个例子会更好,在循环外创建一个准备好的语句,然后在循环中使用参数执行
  • 如果有类别在gallery 中没有条目,您可能需要使用LEFT JOIN,这样您可以返回计数为0。
  • @FunkFortyNiner 准备好的语句并非有利于安全。同一个语句准备一次并执行多次比每次执行定制查询要高效得多。此外,盲目相信数据库中的数据几乎与盲目相信用户输入一样糟糕。见《二阶SQL注入》
  • @FunkFortyNiner 是不是更快(在数据库中)一次准备并使用不同的值执行多次?
  • @AndreaOlivato mysqli_query() 仍然需要一个 mysqli $link 作为第一个参数(正如菲尔所说)。
猜你喜欢
  • 2014-06-20
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 2016-04-29
  • 2017-02-02
  • 2012-07-27
  • 1970-01-01
  • 2014-12-05
相关资源
最近更新 更多