1

PHP の mail() 関数に大きな問題があります。電子メール アドレスを確認するための電子メールを生成するユーザー サインアップ ページがあります。残念なことに奇妙なことに、この関数は 6 通または 7 通から 90 通以上の電子メールを同じユーザーに送信します。ここで他の人の投稿を見ても、これがどのように、またはなぜ起こっているのかわかりません。

誰かがこれをデバッグするのを手伝ってくれますか?

これはコードです:

$first_name = mysql_real_escape_string($_POST['first_name']);
$last_name = mysql_real_escape_string($_POST['last_name']);
$email = mysql_real_escape_string($_POST['email']);
$username = strtoupper(mysql_real_escape_string($_POST['username']));
$password1 = mysql_real_escape_string($_POST['password1']);
$password2 = mysql_real_escape_string($_POST['password2']);
$termsofuse = mysql_real_escape_string($_POST['termsofuse']);
$status = mysql_real_escape_string($_POST['status']);
$approved = mysql_real_escape_string($_POST['approved']);
$acctype = mysql_real_escape_string($_POST['acctype']);
$industry = mysql_real_escape_string($_POST['industry']);
$newsletter = mysql_real_escape_string($_POST['newsletter']);
$contactname = mysql_real_escape_string($_POST['contactname']);
$contactnumber = mysql_real_escape_string($_POST['contactnumber']);

// Hashing of $password1
$password1 = sha256($password1);
$password2 = sha256($password2);

$hash = hash('sha256', $username);

// Check for existing username
$sql = "SELECT * FROM `members`";
$result2=mysql_query($sql);
while($row=mysql_fetch_array($result2)){
  $username2 = $row['username'];

  // If $username doesn't equal $username2 (meaning there isn't an existing username, and both passwords match, write to database
  if($username <> $username2 && $password1 === $password2){
    $sql = "INSERT INTO `members` (`id`, `first_name`, `last_name`, `email`, `username`, `password`, `termsofuse`, `status`, `approved`, `acctype`, `industry`, `newsletter`, `contactnumber`, `hash`, `since`) VALUES (NULL, '$first_name' , '$last_name' , '$email' , '$username' , '$password1' , '$termsofuse', 'Reg', '$approved', '$acctype', '$industry', '$newsletter', '$contactnumber', '$hash', NOW())";
    $result = mysql_query($sql) or die ("Can't insert".mysql_error());
    $to = $email; // Send email to user
    $subject = 'Signup Verification'; //Subject line in email
    $message = 'Welcome ' . $first_name . ','
    . "\r\n\r\n"
    . 'Thanks for signing up!'
    . "\r\n\r\n"
    . 'Your account has been created. To activate your account, click on the link below to get started!'
    . "\r\n\r\n"
    . 'http://www.radioman911.com/pages/CAD/verify.php?email=' . $email . '&hash=' . $hash . '';
    $headers = 'From: xxxx' . "\r\n" .
    'Reply-To: same xxxx as above' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();
    mail($to, $subject, $message, $headers, '-fxxxx same as above'); //Send the email
    header("location:new_member_sucess.php"); //yes, i know i spelled success wrong, but i also spelled it wrong in the page filename lol

  } else {
    echo "<style type='text/css'>A{text-decoration:none}</style>";
    echo "<body bgcolor='black'><font color='white' style='font-family:trebuchet ms;'>";
    echo "Passwords do not match or that username is already taken, please try again!<br>";
    echo "<a href='javascript: history.go(-1)'><font color='red'>Go back</a></font>";
  }
}
?>

ありがとう!

4

5 に答える 5

1

while ループは意味がありません。
実際にはすべてのユーザー (データベース内のすべての行) をループし、新しいユーザーが while ループの現在の行と一致しないたびに、新しいユーザーをデータベースに追加し、毎回電子メールを送信します。

これはあなたがすべきことです:
あなたのクエリ

$sql = "SELECT * FROM members";

ジェネリックへの道です。
良いことにMySqlを使用し、結果セットを反復処理することにより、データベースがphpスクリプトではなく一致を見つけられるようにします。
次のようなクエリを使用します。

$sql = "SELECT count(*) as count FROM members WHERE username LIKE '$username'";
$result = mysql_query($sql);

次に、$result['count']が 0 に等しいかどうかを確認します。その場合、新しいユーザーはまだ存在しないため、新しいユーザーを作成してメールを送信できます。

于 2013-06-05T20:53:39.683 に答える
1

問題は、重複したユーザー名をチェックする SQL にあります。

