在while循环中调用PHP函数

在while循环中调用PHP函数,php,function,loops,while-loop,Php,Function,Loops,While Loop,我有一个函数,它从满足特定条件的表中获取特定的用户集 我需要给他们每人发个信息 因此,我使用了另一个函数来发送消息。并在while循环中调用该函数 while($user= mysqli_fetch_assoc($users_set)){ send_message($user['email']); } 所以,问题是,函数只调用一次。(仅使用循环的最后一个值) 如何解决此问题并使用循环的每个值调用函数 这是完整的代码 $query = "SELECT * "; $query .= "FRO

我有一个函数,它从满足特定
条件的表中获取特定的用户集

我需要给他们每人发个信息

因此,我使用了另一个函数来发送消息。并在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\u query()

函数确认查询($result\u set){
如果(!$result\u set){
die(“发生致命错误:数据库查询失败”);
}

}

我只想把这个问题归结为一个查询,去掉所有循环的东西

INSERT INTO notification (description, user_id)
SELECT 'You have been confirmed', user_id
FROM user
WHERE confirmed = 0
你现在的逻辑真的很复杂

您查询用户表以获取用户电子邮件字段,然后将该电子邮件作为参数传递给您的函数,然后返回并(我假定)根据电子邮件查找用户ID(当您已经从初始查询中获得此信息时),然后进行插入

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

使用我的方法,不管有多少行受到影响,都可以进行1次查询


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

您确定返回了多行吗?在这一次迭代中,$user是否有有效值?根据PHP文档,mysqli_fetch_assoc()函数甚至不存在:
confirm_query
做什么?你应该发布
confirm_query()
send_message()的代码;可能是这些函数中的某些内容影响了数据库连接或导致执行中止。在锁定数据库时执行昂贵的操作不是一个好主意。抓取行,然后发送电子邮件哇。。我还没想过这么复杂的sql命令。。。。谢谢我来试试……:)@没问题。我确实在我的答案中添加了更新,您应该仔细查看。对你来说,真正的收获是认识到这是一种反模式,当你遇到它时,你应该认识到并重新思考你的方法。我尝试了你的答案,肯定它让我大开眼界。但是,我最后遇到了另一个问题。在这里,我想在通知表中插入多行。confirm=0时找到的用户数,即要添加到通知表中的记录数。因为我需要在通知表的description字段中包含一些特定于用户的详细信息。那么,现在该去哪里?@Tharinduluck这取决于用户特定信息是什么以及它是从什么生成的(它是否已经存在于用户表中?)。您的示例刚刚显示了一个静态字符串(
您已被确认
)正在插入,因此我的答案基于此。是的,当我问这个问题时,我只是专注于调用循环中的函数。很抱歉。无论如何,我通过
foreach
循环实现了我想要的功能。首先,我获取特定于用户的电子邮件(根据条件),并将它们存储在一个数组中。然后使用
foreach
循环遍历该数组,并调用其中的函数。然而,这可能不是最聪明的方法。你觉得怎么样?
INSERT INTO notification (description, user_id)
SELECT 'You have been confirmed', user_id
FROM user
WHERE confirmed = 0