Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP&;MYSQL-根据照片上传日期显示用户从数据库上传的照片_Php_Mysql_Group Concat - Fatal编程技术网

PHP&;MYSQL-根据照片上传日期显示用户从数据库上传的照片

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

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

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

我试图在我的SQL语句中使用GROUP_CONCAT()和GROUP BY,希望实现类似下表的功能,这可能允许我循环表数据,以便与用户一起显示照片

这是我不起作用的代码:

$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数组