PHP Foreach循环查询

PHP Foreach循环查询,php,mysql,foreach,Php,Mysql,Foreach,我最近一直在修补PHP(自学,没有正式培训),试图了解如何从数据库中获取数据并在某处显示数据。到目前为止,我学到了不少东西,但现在我被难倒了 我在本地数据库中的一个名为site_members的表中列出了大约200个用户。该表有三个字段:id、姓名、出生日期。通过PHP,我想在一个网页上显示所有用户,并在他们的名字后面立即提到“生日快到了!”。大概是这样的: 约翰·史密斯(生日快到了!) 我还没有编写代码来实现这一点,因为我通常在真正深入到编码部分之前先编写伪代码。以下是伪代码: Get dat

我最近一直在修补PHP(自学,没有正式培训),试图了解如何从数据库中获取数据并在某处显示数据。到目前为止,我学到了不少东西,但现在我被难倒了

我在本地数据库中的一个名为site_members的表中列出了大约200个用户。该表有三个字段:id、姓名、出生日期。通过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
  • 获取当前日期和时间,并将其转换为Unix时间戳
  • 启动foreach循环并浏览用户列表
    • 查询数据库表,根据用户的id获取其出生日期,并将其存储在名为bdate的变量中
    • 将bdate转换为Unix时间戳
    • 从bdate中减去当前日期,将其转换为剩余天数,并将其存储在名为剩余天数的变量中
    • 如果用户的bdate在15天内(剩余天数小于15天)
      • 显示他们的名字,然后是(生日快到了!)
    • 否则
      • 只显示他们的名字
    • 如果结束
  • 结束foreach循环
我的问题是:一旦将上述伪代码转换为实际代码,每次在foreach循环中都会有一个数据库查询。我参考的一些教程提到,出于效率考虑,我应该避免这样做,这是有道理的。我通过谷歌搜索找到了类似的东西,但这并没有起到多大作用。我不希望任何人为我写任何实际的代码。我只是想要一个更好的查询解决方案


提前谢谢

我认为您对伪代码的概念是正确的,而且您对执行多个数据库查询的理解也是正确的,您只是将这两个问题纠缠在一起,给了您一个错误的想法

如果正确构造
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
}

这有意义吗?

如果您不想要任何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

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

有两种解决方案:-

1:

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

2:

将用户出生日期存储在正确的mysql日期数据类型中

将mysql查询更改为使用date函数来获取所有符合日期差异条件的用户,然后只显示这些用户。

看来您没有正确理解SQL和PHP之间的关系。如果你真的发布了代码,那么你可能很容易被解压,因为有很多方法可以在5分钟或更短的时间内完成从传统教程到当前PDO甚至MVC的简单任务

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

伪代码的问题是因为您认为DB不智能,而且您这样做就好像它只是用于存储一样

PHP的正确模式如下所示:

1) 使用Date函数检索当前日期+15。月月 只有一天

2) 您可以进行SQL查询,以检索 出生日期字段的月份和日期大于(或等于) 今天和小于或等于今天+15(日和月)的人 (仅限)

3) 执行查询

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

a) 您可以使用一个简单的FETCH循环它,该FETCH用于获取每一行 和显示名称和额外消息

b) 迭代结果集并存储显示消息 然后在迭代完成后最终显示它 完成了

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


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

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

至于了解他们的生日是否临近,以及您是否希望MySQL完成这项艰巨的工作,您可以在PHP中构建这样的查询:

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

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

请发布您的实际代码为什么要使用foreach循环?您可以直接从db获取其bd在未来15天内的详细信息。@ChittaranjanSethi-这是我不想做的。我想一直列出所有用户,而不仅仅是那些生日即将到来的用户。#1是一个糟糕的解决方案,因为他必须进行N次迭代,并且没有正确使用数据库。不应该建议将其作为解决方案,因为您正在遵循他的伪代码#2是一个更好的方法,但是将其保存为unixtimestamp并不限制他,他可以在必要时使用SQL的日期函数来处理天数和月份。拥有适当的数据类型是首选,但这超出了他首先需要学习的范围。这很有意义。谢谢