PHP / MySQL:显示列

时间:2017-03-31 15:05:09

标签: php mysql loops pdo

解决
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       Apple iPhone 6   1       1
2       Apple iPhone 6s  1       1
3       Apple iPad Air   1       2

dev_id 是主键, cat_id 对于每个品牌都不同(Apple = 1,Samsung = 2等), subcat_id 表示如果设备是手机(1)或平板电脑(2)。

我希望回显一个品牌的所有设备,这些设备在一个列表中使用标题智能手机分配了 subcat_id == 1 。列 subcat_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

的跟进

2 个答案:

答案 0 :(得分:0)

试试这个:

$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";

答案 1 :(得分:-1)

尝试此操作并在问题中显示结果。它还没有答案,但会提供给你答案所需的信息。

$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";
相关问题