【问题标题】:Call a PHP function inside of a while loop在 while 循环中调用 PHP 函数
【发布时间】:2015-07-26 13:54:25
【问题描述】:

我有一个函数可以从满足特定WHERE 条件的表中获取一组特定用户。

我需要向他们每个人发送一条消息。

所以,我使用了另一个函数来发送消息。并在他下面的while循环中调用该函数

while($user= mysqli_fetch_assoc($users_set)){
   send_message($user['email']);
}

所以,问题是,该函数只被调用一次。 (仅限循环的最后一个值)

如何解决这个问题,并使用循环的每个值调用函数...

这是完整的代码...

$query = "SELECT * ";
$query .= "FROM user ";
$query .= "WHERE confirmed = 0";

$user_set = mysqli_query($db_conx, $query);
confirm_query($user_set);

while($user = mysqli_fetch_assoc($user_set)){
   send_message($user['email']);
}

这里是发送消息功能....

function send_message($email){
global $db_conx;

$invitee_user = get_user_by_email($email);

$query5 = "INSERT INTO notification(";
$query5 .= "description, user_id";
$query5 .= ") VALUES(";
$query5 .= "'You have been confirmed'";
$query5 .= ", {$invitee_user['id']}";
$query5 .= ")";

$result5 = mysqli_query($db_conx, $query5);

if($result5){
    //$_SESSION["message"] = "Notification sent". \mysqli_error($db_conx);
    return "OK";
}else{
    //$_SESSION["message"] = "Failed to send notification". mysqli_error($db_conx);
}

}

这是confirm_query()的代码

function confirm_query($result_set){
if(!$result_set){
   die("Fatal Error Occured : Database Query Failed <a href=\"error-report.php\">Report this error</a>"); 
}

}

【问题讨论】:

  • 您确定返回的行不止一行吗?
  • 在这一迭代中,$user 是否具有有效值?根据 PHP 文档,函数 mysqli_fetch_assoc() 甚至不存在:php.net/…
  • confirm_query 是做什么的?
  • 您应该发布confirm_query()send_message() 的代码;这些函数中的某些东西可能会影响数据库连接或导致执行中止。
  • 在锁定数据库时执行昂贵的操作不是一个好主意。抓取行,然后发送电子邮件

标签: php function loops while-loop


【解决方案1】:

我将把它归结为一个查询并摆脱所有循环的东西

INSERT INTO notification (description, user_id)
SELECT 'You have been confirmed', user_id
FROM user
WHERE confirmed = 0

你现在的逻辑真的很复杂。

您查询用户表以获取用户电子邮件字段,然后将该电子邮件作为参数传递给您的函数,然后转身并(我假设)根据电子邮件查找用户 ID(当您已经从您的初始查询),然后您进行插入。

这意味着对于您从第一个查询返回的每条记录,您需要执行 2 次查询才能插入到通知表中。因此,如果您有 100 个结果,您最终将总共执行至少 201 个查询来完成插入。

使用我的方法,无论有多少行受到影响,您都会进行 1 次查询。

您应该从中得到的一个收获是,每当您看到自己尝试进行某种嵌套查询时,您应该将其识别为反模式(您通常不想使用的编码模式)。如果您重新考虑编写查询的方式,通常可以采用更好的方法。

【讨论】:

  • 哇.. 没想到这么多棘手的 sql 命令.. 谢谢.. 我会试一试... :)
  • @TharinduLucky 没问题。我确实为我的答案添加了更新,您应该查看一下。对您来说真正的收获是了解到这是一种反模式,您应该在遇到它时识别并重新考虑您的方法。
  • 我试过你的回答,确实让我大开眼界。但是,我最终遇到了另一个问题。在这里,我想在通知表中插入多行。用 confirm = 0 找到了多少用户,这将是要添加到通知表中的记录数。因为我需要在通知表的描述字段中包含一些特定于用户的详细信息。那么,现在去哪里呢?
  • @TharinduLucky 这取决于用户特定信息是什么以及它是从什么生成的(它是否已经存在于用户表中?)。您的示例只是显示插入了一个静态字符串 (You have been confirmed),所以我的回答是基于此。
  • 是的,当我问这个问题时,我只是专注于在循环中调用函数。对于那个很抱歉。无论如何,我设法用foreach 循环做我想做的事。首先,我获取用户特定的电子邮件(根据条件)并将它们存储在一个数组中。然后使用foreach 循环遍历该数组并调用其中的函数。但是,这可能不是最聪明的方法。你怎么看?
猜你喜欢
  • 2015-07-13
  • 1970-01-01
  • 2016-11-27
  • 1970-01-01
  • 2023-03-19
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
  • 2012-11-11
相关资源
最近更新 更多