我有一个函数可以从满足特定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>");
}
}
答案 0 :(得分:5)
我只想把它归结为一个查询并摆脱所有循环的东西
INSERT INTO notification (description, user_id)
SELECT 'You have been confirmed', user_id
FROM user
WHERE confirmed = 0
你现在的逻辑确实令人费解。
您查询用户表以获取用户电子邮件字段,然后将该电子邮件作为参数传递给您的函数,然后转身(我猜)根据电子邮件查找用户ID(当您已经从中获取此信息时)你的初始查询),然后你插入。
这意味着对于从第一个查询返回的每个记录,您需要执行2个查询以插入到通知表中。因此,如果您有100个结果,您最终将完成至少201个查询以完成插入。
使用我的方法,无论受影响的行数是多少,都会进行1次查询。
你应该从中得到的一个结论是,无论何时你看到自己尝试进行某种嵌套查询,你都应该认识到这是一种反模式(一种你通常不想使用的编码模式)。如果您重新考虑如何编写查询,通常可以采取更好的方法。