1

バウンスされたすべての電子メールは、データベースのテーブルに送信されます。それらを、アクティブな電子メールが入力されている別のテーブルのフィールドと比較しようとしています。次の関数を使用すると、「IN」を使用した場合は何も返されず、「NOT IN」を使用した場合はすべて返されますが、2つのテーブルに一致する電子メールがあることはわかっています。私はこれを間違った方法で行っていますか?

<?php
function CompareEmails() {
    $mysqli = new mysqli(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME);

    if ($mysqli->connect_errno) {
        echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") ";
        echo $mysqli->connect_error;
        $mysqli->close();
    }

    $bademails = array();
    $values = $mysqli->query("SELECT bad_emails.emails FROM bad_emails ");

    while ($row = $values->fetch_assoc()) {
        $bademails[] = $row['emails'];
    }

    $query = "SELECT email_database.customer_id, email_database.email 
              FROM email_database 
              WHERE email_database.email IN('" . implode("' , '", $bademails) . "') 
              ORDER BY email_database.customer_id DESC";

    $values2 = $mysqli->query($query);

    while ($row2 = $values2->fetch_assoc()) {
        echo $row2['customer_id'] . " " . $row2['email'] . "</br>";                                                                                                            
    }                                                                                                                                                                          
}                                                                                                                                                                              
?>
4

1 に答える 1

1

次のような単一のクエリで、これをすべてよりうまく行うことができます。

SELECT e.customer_id, e.email
FROM email_database AS e
INNER JOIN bad_emails AS b ON e.email = b.emails
ORDER BY e.customer_id DESC

クエリに表示される内容と一致さb.emailsせるために、(複数形)を(単数形)に結合して使用したことに注意してください。e.emailbad_emailsでフィールド名を正しく参照していない場合、空の結果セットが表示される可能性があるという点で、これが実際に発生している問題である可能性があると推測しています(本当に正しいemailですか?)。それはあなたが見ている正確なIN/NOTINの振る舞いにつながるでしょう。

クエリを変更して、正しい名前を使用するようにしてください。

于 2012-12-06T01:24:27.073 に答える