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)
}
我只想把它归结为一个查询并摆脱所有循环的东西
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次查询.
你应该从中得到的一个结论是,每当你看到自己试图进行某种嵌套查询时,你应该将其识别为反模式(一种你不想通常使用的编码模式).如果您重新考虑如何编写查询,通常可以采用更好的方法.