【问题标题】:PHP While Loop In a While LoopPHP While 循环在 While 循环中
【发布时间】:2016-11-27 22:41:18
【问题描述】:

尝试运行一个脚本,将我的数据库中的用户个人日程通过电子邮件发送给用户。

代码应该是这样的...从表 1 中选择所有用户想要他们每周的电子邮件。

然后获取这些 user_id 并运行查询以从表 2 中获取每个用户的每周计划。

如果表 2 中的日期距离代码运行时间小于或等于 1 周,并且不等于今天的日期,则设置变量 $email_content。

如果表 2 中的日期超过 1 周,那么代码应该知道它已经完成,这里希望继续并 mail() 为该用户收集的信息并仅发送该信息,仅该用户,然后继续下一个用户。

它说 echo "break" 的地方,它本质上是在标记每个用户的日程安排之间的间隔,但它回显了大约 20 次。理想情况下,这部分将成为我放置 mail() 函数的地方,所以我不能让它也执行 mail() 函数 20 次。

我已经尝试了该代码的大量不同变体,但似乎无法正确使用。总而言之,我需要为 user1 获取 info1,然后将 info1 发送给 user1,然后继续为 user2 获取 info2,然后将 info2 发送给 user2,等等......

<?php

// GET USERS WHO WANT THEIR WEEKLY SCHEDULE EMAILED TO THEM (Table 1)
$sql = "SELECT * FROM XXXXXXX WHERE weekly_email = 'Yes'";
$result = mysqli_query($connection, $sql);
while ($row = mysqli_fetch_array($result)) {
    $id .= "'" . $row['user_id'] . "', ";
}
$id = trim($id, ', ');

// GET THOSE USERS' SCHEDULES (Table 2)
$sql_email = "SELECT * FROM XXXXXXXX WHERE user_id IN ($id) ORDER BY user_id, date, start_time ASC";

$result_email = mysqli_query($connection, $sql_email);

while ($row_email = mysqli_fetch_array($result_email)) {
    $truck_name_email = $row_email['truck_name'];
    $location_name_email = $row_email['location_name'];
    $date_email = $row_email['date'];
    $address_email = $row_email['address'];
    $x = strtotime("7 days");

    $start_email = $row_email['start_time'];
    $end_email = $row_email['end_time'];

    if ($date_email <= date("m/d/Y l", $x)) {

        if ($date_email !== date("m/d/Y l")) {
            if (!empty($address_email)) {
                $address_email2 = explode(",", $row_email['address'], 2);
                $email_content = $date_email . substr($date_email, 11) . " - "
                    . $location_name_email . ", " . $address_email2[0] . ", "
                    . $start_email . "-" . $end_email . "<br/>";

                echo $email_content;
            } elseif (empty($address_email)) {
                $email_content .= $date_email . " - " . $location_name_email
                    . ", " . $start_email . "-" . $end_email . "<br/>";

                echo $email_content;
            }
        }
    }
    if ($date_email >= date("m/d/Y l", $x)) {
        echo "break";
        // break;
    }
}

【问题讨论】:

  • 不需要两次查询。只需使用子查询。你有IN($id) 的地方说IN(SELECT user_id FROM XXXXXX WHERE weekly_email = 'Yes)
  • 当您想比较时间戳时,您正在比较 if 块中的两个字符串。例如“星期四”>“星期日”?
  • 谢谢@siride,我删除了代码中的第一个查询,并根据您的建议更新了第二个查询。
  • @Drakes 这两个字符串本质上是“07/24/16 Sunday”

标签: php mysql if-statement while-loop


【解决方案1】:

只是说你应该注意潜在的 SQL 注入,在它们进入 SQL 语句之前转义任何用户可控制的字符串。例如,如果$row['user_id'] 是一个字符串,那么您必须执行mysqli_escape_string

您似乎忘记了代码中的某些内容:

    $x = strtotime("7 days");

    $start_email = $row_email['start_time'];
    $end_email = $row_email['end_time'];

    if ($date_email <= date("m/d/Y l", $x)) {

        if ($date_email !== date("m/d/Y l")) { // I think that you have a $x here?
            if (!empty($address_email)) {
                $address_email2 = explode(",", $row_email['address'], 2);
                $email_content = $date_email . substr($date_email, 11) . " - "
                    . $location_name_email . ", " . $address_email2[0] . ", "
                    . $start_email . "-" . $end_email . "<br/>";

【讨论】:

  • 每周一次的 Cron Job 运行这个脚本,没有任何东西是用户控制的。所有信息都已存储在数据库中,我只是想提取特定用户的特定信息,然后通过电子邮件发送给他们。 $date_email !== date("m/d/Y l") 基本上就是说,只要数据库中的日期,不等于今天的日期,则{运行代码}。 $x 本质上将今天的日期 (date("m/d/Y l")) 转换为从今天起 7 天的日期。我要做的是获取 1 位用户 1 周的信息,然后将该信息通过电子邮件发送给该用户,然后继续发送给下一个用户,依此类推。
  • @Shane 对不起,但也许我没有清楚地理解你的问题。如果您有 20 个用户,那么您当然必须运行 mail() 20 次。如果您有 20 条消息,那么也许您可以使用 GROUP BY 技术合并不同的消息。
  • 没关系。在这种情况下,考虑您和我是两个用户。我只想在满足条件的情况下邮寄与我有关的信息,给我,以及与你有关的信息,给你。代码显示 echo "break" 的地方;是我运行邮件()的地方。我的代码为找到数据库条目的每个实例回显“中断”,这意味着将为找到数据库条目的每个实例运行 mail() 函数......这太多了。抱歉,如果这不是一个好的解释,找到正确的词有点棘手。不过我想我有个主意……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-19
  • 2013-06-12
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 2017-11-20
相关资源
最近更新 更多