2012-02-14 20 views
0

私はPHPにとって非常に新しく、私の最初のプロジェクトはコメントシステムを開発していました。だから今は素晴らしいですが、新しいコメントがあるときに電子メールを受け取る選択肢をコメント作成者に与えたいと思います。最初に、テーブルに「 「email_notifications」という別の行を作成することにしました。コメントフォームのsubmit.phpにあります。皆を電子メールに新しいコメントがある場合に電子メールを送信

....私が使用することをwan't:

$emails = mysql_query("SELECT * FROM email_notifications"); 
while($row=mysql_fetch_assoc($emails)) { 
mail($row['email'],'New Comment on...','There was a new comment o....',"From: [email protected]"); 
} 

私はこれがうまくいくにもわかりません。しかし、私の最初の懸念は、人々に複数回メールを送ることだったということでした。 人が同じ電子メールで複数回コメントした場合、すべての電子メールのデータベースを経由したときにその電子メールを複数回電子メールで送信することはありません。それは私の大きな関心事です。とにかく、新しいコメントがあるときに、電子メールの人がいなくても、新しいコメントが1回以上あると、その人にメールを送ることができました。

概要(私が達成したいもの):

1.誰かがコメントを提出します。上記
2.誰もが、私は自分自身を明らかにした期待したメール

を取得します。そうでなければ、私は謝罪します。前もって感謝します。イムは、まだあなたのテーブルを想定し

答えて

0

:)初心者が、これは動作するはずeveryonesの電子メールアドレスが含まれている、覚えておいてください:

$emails = mysql_query("SELECT * FROM email_notifications"); 

while($row=mysql_fetch_assoc($emails)) { 

    $subject = "There was a new comment"; 
    $message = "[email protected]"; 

    mail($row['email'],$subject,$message); 
} 

私はあなたのデータベース呼び出しのため準備たstatmentsまたはストアドProceeduresにを使用しようとするだろうが。

相続人プリペアドステートメントを使用して、同じ例:

$mysqli=new mysqli("server", "username", "password", "database"); 
$stmt = $mysqli->prepare("SELECT email FROM email_notifications"); 
$stmt->execute(); 
$stmt->bind_result($email); 
while($stmt->fetch()){ 

    $subject = "There was a new comment"; 
    $message = "[email protected]"; 

    mail($email,$subject,$message); 
} 
+0

編集を参照してください、準備された文を使用するための追加例 –

+0

私はまだ$ email変数が必要でしょうか? – Shawn31313

+0

@ Shawn31313いいえ、私はそれをきれいにしました。あなたは私が前にそれを持っていたように$電子メールを宣言しなければならない –

0

私は、おそらくなります短いtimestanにあまりにも多くのメールを作成する可能性が、あります任意のループ内mail()機能を入れrecommentないでしょうあなたのドメインではスパマーと見なされます。

新しいコメントがあなたが作成したもの前に、すべてのコメントは、すべての個別の識別子を追跡することができます作成​​され、あなたのコードで

$query = mysql_query("SELECT DISTINCT `userId` FROM `comments` WHERE `object` = {$yourObject} AND `userId` != {$currentUser}"); 

これは最新のコメントを投稿したユーザーを除くすべてのユーザ識別子を選択します。次に、適切なテーブルに通知を作成し、複数の同一の通知を防止するために重複を監視する必要があります。

最後の部分は、通知をゆっくりと送信するメールキュースクリプトをサーバー上に作成しています。それには多くの方法がありますが、私はcrontab(既に起動していない場合)を介して起動されるCLIスクリプトを好む。そこには、5秒から1分のような睡眠(通知がない場合)と単純なmail()送信の無限ループサイクルがあります。ここでは、既存のCLIスクリプトをもとに即興例です:深刻な人々はデーモンとして起動することができPOSIX互換のスクリプトを書く

#!/usr/bin/php -q 
<?php 

// acquire a process id file or prevent launching a second instance. 
$filename = "/path/to/mailer.pid"; 
$file = fopen($filename, 'w+'); 
if (!flock($file, LOCK_EX + LOCK_NB)) exit(0); 

// force an uninterruptable script 
ignore_user_abort(true); 
set_time_limit(0); 

// mysql connection routines somewhere here 

while (true) { 
    $query = mysql_query("SELECT * FROM `mail_notifications` ORDER BY `timestamp` ASC LIMIT 0, 1"); 
    if (!mysql_num_rows($query)) { 
     // Oh, no notifications pending. Take a little break 
     sleep(60); 
     continue; 
    } 
    $data = mysql_fetch_assoc($query); 
    // your mailing magic here 
    sleep(5); 
} 

?> 

、私はしかし、それをしようとする衝動を持っていませんでした。無限ループは危険なことですが、それは少なくとも私のために働きます。

関連する問題