2011-09-08 7 views
0

(GmailとPHPMailerクラスを使用して)PHPページに投稿するコンソールアプリケーションがあります。GmailのPHPMailerクラスで、毎回2つのメールを送信します。

問題は、ユーザーは常にメールを2回受信することです。ここで

は(私はログ記録の目的のためにUIDを渡す。)

public static void PostUpdate(string uid) 
{ 
    WebRequest request = WebRequest.Create("http://127.0.0.1/bin/server/check_table.php"); 
    request.Method = "POST"; 
    string postData = "check_table"; 
    byte[] byteArray = Encoding.UTF8.GetBytes(postData); 
    request.ContentType = "application/x-www-form-urlencoded"; 
    request.ContentLength = byteArray.Length; 
    Stream dataStream = request.GetRequestStream(); 
    dataStream.Write(byteArray, 0, byteArray.Length); 
    dataStream.Close(); 
    WebResponse response = request.GetResponse(); 
    Console.WriteLine("[" + uid + "]- " + DateTime.Now.ToString() + " : HttpWebResponse(" + ((HttpWebResponse)response).StatusDescription + ")"); 
    dataStream = response.GetResponseStream(); 
    StreamReader reader = new StreamReader(dataStream); 
    string responseFromServer = reader.ReadToEnd(); 
    // Display the content for debugging 
    // Console.WriteLine("[" + uid + "]- " + DateTime.Now.ToString() + " : " + responseFromServer); 
    reader.Close(); 
    dataStream.Close(); 
    response.Close(); 

} 

私のPHPファイルには、私はいくつかのデバッグオプションを考慮している

$sql = "SELECT * FROM users as u JOIN value_store as v ON u.id = v.uid WHERE u.last_notification < DATE_SUB(NOW() , INTERVAL 5 MINUTE) "; 
$results = mysql_query($sql, $db_link); 
while($row = mysql_fetch_array($results)) { 
    $id = $row[0]; 
    $msg = ""; 
    if($row["inlet_moisture"] > $row["inlet_moisture_high_critical"]) { 
     $msg = "Critical Inlet Moisture"; 
    } else if($row["inlet_moisture"] > $row["inlet_moisture_high_warning"]) { 
     $msg = "Inlet Moisture Warning"; 
    } 
    if($msg != "") { 
     if($row["mobile_notification"] == 1) { 
      if(sendMessage(($row["mobile_number"] . "@" . $row["mobile_carrier"]), $row["first_name"], $msg)) { 
       $res1 = mysql_query("UPDATE users SET last_notification = NOW() WHERE id = $id",$db_link); 
       echo "SMS Sent for [$id]"; 
      } 
     } 
     if($row["email_notification"] == 1) { 
      if(sendMessage($row["email"], $row["first_name"], $msg)) { 
       $res2 = mysql_query("UPDATE users SET last_notification = NOW() WHERE id = $id",$db_link); 
       echo "Email Sent for [$id]"; 
      } 
     } 
    } 
    echo "Update For [$id] Complete!"; 
} 

で構成されてC#のからの私の投稿です投稿されました。

WebRequestからの出力を読み取るように私のコンソールアプリケーションを設定しました... 私はページをポストしていますが、POSTはOKです。私は、データベースに2つの行があるため、クロージャの問題があると思うし、各行のIDをエコーバックすると、最後の行(2回)だけが得られます。私は私が使用しているid(行)の出力をループに出力しながらPHPを更新しようとしました。

は、私はまだ

Update For [2] Complete! 
Update For [2] Complete! 

代わりの

Update For [1] Complete! 
Update For [2] Complete! 

改正については、上記参照してください受けます。

+0

:)おそらく動作します。 1つは実際のメールアドレス用、もう1回はSMS用です。あなたのユーザーについてはわかりませんが、私の電話は私の仕事用のメールやSMSを受け取るので、私は二重の通知を受ける傾向があります –

+0

はい、これは送信の方法が非常に異なります。メールを使ってSMSに送るには[phoneNumber] @ [mobile carrier]にメールを送り、メールではそれをユーザーのメールアドレスにします。これらの呼び出しがあいまいでないことを確認できます。 1つは電子メールを送信し、1つはSMSを送信します。あなたが思っているのは、私はちょうどナッツで、同じものとして見ています。 1つはSMSです。メールはOutlook経由で読んだGmailアカウントに関連付けられています。 – rlemon

+0

サーバのアクセスログを確認する - PHPスクリプトが2回呼び出されていますか?もしそうなら、それはあなたのC#コードのものです。 –

答えて

1

あなたはこのコードを持っている:mobile_notificationが1に設定されている場合、一度メールを送信し、email_notificationが1に設定されている場合も、電子メールを送信している

if($msg != "") { 
    if($row["mobile_notification"] == 1) { 
     // stuff 
    } 
    if($row["email_notification"] == 1) { 
     // stuff 
    } 

。これが原因である可能性があります。

else if($row["email_notification"] == 1) { 

モバイルが送信されていない場合のみメールを送信することができます。

コードやデータをもう少し知らなくても、言うことは難しいです。

function sendMessage($to, $toName, $body) { 
    echo 'Sending mail...'; 
    // rest of the function here 
} 

をし、それは間違いなく(それがあるべき)その倍を発射だかどうかを確認:あなたはPHP sendMessage関数でエコーを入れ、さらに

をそれを追跡するために行うことができますいくつかのもの。あなたはそれだかどうかを確認するために、SQLクエリを見てもよい。その場合にはそれは、各クエリのために戻って2行を取得することができる

今たび

をデータベースから戻って来るのか見て見て
while($row = mysql_fetch_array($results)) { 
    print_r($row); 
    // script continues 
} 

、正しい。によって

(私はあなたに構文を残しておきますので、私は、C#を知らない)それは、多分PHPファイルが二回呼び出されていると仮定すると、そのC#ファイルにデバッグを入れ

public static void PostUpdate(string uid) 
{ 
    // echo uid here 
    // script continues 
    WebRequest request = WebRequest.Create("http://127.0.0.1/bin/server/check_table.php"); 
    request.Method = "POST"; 

ちょうどあなたがそれを知ったら、それが間違っているのを見て、あなたはそれが間違っている場所を追跡することができます。

$results = mysql_query("UPDATE users... 

と再定義を言って、私はちょうどあなたがこれをやっていることを見てきました


...その後

while($row = mysql_fetch_array($results)) { 

以降に、そのループでは、既にループしている結果セット。戻り値を取ることなくクエリを実行できます。

mysql_query("UPDATE users 

か、単にそれをもう一度別の名前を付ける

$results2 = mysql_query("UPDATE users... 

、それはあなたが二回)(のsendMessageを呼び出している

+0

返事ありがとうジョー、C#呼び出しは1回だけ行われています。私はすでにコンソールにそれを書いています。 sendMessageへのphp呼び出しは、PERコールを2回実行しています。詳細については私の更新を見てください – rlemon

+0

2つのif文については、私は、電子メールとSMSの両方で通知を受け取るようにしたいと考えています。それがどのように機能するのでしょうか。 – rlemon

+0

あなたのSQLを投稿できますか?最後の行を2回取得するのはおそらく2回電子メールを受け取っているのですから、データベーステーブルについて私たちに教えることがあれば便利です。 – Joe

関連する問題