【问题标题】:PHP Foreach Loop QueryPHP Foreach 循环查询
【发布时间】:2014-05-14 17:58:29
【问题描述】:

我最近一直在修补 PHP(自学,没有接受过正规培训),试图了解如何从数据库中获取数据并在某处显示数据。到目前为止,我学到了很多,但现在我很难过。

我的本​​地数据库中有一个名为 site_members 的表中的大约 200 个用户的列表。该表有三个字段:id、name、birth_date。通过 PHP,我想在网页上显示所有用户,并有类似“生日快到了!”的内容在他们的名字之后被提及。像这样的:

约翰·史密斯(生日快到了!)

我还没有编写代码来执行此操作,因为我通常先编写伪代码,然后再真正深入到编码部分。这是伪代码:

  • 获取当前日期和时间并将其转换为 Unix 时间戳
  • 启动 foreach 循环并遍历用户列表
    • 查询数据库表,通过 id 获取用户的生日,并将其存储在名为 bdate 的变量中。
    • 将 bdate 转换为 Unix 时间戳
    • 从 bdate 中减去当前日期,将其转换为剩余天数,并将其存储在名为 remaining_days 的变量中。
    • 如果用户的 bdate 在 15 天内(remaining_days 小于 15)
      • 显示他们的名字,然后是(生日快到了!)
    • 否则
      • 只显示他们的名字
    • 结束如果
  • 结束 foreach 循环

这是我的问题:一旦将上述伪代码转换为实际代码,每次在该 foreach 循环中都会进行数据库查询。我咨询过的一些教程提到出于效率原因我应该避免这样做,这是有道理的。我跑了谷歌搜索来找到类似的东西,但这并没有起到多大作用。我不希望任何人为我编写任何实际代码。我只是想要一个更好的查询解决方案。

提前致谢!

【问题讨论】:

  • 请发布您的实际代码
  • 为什么要使用 foreach 循环?您可以直接从 db 中获取 bd 在未来 15 天内的详细信息。
  • @ChittaranjanSethi - 这就是我不想做的。我想一直列出所有用户,而不仅仅是生日快到的用户。

标签: php mysql foreach


【解决方案1】:

我认为你对伪代码的概念是对的,你对做多个数据库查询的理解也是对的,你只是把两者纠缠在一起给你一个错误的想法。

如果你正确地构造了你的select 语句(这基本上就是你用来访问数据库的内容),你实际上将每个人的信息从数据库中提取出来,并将其存储在一个数组中(或其他形式)对象)。然后,您可以使用数组作为您的值来启动您的 foreach 循环,并以这种方式执行其余的检查。

$date = date("m.d.y");
$people = ** insert your commands to grab the info from the DB **
foreach($people as $person) {
    // do your comparison checks and echo's etc in here
}

这有意义吗?

【讨论】:

  • 很有意义。谢谢!
【解决方案2】:

您的问题可以有两种解决方案:-

1:

不要对每个用户进行查询,而是先获取所有用户的数据。
使用 foreach 循环 php
遍历数据 进行处理并显示结果。

2:

将用户 date_of_birth 存储在正确的 mysql 日期数据类型中
更改您的 mysql 查询以使用日期函数来获取所有符合您的日期差异标准的用户并仅显示这些用户。

【讨论】:

  • #1 是一个糟糕的解决方案,因为他必须进行 N 次迭代并且他没有正确使用数据库。不应将其作为解决方案建议,因为您正在遵循他的伪代码。 #2 更好,但将其保存为 unixtimestamp 并不会限制他,如有必要,他可以使用 SQL 的 Date 函数来操作日期和月份。拥有适当的数据类型是首选,但这超出了他首先需要学习的范围。
【解决方案3】:

您似乎没有正确阅读 SQL 和 PHP 之间的关系。如果您确实发布了代码,那么您可能很容易被难倒,因为有很多方法可以在 5 分钟或更短的时间内完成从遗留教程到当前 PDO 甚至 MVC 的简单任务。

我不会写代码,但你需要改变你在“伪代码”中的想法。

您的伪代码的问题是因为您认为数据库不智能,并且您正在这样做,就好像它只是为了存储一样。

PHP 的正确模式如下:

1) 使用 Date 函数检索当前日期 + 15。获取月份和 仅限一天。

2) 你创建一个 SQL 查询来检索所有用户 出生日期字段的月份和日期大于(或等于) TODAY 和谁小于或等于今天 + 15(日和月 仅)

3) 执行查询。

4) 带有返回的数据集(如果有) 您可以根据情况和设计选择两条路径

a) 你可以用一个简单的 FETCH 来循环它,它获取每行检索 并显示名称和额外消息。

b) 遍历结果集并存储显示消息 进入一个变量,然后在迭代完成后最终显示它 完毕。

(首选选项 b,因为它更灵活,因为您可以使用此技术输出到文件而不是回显)

此伪代码可确保您仅在 SQL 系统(或存储系统)的帮助下检索正确的数据集。

【讨论】:

    【解决方案4】:

    就整体流程而言,aashnisshah 是绝对正确的。首先,您应该从数据库中检索所需的所有记录,然后遍历每一行以进行数据比较,最后关闭循环。

    至于找出他们的生日是否临近,如果你想让 MySQL 完成这项艰苦的工作,你可以像在 PHP 中那样构建你的查询:

    $query = "SELECT *, DATEDIFF(DATE_FORMAT(dob, '" . date('Y') . "-%m-%d'), CURDATE()) AS days_to_dob FROM Members";
    

    这个想法是获取一个名为“days_to_dob”的额外列,其中包含距离该人出生日期的天数。请注意,如果该日期在今年已过,则为负数。使用额外的列,您可以轻松评估他们的出生日期是否在 15 天内。

    【讨论】:

      【解决方案5】:

      如果你不想要任何 php 代码,那么这里是我的伪代码:

      Get date  and time -> UTC stamp and store in $time_current
      Get all from site_members and store in $data
      for each entry in $data, store in $record
          get birth_date from $record and convert to utc stamp and store in $birthday
          print name from $record
          if $birthday is close to $time_current then print "Birthday soon" end if
          print new line
      end for
      

      这只对您的数据库执行一个请求。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-05
        • 2014-01-08
        • 2014-06-26
        • 2016-09-26
        • 2012-07-19
        • 2017-10-27
        • 1970-01-01
        相关资源
        最近更新 更多