PHP&;MYSQL-根据照片上传日期显示用户从数据库上传的照片
我创建了照片上传表单。不同的用户可以一次上传多张照片,照片、用户详细信息和输入信息存储在数据库中,如下图所示: 我希望能够根据照片上传的日期在我的index.php页面中显示用户及其照片。我希望index.php页面看起来像这样 我试图在我的SQL语句中使用GROUP_CONCAT()和GROUP BY,希望实现类似下表的功能,这可能允许我循环表数据,以便与用户一起显示照片 这是我不起作用的代码:PHP&;MYSQL-根据照片上传日期显示用户从数据库上传的照片,php,mysql,group-concat,Php,Mysql,Group Concat,我创建了照片上传表单。不同的用户可以一次上传多张照片,照片、用户详细信息和输入信息存储在数据库中,如下图所示: 我希望能够根据照片上传的日期在我的index.php页面中显示用户及其照片。我希望index.php页面看起来像这样 我试图在我的SQL语句中使用GROUP_CONCAT()和GROUP BY,希望实现类似下表的功能,这可能允许我循环表数据,以便与用户一起显示照片 这是我不起作用的代码: $sql = "SELECT id, unique_id, GROUP_CONCAT(fil
$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\u CONCAT()
。我做了一些搜索,但所有教程都给出了使用GROUP_CONCAT()
后该表的外观示例,但没有给出如何从最后一个表中获取数据以在例如index.php
中使用的示例。我是新加入GROUP_CONCAT()
的,我真的不知道如何处理这个问题 试试这个:
$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'];
}
}
在评论中批评你删除了前面的问题之后,现在让我们尝试一些“教学”;-) 正如我在对前面问题的评论中所说的那样,这是我不会试图对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
目前没有答案,但我有一条评论要你考虑。在示例图像中,每个用户只显示一个日期,但每张照片可以有不同的上载日期。所以你的设计不能工作。你应该为每张照片显示一个日期。此外,如果您按uniqueID分组,则日期可能属于该uniqueID下的任何一张照片。你不知道你要显示的是哪一天。@PaulSpiegel在代码中说:)@KodosJohnson实际上,根据他的表,每张照片只能有一个日期。如果同一用户在不同日期上传了其他照片,他想要的输出会多次显示同一用户。他的理论在这里是正确的,但是把它清晰地分组是有问题的。至于22的错误,那是因为你的SQL是无效的。您可以显示mysqli错误以显示其全部范围,但简而言之,groupby
紧跟在FROM
之后。许多问题都可以通过检测和解决,因此错误不容易被忽略。这有助于查找简单的语法和连接错误。@paulspiegelgroupby在表名之后使用,并且:echo$row['GROUP_CONCAT(fileName)'];啊。。我甚至都没看到那群人以前是从哪里来的。你应该在答案中写下你的评论。但是-查询仍然没有意义,因为列被选中,而这些列不在GROUPBY子句中。如果只启用了“全组”模式,这将产生一个错误。@PaulSpiegel OK。只需添加“作为文件名”就可以防止仅针对\u FULL\u GROUP\u BY的错误。现在,我们不需要将组中的所有列都按。您可以将其仅用于单个列。我编辑了我的答案。列别名filenames
与“按模式全组”无关。如果按unique\u id
分组,则无法选择id
。至少这没什么意义。对于具有unique\u id='id\u cow'
的组,应选择什么id
?您好@Giliapps,谢谢您的解决方案。正如Randall在前面的评论中指出的,在表名后面加上GROUPBY之后,错误就解决了。谢谢你的回复,我会尝试一下并给你反馈。我已经再次检查了你的代码。然而,日期并不是确定照片所有者的可靠方法。这是因为,例如,如果有100万用户使用相同的上传表单,那么不同的用户可能有相同的日期。但如果我使用唯一ID,那么您的代码就是一个很好的例子。唯一ID可以是$UserID$日期
,其中每个用户的用户ID不同。如果一个用户从两台计算机登录到他/她的帐户,并同时在两台计算机上上载照片,$UserID$日期也可能不是一个可靠的唯一标识符,因此我认为ID。用户ID。Date
将是识别所有者帖子的最可靠的方法。SQL查询将如何生成您拥有的$data数组