在while循环中调用PHP函数

Tha*_*cky 2 php loops function while-loop

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

我需要向他们发送一条消息.

所以,我用另一个函数发送消息.并在while循环中调用了该函数

while($user= mysqli_fetch_assoc($users_set)){
   send_message($user['email']);
}
Run Code Online (Sandbox Code Playgroud)

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

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

这是完整的代码......

$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']);
}
Run Code Online (Sandbox Code Playgroud)

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

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);
}
Run Code Online (Sandbox Code Playgroud)

}

这是代码 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>"); 
}
Run Code Online (Sandbox Code Playgroud)

}

Mik*_*ant 5

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

INSERT INTO notification (description, user_id)
SELECT 'You have been confirmed', user_id
FROM user
WHERE confirmed = 0
Run Code Online (Sandbox Code Playgroud)

你当前的逻辑确实令人费解.

您查询用户表以获取用户电子邮件字段,然后将该电子邮件作为参数传递给您的函数,然后转身(我猜)根据电子邮件查找用户ID(当您从初始查询中获得此信息时) ),然后你插入.

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

无论受影响的行数是多少,使用我的方法都可以进行1次查询.

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