PHP Foreach循环查询
我最近一直在修补PHP(自学,没有正式培训),试图了解如何从数据库中获取数据并在某处显示数据。到目前为止,我学到了不少东西,但现在我被难倒了 我在本地数据库中的一个名为site_members的表中列出了大约200个用户。该表有三个字段:id、姓名、出生日期。通过PHP,我想在一个网页上显示所有用户,并在他们的名字后面立即提到“生日快到了!”。大概是这样的: 约翰·史密斯(生日快到了!) 我还没有编写代码来实现这一点,因为我通常在真正深入到编码部分之前先编写伪代码。以下是伪代码:PHP Foreach循环查询,php,mysql,foreach,Php,Mysql,Foreach,我最近一直在修补PHP(自学,没有正式培训),试图了解如何从数据库中获取数据并在某处显示数据。到目前为止,我学到了不少东西,但现在我被难倒了 我在本地数据库中的一个名为site_members的表中列出了大约200个用户。该表有三个字段:id、姓名、出生日期。通过PHP,我想在一个网页上显示所有用户,并在他们的名字后面立即提到“生日快到了!”。大概是这样的: 约翰·史密斯(生日快到了!) 我还没有编写代码来实现这一点,因为我通常在真正深入到编码部分之前先编写伪代码。以下是伪代码: Get dat
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循环
提前谢谢 我认为您对伪代码的概念是正确的,而且您对执行多个数据库查询的理解也是正确的,您只是将这两个问题纠缠在一起,给了您一个错误的想法 如果正确构造
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的日期函数来处理天数和月份。拥有适当的数据类型是首选,但这超出了他首先需要学习的范围。这很有意义。谢谢