// Check for existing username
$sql = "SELECT * FROM `members`";
$result2=mysql_query($sql);
while($row=mysql_fetch_array($result2)){
    $username2 = $row['username'];

...

}}

私はあなたのコードを取り、いくつかの小さな変更を加えました。すべてのユーザー名を返して個別に確認するのではなく、同じユーザー名を持つユーザーの数を取得するように SQL クエリを変更しました。

関数の周りのコードもmail()ループから外しました。重複するユーザー名が見つからない場合、$duplicateUsername変数は false に設定され、それ以外の場合は true に設定されます。

false の場合$duplicateUsername、メール関数が呼び出されます... 1 回、それ以外の場合はエラーが表示されます。

// Check for existing username以下からすべてをお願いします。

// Check for existing username
$username = mysql_real_escape_string($username);
$duplicateUsername = false;


$sql = "SELECT COUNT(username) AS usernameCount FROM members WHERE username = '{$username}'";
$result2=mysql_query($sql);
while($row=mysql_fetch_array($result2)){
    $duplicateUsername = $row['usernameCount']>0 ? true : false;
}

if(!$duplicateUsername){
    $sql = "INSERT INTO `members` (`id`, `first_name`, `last_name`, `email`, `username`, `password`, `termsofuse`, `status`, `approved`, `acctype`, `industry`, `newsletter`, `contactnumber`, `hash`, `since`) VALUES (NULL, '$first_name' , '$last_name' , '$email' , '$username' , '$password1' , '$termsofuse', 'Reg', '$approved', '$acctype', '$industry', '$newsletter', '$contactnumber', '$hash', NOW())";

    $result = mysql_query($sql) or die ("Can't insert".mysql_error());

    $to = $email; // Send email to user
    $subject = 'Signup Verification'; //Subject line in email
    $message = 'Welcome ' . $first_name . ','
       . "\r\n\r\n"
       . 'Thanks for signing up!'
       . "\r\n\r\n"
       . 'Your account has been created. To activate your account, click on the link below to get started!'
       . "\r\n\r\n"
       . 'http://www.radioman911.com/pages/CAD/verify.php?email=' . $email . '&hash=' . $hash . '';
    $headers = 'From: xxxx' . "\r\n" .
         'Reply-To: same xxxx as above' . "\r\n" .
         'X-Mailer: PHP/' . phpversion();

    mail($to, $subject, $message, $headers, '-fxxxx same as above');

    header("location:new_member_sucess.php");
} else {
    echo "<style type='text/css'>A{text-decoration:none}</style>";
    echo "<body bgcolor='black'><font color='white' style='font-family:trebuchet ms;'>";
    echo "Passwords do not match or that username is already taken, please try again!<br>";
    echo "<a href='javascript: history.go(-1)'><font color='red'>Go back</a></font>";
}
于 2013-06-05T20:59:45.870 に答える
0

ユーザー名が一致しないがパスワードが一致する場合、ユーザーを追加して電子メールを送信すると、すべてのメンバーをループします。ユーザー名が同じになることはほとんどなく、パスワードも同じになる可能性があります...

その特定のユーザーのデータベースのみを照会するようにクエリを変更する必要があります。

$sql = "SELECT * FROMメンバーWHERE username LIKE \"" . $username . \"";

質問への回答ではありませんが、コードの最初の行を次のように短縮できます。

foreach($_POST AS $k => $v){
  $$k = mysql_real_escape_string($v);
}
$username = strtoupper($username);

ずっと短い。

于 2013-06-05T20:55:14.740 に答える
0

データベース内のすべてのユーザーを含むループで実行mail()しています。while()

その条件のステートメントに基づいてif、ユーザーが指定したユーザー名が現在の行と一致せず、パスワードが一致するたびに、挿入を実行して電子メールを送信しています。おそらく、あなたのユーザーの何人かは同じパスワードをたくさん持っています。

クエリを更新して、一致しないユーザーを結果セットから除外する条件を含める必要があります。

于 2013-06-05T20:55:02.830 に答える
0

メール関数は while ループ内にあるため、非常に多くのメールを送信しています。そのコードを切り取り、ループの上または下に配置してください。次に、クエリが間違っています。 $sql = "SELECT * FROM members"; $sql = "SELECT * FROM memberswhere .....";を使用して、すべてのメンバーを選択します。列名がわかりません。読む、http://www.w3schools.com/php/php_mysql_where.asp

于 2013-06-05T20:56:30.143 に答える