1

私はphpで「ナンセンス」な問題を抱えています。最初のループは、テーブルから特定のレコードを取得し、それを2番目のテーブルのすべてのレコードと比較することになっています...

だから私はそれがすべての「1番目」の後に41の「2番目」を印刷することを期待していました。2番目のテーブルには41のレコードがあるため。ただし、代わりにwhileループが最初に機能し、その後2番目のwhileループを無視します。

私が得る結果:

1st2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd2nd1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st1st

while($row = mysql_fetch_array($select))
{
    echo "1st";
    while($row2 = mysql_fetch_array($select2))
    {
        echo "2nd";
        $string = $row2["header"];
        $find = $row["email"];
        if(strstr($string, $find)) {
            $email = $row["email"];
            echo "found it";
        } else {
            //no email found
        }
    }
}
4

4 に答える 4

1

内部ループに入る前に、2番目のクエリを実行する必要があります。

    while($ row = mysql_fetch_array($ select))
    {{
        エコー"1番目";

        $ select2 = mysql_query( "select ...");

        while($ row2 = mysql_fetch_array($ select2))
        {{

さらに良いのは、最初のループを開始する前に2番目のクエリを実行し、レコードを別の配列に保存することです。次に、n^2クエリを回避できます。

    $ emailToRecord = array();
    $ select2 = mysql_query( "select ...");
    while($ row2 = mysql_fetch_array($ select2)){
       $ emailToRecord [$ row2 ["header"]] = $ row2;
    }

    while($ row = mysql_fetch_array($ select))
    {{
        エコー"1番目";
        $ find = $ row ["email"];
        if(isset($ emailToRecord [$ find])){
               エコー「それを見つけた」;
        }
    }

于 2013-02-05T02:36:29.350 に答える
0

これが理にかなっていることを願っています。

これは、最初のwhileが実行され、次に2番目のwhileがループして終了するまで終了せず、終了して最初のwhileに戻り、true(別の行)を返し、実行して次のwhileに進むためです。現在の「行」へのポインタが終わりに達したため、実行されず、主にメインループを実行します。だからあなたは122222221111111を手に入れます

于 2013-02-05T02:32:49.897 に答える
0

両方のクエリで同じ量の行がない限り、もちろん同じものを投稿することはありません。
クエリ($selectと$select2)を追加できますか?

そして、誰かが答えの代わりにコメントを投稿する方法を教えてもらえますか?

<?php
    $select=mysql_query("SELECT email FROM database.tablename"); 
    $select2=mysql_query("SELECT header FROM database2.tablename2");

    while($row=mysql_fetch_assoc($select))
    {
        echo "1st";
        $find = $row["email"];
        while($row2=mysql_fetch_assoc($select2))
        {
            echo "2nd";
            $string = $row2["header"];
            if(strstr($string, $find))
            {
                $email=$find;
                echo "found it";
            }
             else
            {
                  //no email found
            }

        }
    }
于 2013-02-05T02:25:41.397 に答える
0

mysql_fetch_array別のwhileループ内で実行しないでください。最初にすべてのデータを抽出し、2つのテーブルの結果を比較します。

$select=mysql_query("SELECT email FROM database.tablename");
$select2=mysql_query("SELECT header FROM database2.tablename2");    
while($row=mysql_fetch_array($select)) {
    $first[] = $row["email"];
}
while($row2=mysql_fetch_array($select2)) {
    $second[] = $row2["header"];
}
foreach ($first as $item) {
    if (($key = array_search($item, $second)) !== false) {
        $email[] = $second[$key];
    }
}
print_r($email); // Get all the emails that exist in both tables.
于 2013-02-05T02:33:44.140 に答える