PHP Foreach循环查询

时间:2014-04-03 05:30:06

标签: php mysql foreach

我最近一直在修补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循环中都会进行数据库查询。我咨询的一些教程提到我应该出于效率原因避免这种情况,这是有道理的。我运行谷歌搜索找到类似的东西,但这并没有做太多。我不希望任何人为我编写任何实际代码。我只是想要一个更好的解决方案来查询。

提前致谢!

5 个答案:

答案 0 :(得分:0)

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

如果你正确地构建了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
}

这有意义吗?

答案 1 :(得分:0)

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

1:

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

2:

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

答案 2 :(得分:0)

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

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

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

PHP的正确模式如下:

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

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

3)执行查询。

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

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

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

(选项b是首选,因为它更灵活,因为你可以使用这种技术输入文件而不是回声)

这个伪代码确保您只能借助SQL系统(或存储系统)检索正确的数据集。

答案 3 :(得分:0)

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

至于发现他们的生日是否接近,以及你是否希望MySQL做出艰苦的工作,你可以在PHP中构建你的查询:

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

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

答案 4 :(得分:-1)

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

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