2016-09-04 8 views
-1

に送信するためのmysqlからのデータ抽出を検索し、組み合わせるために、私はどのようにPHP

  • オブジェクト1(PK)
  • として人物の情報についてのいくつかの列で保存されたテーブルでMySQL DBを持っているユーザ名
  • メール
  • サービス
  • はphpmのためのPHPコードで

を送りましたailer私はデータベースに接続し、SQLクエリから必要な情報を抽出し、すべての電子メールが正しく送信された後、foreach関数を使用してすべての人に電子メールを送信し、列 "送信"のデータは0から1へ更新されます。問題なく動作しますが、複数の "object1"に同じ "メール"を持つ人がいる可能性があります。この場合、すべての行にメールが送信されます...

たとえば、電子メール[email protected]には30件の「object1」があり、30件のメールが届きます。

クエリーのデータと作業を結合する方法と、1つの電子メールに関連付けられたこれらのオブジェクト1のすべてが、すべてのテーマのコンテンツを1つの電子メールでのみ送信されますか?

私はif/elseを使ってスクリプトを完成させる必要があると思いますが、どのように管理しているのかわかりません。

それを行うためのスクリプトの一部下:

<? 
$mail = new PHPMailer; 

    $result = mysqli_query($mysql, 'SELECT * FROM db WHERE service LIKE \'%something%\' AND sent = 0 ORDER BY object1 LIMIT 0 , 30'); 

    foreach ($result as $row) { 

     $mail->addAddress($row['email'], $row['object1']); 

     /* i use it to use an external .html file to send email and replace vairables in it */ 

     $message = file_get_contents('template/temaplate.html'); 

     $message = str_replace('%email%', $row['email'], $message); 
     $message = str_replace('%object1%', $row['object1'], $message); 


     //Set the message 
     $mail->MsgHTML($message); 
     $mail->AltBody = strip_tags($message); 


     if (!$mail->send()) { 
      echo "Mailer Error (" . str_replace("@", "&#64;", $row["email"]) . ') ' . $mail->ErrorInfo .; 
      break; //Abandon sending 
     } else { 
      echo "Message sent to :" . $row['object1'] . ' (' . str_replace("@", "&#64;", $row['email']) .; 

      //Mark it as sent in the DB 
      mysqli_query(
       $mysql, 
       "UPDATE db SET sent = true WHERE object1 = '" . 
       mysqli_real_escape_string($mysql, $row['object1']) . "'" 
      ); 
     } 
     // Clear all addresses and attachments for next loop 
     $mail->clearAddresses(); 
     $mail->clearAttachments(); 
    } 
?> 

私は正しく私のニーズを説明し、いくつかの助け、それのための提案をお願いしていると思っています。

+0

分かりやすいコードのインデントが良い考えです。それは [コーディング標準を簡単に見てみましょう](http://www.php-fig.org/psr/psr-2/ **私たちは、コードを読んで、もっと重要なこと、それは**あなたのコードをデバッグするのに役立ちます助けます)あなた自身の利益のために。あなたはこのコード を数週間/数ヶ月で修正するように頼まれるかもしれません。そして、あなたは私に最後に感謝します。 – RiggsFolly

+0

あなたのスクリプトは[SQLインジェクション攻撃]の危険にさらされています(http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php) [リトルボビーテーブル](http://bobby-tables.com/)でも [入力をエスケープしている場合、その安全ではありません!](http://stackoverflow.com/questions/5741187/sql-injection-that-gets -around-mysql-real-escape-string) [準備されたパラメータ化された文](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php) – RiggsFolly

+0

これはあなたのようには見えませんこのコードをあなた自身で書く試み。 ** SO!=無料のコーディングリソース** – RiggsFolly

答えて

0

object1による注文の代わりに、電子メールで注文することができます。これにより、同じ電子メールを持つ行が一緒に出てきます。

$prev_email = null; 
foreach ($result as $row) { 
    if ($row['email'] === $prev_email) { 
     // skip, but may print some warning etc. 
     // or check other conditions about object1 
     continue; 
    } 
    .... 
    $prev_email = $row['email']; 
} 

このようにして、各電子メールには1つのメッセージしかありません。しかし、それらの電子メールの中でどのオブジェクトを使用するかを気にするならば、ロジックを微調整する必要があります。