【问题标题】:PHP / MySQL: Display all rows matching specific value in columnPHP / MySQL:显示与列中特定值匹配的所有行
【发布时间】:2017-03-31 15:05:09
【问题描述】:

已解决
Sloan Trasher's answer 效果很好。我添加了另一组 if 语句来检查 subcat_id 并在相应的之前打印正确的标题。

if($curr_sub_cat != $row['subcat_id']) {
  if($curr_sub_cat != '') {
    echo "</div>\n";
  }
  $curr_sub_cat = $row['subcat_id'];
  if($curr_sub_cat == '1') {
    echo "<h1 class='anchor' id='smartphones'>Smartphones</h1>";
    echo "<div class='flexed-boxes'>\n";
  }
  if($curr_sub_cat == '2') {
    echo "<h1 class='anchor' id='tablets'>Tablets</h1>";
    echo "<div class='flexed-boxes'>\n";
  }
}

原始问题
我有一个看起来像这样的数据库表:

dev_id dev_name cat_id subcat_id
1 苹果 iPhone 6 1 1 2 苹果 iPhone 6s 1 1 3 苹果 iPad 空气 1 2

dev_id 是主键,cat_id 因品牌而异(Apple = 1,Samsung = 2 等),subcat_id 表示如果设备是手机 (1) 或平板电脑 (2)。

我想在一个带有 Smartphones 标题的列表中回显一个品牌的所有设备,这些设备已分配了 subcat_id == 1subcat_id == 2 列所在的所有行都需要放在带有标题 Tablets 的列表下方的列表中。两个列表都需要按主键升序排序。

像这样使用PDO::FETCH_GROUPPDO::FETCH_COLUMN

 $sql = "SELECT subcat_id,dev_id FROM devices WHERE cat_id='$cat_id' ORDER BY dev_id";
 $data = $db->query($sql)->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_COLUMN);

很好地使用所有(在本例中为 Apple)设备打印数组:

Array
(
[0] => Array
    (
        [0] => 1
        [1] => 2
        [2] => 3
        [3] => 4
        [4] => 5
        [5] => 6
        [6] => 7
        [7] => 8
        [8] => 9
        [9] => 10
        [10] => 11
        [11] => 12
    )

[1] => Array
    (
        [0] => 13
        [1] => 14
        [2] => 15
        [3] => 16
        [4] => 17
        [5] => 18
    )
)

如果我按如下方式实现 for 循环:

 $cat_name_lower=strtolower($cat_name);
 $dev_name_ul=str_replace(array("$cat_name "," "),array("","_"),$row_all_dev['dev_name']);

 foreach ($data as $dev => $dev_data)
 {
   echo "<div class='flexed-boxes'>
        ";
     foreach ($dev_data as $row)
     {
       echo "<a class='singlebox trpl' href='/devices/".$cat_name_lower."/smartphone_details.php?dev_name=".$dev_name_ul."'>
              <img class='singlebox-media' src='".$cat_name_lower."/img/".$row_all_dev['dev_img']."' alt='".$row_all_dev['dev_name']."'>
              <span class='singlebox-header'>".$row_all_dev['dev_name']."</span>
            </a>
            ";
     }
   echo "</div>";
 }

我得到了表中的第一个条目(iPhone 6,在我的实际数据库中的 dev_id 为 6)打印时间为 18 - picture for clarification。但是,我想要to show up like this 的行(图片中的第二行包含iPhone 6、6 Plus 和6s,它们恰好有相同的图片)。
对我来说,看起来 for 循环是正确迭代的,但内部数组指针没有提前一个?我哪里错了?

这个问题是this one的后续问题

【问题讨论】:

  • 什么是 $row_all_dev?如果要循环中行的某一列的数据,参考$row['column_name']。
  • 在我的 HTML 文档的顶部,我将包含有关当前显示品牌的所有设备的信息的所有行加载到变量 $row_all_dev 中。我知道它很难看,但由于该变量包含页面上显示的所有设备的所有数据,我可以从中提取图像。
  • 那为什么是foreach?在循环内部,您不使用 $row 值,您可以在其中找到“行”的特定值。
  • 在我看来,我需要一个 for 循环来以一种干净的方式完成它,但如果有更简单的方法来实现我的目标,请告诉我。我的代码基于this answer。那里没有给出关于 $row 的解释,但现在你说,我查询的数据确实被加载到 $row 中。如果我编辑 $sql 以包含 dev_name、dev_id 并编辑回显以从 $row 而不是 $row_all_dev 加载,它只会回显数字 1-18,这实际上看起来像预期的那样,因为数组只包含数字。但是,我需要相关数据,而不是数字。
  • 有人吗?我仍然卡在这个问题上。

