【问题标题】:how to echo one by one in loop on the same page如何在同一页面上逐一回显
【发布时间】:2016-02-19 11:59:21
【问题描述】:

我正在编写一个程序,通过 ajax 向我们的注册用户发送批量电子邮件。

我想在每个循环响应完成后回显它并进入下一个条件。

例如:-

我在数据库中有 100 封电子邮件的列表。当我提交编程请求时,它将开始发送电子邮件。

程序。像这样工作:

<?php
       foreach($emails as $email){
          $status = $this->sendMail($email);
          if($status == true)
          {
            echo "Mail Sent";
          }else{
            echo "Not Sent";
          }
       }
?>

现在我想为每个循环一次又一次地打印“邮件已发送”/“未发送”。

输出:-

邮件发送

邮件发送

邮件发送

未发送

邮件发送

发送中..

编辑

我的 PHP 代码是:-

<?php


    public function send_message() {
        $sendTo = $this->input->post('send_to');
        $template = $this->input->post('template');
        $subject = $this->input->post('subject');
        switch ($sendTo) {
            case 1:
                $users = $this->getAllEmails();
                break;
            case 2:
                $users = $this->getRegisteredUsersEmails();
                break;
            case 3:
                $users = $this->getTemproryUsersEmails();
                break;
            case 4:
                $users = $this->getSubscribersEmails();
                break;
        }
        $status = $this->sendMail($users, $template, $subject);
        echo "Mail Sent";
    }
 private function sendMail($users, $template, $subject) {
        $this->load->library('parser');
        $status = array();
        $i = 0;
        foreach ($users as $user) {
            $message = $this->parser->parse('email_templates/' . $template, array('email' => $user->email, 'name' => ($user->name != '') ? "Hi " . $user->name : "Hello"), TRUE);
            $response = $this->mail->send(config_item('sender_mail'), config_item('sender_name'), $user->email, $subject, $message);
            $status[$i]['email'] = $user->email;
            $status[$i]['status'] = ($response == 1) ? 1 : 0;
            $i++;
        }
        return $status;
    }
?>

我的 Ajax 代码:-

<script type="text/javascript">
$("#send_mail").submit(function(){
    $.ajax{
    url:"<?php echo base_url('promotion/send_message'); ?>",
    type:"post",
    data:$(this).serialize(),
    success:function(data){
       $("#status").html(data);
    }
  }
});
</script>

【问题讨论】:

  • 那有什么问题?
  • 当我通过 ajax 提交请求时,它会在向所有人发送电子邮件后返回完整的响应。不是每个循环。我想要每个循环运行时的响应。
  • 当我向 porg 提交 ajax 时,您没有得到我所说的 @Anant Think。它将开始循环发送电子邮件,完成该过程后,它将立即在“成功:功能(数据)”中发送所有“邮件发送/不发送”响应。我希望在发送电子邮件 1 时显示它打印“已发送邮件”并转到下一个并发送下一个,然后一次一个地打印“已发送邮件”。
  • 先创建一个 jquery 邮件 ID 数组然后:- $.each(mailid, function() { $.ajax({....your code and in this code alert(response)})});
  • 程序从数据库中获取所有Mail id。我只需要点击发送按钮.. 你的 jquery 适用于用户提供的电子邮件列表。

标签: javascript php ajax email


【解决方案1】:

您必须使用 javascript/jquery 而不是 PHP 来执行循环。为了在服务器端没有溢出,您应该只在成功时使用递归调用该函数。这样它将是同步的。

jQuery

var emails = [
'lorem@stackoverflow.com', 
'ipsum@stackoverflow.com', 
'foo@stackoverflow.com'
];

index = 0;
var sendMail = function(email){
  $.ajax({
    url:"sendMail.php",
    type: "POST"
    data: { emailId: email}  
    success:function(response) {
        index++;
        document.write(response); 
        if(emails[index] != undefined){
            sendMail(emails[index]);
        }
     }
  });
}

sendMail(emails[index]);

PHP

$status = $this->sendMail($$_POST['email']);
$msg = $status ? "Mail Sent" : "Not Sent";
echo $msg;

【讨论】:

  • 我不从表单提交电子邮件列表。当我单击该按钮 ajax 调用运行并将请求发送到 prog 时,我只有页面上的“开始发送电子邮件”。这将从数据库中获取电子邮件并发送电子邮件.. @Horst
  • 你仍然会遵循同样的规则。发送请求,获取电子邮件,发送电子邮件,响应,下一个 ajax 请求。
  • 服务器将在批量请求时挂起。
  • 不要循环和启动 ajax 请求。使用递归,只有在成功时才开始下一个请求。这样它将是同步的,不会溢出。
  • 我认为您即将解决我的问题。我对您的 php 代码什么是“getEmailById”以及在 ajax 请求“数据:{ emailId:id}”中如何传递电子邮件感到有些困惑。你通过了索引“sendMail(index);”所以 id 将变为 0,1,2 .....n 根据您的代码,我需要在我的“发送”按钮所在的页面上制作电子邮件 JavaScript 数组。对,如果是,当我有超过 1 个缺少电子邮件时,问题会导致。
【解决方案2】:

I want to print the response when each time "$this-&gt;mail-&gt;send" function is called in "sendMail()"

正如您上面的代码,$status 应该像 json 对象数组一样在 ajax 函数中返回。所以我试试这个 ...

private function sendMail($users, $template, $subject) {
    $this->load->library('parser');
    $status = array();
    $i = 0;
    foreach ($users as $user) {
        $message = $this->parser->parse('email_templates/' . $template, array('email' => $user->email, 'name' => ($user->name != '') ? "Hi " . $user->name : "Hello"), TRUE);
        $response = $this->mail->send(config_item('sender_mail'), config_item('sender_name'), $user->email, $subject, $message);
        $status[$i]['email'] = $user->email;
        $status[$i]['status'] = ($response == 1) ? 1 : 0;
        $i++;
    }
    echo json_encode($status);
}

Ajax 代码

<script type="text/javascript">
$("#send_mail").submit(function(){
$.ajax{
url:"<?php echo base_url('promotion/send_message'); ?>",
type:"post",
dataType : "json",
data:$(this).serialize(),
success:function(data){
    $.each(data,function(i,v){
       $("#status").append(v.status);
     }
}
}
});
</script>

【讨论】:

  • 这将返回发送邮件到完整列表后的结果。我想一一打印结果。当邮件发送到一个电子邮件时,它会打印响应,当邮件发送到另一个 id 时,它会打印下一个响应。
  • 您的 sendMail() 是为我认为的所有邮件编写的,如果您想一一更改 sendMail 函数仅用于一个用户名并仅返回一个用户名会更好
  • 你是对的。但为此,我必须在单击“发送邮件”按钮之前获取所有电子邮件,并通过 ajax 传递每个电子邮件地址。它会导致服务器问题,因为如果我有超过 1 个缺少电子邮件,那么程序将发送超过 1 个缺少 ajax 请求。
猜你喜欢
  • 1970-01-01
  • 2018-03-15
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
  • 2015-01-04
  • 2021-04-17
  • 1970-01-01
相关资源
最近更新 更多