我正在构建一个用户填充的表单,然后将其保存到数据库中。然后我检索符合条件的用户,并将每个用户存储到另一个表中,并向他们发送电子邮件。
$userModel = new User();
$currentUser = $userModel->findUserById($user->id);
$requestModel = new Requests();
$success = $requestModel->saveRequest($currentUser->usr_id, $tagId, $title, $task, $fixed, $price, $hour, $quality, $multiple, $datetime, $postal, $cityId, $travel);
if($success){
$request = $requestModel->getUserLatestRequest($currentUser->usr_id);
if($request){
$user = new User();
$alluserids= $user->getAllSkillCityUserIds($cityId, $tagId);
$targetId = (array_column($alluserids, 'usr_id'));
//error_log("<pre>targetId".print_r($targetId,true)."</pre>");
foreach($targetId as $target) {
if($target == $currentUser->usr_id){
continue;
}
$lead = new RequestsLead();
$lead->addRequest($request->req_id, $request->req_userid, $target);
$contractor = $userModel->findUserbyId($target);
$nemail = new NotificationsEmail();
$nemail->sendGotRequest($contractor->usr_email, $contractor->usr_firstname);
}
}
$this->flash->success('<div data-toggle="notify" data-onload data-message="Thanks for using our service!." data-options="{"status":"success"}" class="hidden-xs"></div>');
$this->response->redirect($this->url->get(""));
}else{
$this->flash->error('<div data-toggle="notify" data-onload data-message="Sorry! Please try again." data-options="{"status":"danger"}" class="hidden-xs"></div>');
$this->response->redirect($this->url->get("request"));
}
当有很多用户出现问题时,在将用户重定向回带有flash消息的页面之前,此功能需要完成运行。我该如何修改这个,所以我先将用户重定向到带有flash消息的页面,然后运行php foreach函数存储到db并发送电子邮件?
我尝试切换功能的顺序但是一旦用户被flash消息重定向,php功能就停止了进行。
答案 0 :(得分:3)
PHP是server side scripting language。它本质上(但不完全)是无国籍的。
这意味着当加载PHP页面时,它会在服务器上执行它所需的PHP代码,然后将响应发送到浏览器。 在没有新服务器调用的情况下将页面发送到客户端后,无法重新执行PHP代码。
在您的情况下,您将客户端重新启动到新的PHP页面。这很棒,但是新的PHP页面是一个在服务器上运行的新脚本,它没有上一页所做内容的概念。
为了在页面加载后执行PHP代码,您需要使用AJAX向PHP服务器发送请求,以便在后台执行此请求,而无需再次重定向用户,或者在显示&#39; flash&#39;后再次重定向用户。消息。
请注意,使用AJAX,您还可以使用原始页面 - 无需任何重定向 - 来执行此请求并显示Flash消息(同时!)。
有关在网页之间共享数据的详细信息:
有关AJAX请求和PHP的更多信息:
答案 1 :(得分:2)
您提到的内容需要某种方式让脚本继续运行,而不是将响应发送回用户。 PHP不能以这种方式工作 - 您可以开始将内容写入输出缓冲区,但浏览器仍将等待,直到返回整个响应。
相反,您应该考虑一些临时存储所需信息的过程,并异步处理这些信息。例如将它们存储到数据库并运行cron脚本或deamon来执行此操作。