标签: php mysql loops pdo


【解决方案1】:

试试这个:

$sql = "";
$sql .= "SELECT\n";
$sql .= "   subcat_id,\n";
$sql .= "   dev_id,\n";
$sql .= "   dev_img,\n";    //  Not sure if that column exists in the table???
$sql .= "   dev_name\n";
$sql .= "FROM devices\n";
$sql .= "WHERE cat_id='$cat_id'\n";
$sql .= "ORDER BY subcat_id, dev_id";

$data = $db->query($sql)->fetchAll();

$cat_name_lower = strtolower($cat_name);

echo "<div class='flexed-boxes'>\n";
$curr_sub_cat = '';
foreach($data as $row_no => $row) {
    $dev_name_ul = str_replace(array("$cat_name "," "),array("","_"),$row['dev_name']);

    if($curr_sub_cat != $row['subcat_id']) {
        if($curr_sub_cat != '') {
            echo "</div>\n";
            echo "<div class='flexed-boxes'>\n";
        }
        $curr_sub_cat = $row['subcat_id'];
    }
    echo "<a class='singlebox trpl' href='/devices/".$cat_name_lower."/smartphone_details.php?dev_name=".$dev_name_ul."'>
              <img class='singlebox-media' src='".$cat_name_lower."/img/".$row["dev_img"]."' alt='".$row['dev_name']."'>
              <span class='singlebox-header'>".$row['dev_name']."</span>
            </a>\n";
}
echo "</div>\n";
//  echo "<p>\$data:<pre>".print_r($data,true)."</pre></p>\n";

【讨论】:

  • 非常感谢您的帮助,虽然此代码确实使表格数据以正确的方式显示,但它并没有将智能手机 (subcat_id == 1) 放在与片剂(subcat_id == 2)。我也看不到如何通过编辑您编写的代码来完成它。
  • 这很容易。只需对子猫 ID 进行更改检测并在 div 更改时关闭/打开它。我会更新答案。
  • 感谢您的帮助;我将您的帖子标记为答案并更新了我的 OP。通过一些小的编辑,我能够在每个
    的开头打印正确的标题。顺便说一句,代码中有一个小错误导致在页面顶部插入一个空的
    。知道如何在不将 $curr_sub_cat 设置为 1 的情况下阻止这种情况发生吗?
  • 查看更新后的答案。基本上,它忽略了第一个子猫的变化。
  • 当然。我将它集成到我的 OP 中的一段代码中。该额外检查也使 echo "
    \n";在for循环之外冗余。
【解决方案2】:

试试这个并在你的问题中显示结果。这还不是答案,但会提供给您答案所需的信息。

$sql = "";
$sql .= "SELECT\n";
$sql .= "   subcat_id,\n";
$sql .= "   dev_id,\n";
$sql .= "   dev_name\n";
$sql .= "FROM devices\n";
$sql .= "WHERE cat_id='$cat_id'\n";
$sql .= "ORDER BY subcat_id, dev_id";

$data = $db->query($sql)->fetchAll();

echo "<p>\$data:<pre>".print_r($data,true)."</pre></p>\n";

【讨论】:

  • 这是一个非常漂亮的印刷品。我将结果粘贴在这里:pastebin.com/cZVi5E9L。这基本上是我在开篇文章中提供的所有信息,并列在一个很好的数组中。
  • 你从哪里得到 $cat_name?
  • 谁投了反对票,请在 cmets 中提供一个原因......这个答案是从 OP 获得澄清的一种方式。
  • 我的 中的第一件事是以下代码块:pastebin.com/qSztBC1v(这是我在 3 月 31 日 15:12 的评论中提到的地方)。另外,我不知道谁对您的评论投了反对票。当我第一次查看答案时,它已经被否决了。
猜你喜欢
相关资源
最近更新 更多
热门标签