PHP& MYSQL - 根据上载日期照片显示来自数据库的用户上传照片

时间:2017-12-08 21:06:44

标签: php mysql group-concat

我创建了照片上传表单。不同的用户可以一次上传多张照片,照片,用户的详细信息和输入都存储在数据库中,如下图所示:

Database table storing filenames of photos uploaded and other inputs

我希望能够根据照片上传的日期在index.php页面中显示用户及其照片。我希望index.php页面看起来像这样

Final output page - How to display multiple photos from database

我试图在我的SQL语句中使用GROUP_CONCAT()和GROUP BY希望实现类似下表的内容,这可能允许我遍历表数据以便在用户旁边显示照片

Example of how GROUP_CONTAT() and GROUP BY look like in MYSQL

这是我的代码无效:

$sql = "SELECT id, unique_id, GROUP_CONCAT(fileName) as fileName,  title,date GROUP BY unique_id FROM images"; 
$result = $conn->query($sql); 
if ($result->num_rows > 0) { // This is the line 22 in my code.
    while($row = $result->fetch_assoc()) { 
        echo $row['fileName']; //I wanted to know if echo $row['fileName']; would print something like cow1.jpg, cow2,jpg etc.
    } 
} 

但我收到的错误如下:

  

注意:尝试在第22行的C:\ xampp \ htdocs \ display.php中获取非对象的属性

有人向我建议GROUP_CONCAT()。我已经完成了一些搜索,但是所有教程都提供了表格在使用GROUP_CONCAT()后如何看待的示例,但没有说明如何从最终表格中获取数据以用于index.php。我是GROUP_CONCAT()的新手,我真的不知道如何使用它。

2 个答案:

答案 0 :(得分:2)

在删除上一个问题的评论中给你一点谴责之后,现在让我们尝试一些“教学”; - )

正如我在前一个问题的评论中所说的那样,我不会尝试使用GROUP_CONCAT。最重要的是因为它具有以下缺点:a)它是特定于MySQL的,因此使用它有点妨碍代码的可移植性,并且b)更严重的是,您可以组装的结果字符串的长度是有限的。文件名(加路径)可能会变得更长,如果您有不同用户的不同上传目录或要包含在URL中的其他参数,那么这会限制一组可能包含的照片数量,在此之前“爆炸”......

我提到的 控制中断 是一个非常基本的编程原则。循环遍历排序的(!)数据集,并比较一个或多个标准,以查看它们是否在上一行和当前行之间发生了变化。

您的示例需要一个简单的单级控制中断 - 日期是此处唯一的分组条件。但是同样的原则可以扩展到涵盖多个级别 - 比如你有一份你的信用卡购买清单,包括几年,你想要按照年份排序,然后按月份排序。

以下示例循环一个或多或少与您的示例数据匹配的数组;但是循环遍历数据库查询结果,这几乎是一样的。

但是请记住,在任何情况下,输入数据必须已经按中断标准(或标准,对于多级控制中断进行排序;在这种情况下,也是“在正确的顺序“,意思是上面的例子,你的CC按年份先购买,然后按月购买。”

评论示例应该是非常明显的,所以:

<?php

// example data - I left out a few of your columns; the important part is that
// it is sorted by the control group break criterion, in this case the date
$data = [
 ['id' => '1', 'name' => 'John', 'file' => 'cow1.jpg', 'date' => '07-12-2017 01:05'],
 ['id' => '2', 'name' => 'John', 'file' => 'cow2.jpg', 'date' => '07-12-2017 01:05'],
 ['id' => '3', 'name' => 'Dan', 'file' => 'cat1.jpg', 'date' => '08-12-2107 02:09'],
 ['id' => '4', 'name' => 'Dan', 'file' => 'cat2.jpg', 'date' => '08-12-2107 02:09'],
 ['id' => '5', 'name' => 'John', 'file' => 'dog.jpg', 'date' => '09-12-2107 03:10'],
];

echo '<ul>'; // open unordered list
echo '<li>'; // opening list item tag for first grouped set of data

$previousDate = null;
foreach($data as $row) {
  // check if group break has occurred - is the date of this row different
  // from that of the previous one? (since we initialized $previousDate as null,
  // this will be true for the first row in any case)
  if($row['date'] != $previousDate) {
    // break has occured
    if(null != $previousDate) {
      // if this is not the first row, then we have created output before, so
      // now we need to close the previous list item, and open an new one.
      echo '</li>';
      echo '<li>';
    }

    // now we output whatever is needed at the start of a new group - in this case,
    // user name and date, since we want those only once
    echo 'User: ' . $row['name'] . '<br>';
    echo 'Date: ' . $row['date'] . '<br>';
  }

  // now, handle the output of the actual "per-row" data - in this case, the individual image
  echo '[img src="' . $row['file'] . '"]<br>'; // pseudo image tag in lack of real image files

  // remember current row's date as the new previous one, so that we can compare against
  // that in the next loop iteration
  $previousDate = $row['date']; 
}

echo '</li>'; // closing list item tag for last grouped set of data
echo '</ul>'; // close unordered list

如果你想要一个不同于无序列表的东西(有点讽刺的是没有在这里使用有序的列表,我知道,但我不想破坏示例输出的默认项目编号,导致,这可能会令人困惑),你当然也可以输出其他结构中的数据 - 比如说,而不是列表。只需要稍微考虑一下输出的内容以及每种情况下的确切位置和时间。假设您想要一个包含三列名称,日期和图像的表,并且在每行中仍然将名称和日期留空,它们仍然与前一行匹配 - 那么您仍然需要为名称输出表格单元格日期,以免弄乱所需的基本HTML表结构。因此逻辑可能需要稍微调整,具体取决于所需的特定输出。

答案 1 :(得分:1)

试试这个:

$sql = "SELECT id, unique_id, GROUP_CONCAT(fileName) AS filenames, title, date FROM images GROUP BY unique_id"; 
$result = $conn->query($sql); 
if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) { 
        echo $row['filenames'];
    }
}