我有一个控制台应用程序发布到PHP页面(使用Gmail和PHPMailer类)通过电子邮件发送给用户。
问题是,用户总是收到两次电子邮件!
这是我在C#上的帖子(我传入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!";
}
我已经考虑了一些发布的调试选项。
我已经设置了我的控制台应用程序来读取WebRequest的输出... 所以我可以看到我正在打开发布页面,POST就可以了。我认为可能存在闭包问题,因为数据库中有两行,如果我回显每行的ID,我只得到最后一行(两次)。我已经尝试更新我的PHP while循环输出我正在使用的id(行)。
我仍然收到
Update For [2] Complete!
Update For [2] Complete!
而不是
Update For [1] Complete!
Update For [2] Complete!
请参阅上文的修订版。
答案 0 :(得分:1)
您有以下代码:
if($msg != "") {
if($row["mobile_notification"] == 1) {
// stuff
}
if($row["email_notification"] == 1) {
// stuff
}
如果mobile_notification设置为1,则发送一次电子邮件,如果email_notification设置为1,则发送电子邮件;这可能是原因。您可能想要使用
else if($row["email_notification"] == 1) {
仅在尚未发送手机时才发送电子邮件。
不知道更多的代码或数据,很难说。您可以采取一些措施来进一步追踪
在PHP sendMessage函数中放置一个echo:
function sendMessage($to, $toName, $body) {
echo 'Sending mail...';
// rest of the function here
}
并查看它是否肯定会发射两次(应该是)。
现在看看每次从数据库中回来的内容
while($row = mysql_fetch_array($results)) {
print_r($row);
// script continues
}
每个查询可能会返回2行,在这种情况下,您可以查看SQL查询以查看是否正确。
假设是这样,也许PHP文件被调用两次,所以在C#文件中放一个调试(我不知道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";
只需打印一些输出,就可以追踪它出错的地方,然后在知道之后查看它出错的原因。
我刚看到你正在这样做......
while($row = mysql_fetch_array($results)) {
然后,在那个循环中,说
$results = mysql_query("UPDATE users...
重新定义你已经循环的结果集。您可以在不获取返回值的情况下运行查询;
mysql_query("UPDATE users
或者第二次给它一个不同的名字
$results2 = mysql_query("UPDATE users...
它可能会起作用:)。