2015-05-14 67 views
2

我有一个函数,它从满足特定WHERE条件的表中获取一组特定用户。在一个while循环中调用一个PHP函数

我需要发送每个消息。

所以,我用另一个函数发送消息。并呼吁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

你确定有多行返回? – jcuenod

+0

在这一次迭代中,$ user是否有有效值?根据PHP文档,mysqli_fetch_assoc()函数甚至不存在:http://php.net/manual-lookup.php?pattern=mysqli_fetch_assoc&lang=de&scope=404quickref – Timo

+0

是的,我很确定它返回多于一个行。我用回音检查了它 – TharinduLucky

回答

5

我只想熬下来到一个查询,摆脱所有的循环东西

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

您当前的逻辑实在是令人费解。

您查询用户表以获取用户电子邮件字段,然后将该电子邮件作为参数传递给您的函数,然后转身(并假定)根据电子邮件查找用户标识(当您已有此信息时从你的初始查询),然后你插入。

这意味着对于从第一个查询返回的每条记录,您需要执行2个查询以插入通知表。所以如果你有100个结果,你最终会完成至少201个查询来完成插入。

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

你应该从中得到一个结论就是,无论何时你看到自己试图做某种嵌套查询,你都应该认识到这是一种反模式(一种你不想经常使用的编码模式) 。如果您重新思考如何编写查询,通常会采取更好的方法。

+0

哇..有没有想过这个棘手的SQL命令这么多....谢谢..我会试一试... :) – TharinduLucky

+0

@TharinduLucky没问题。我没有添加更新到我的答案,你应该看看。对你来说真正的感受是知道这是一种你应该认识的反模式,并在你遇到它时重新考虑你的方法。 –

+0

我试了你的答案,确定它打开了我的眼睛。但是,我结束了另一个问题。在这里我想插入多行通知表。有多少用户发现confirm = 0,这将是要添加到通知表中的记录数。因为我需要在通知表的描述字段中包含特定于用户的一些详细信息。那么,现在要去哪里? – TharinduLucky

相关问题