0

行を解析するクエリと while ループは、行数 > 0 の場合は正しく機能しますが、=0 の場合は機能しません。

返される行数が 0 の場合、while ループ全体がスキップされたように見えます。$activeCountis forced =0のコメントを参照してください。次のエラー メッセージは実行されず、表示されません。

以下のコードの前に、デフォルトのエラー メッセージが配列 $errorMessages[] に設定され、トリガーが発生したときに更新および追加されます。クエリで 0 行が返された場合、$error_NoActives の更新は行われません。

関連するコードは次のとおりです。

//fetch the user's active posts and their count
$fetch = mysql_query("SELECT SQL_CALC_FOUND_ROWS * FROM (
    SELECT propertyID, streetAddress, city3, city2 FROM residence.property
    INNER JOIN contact ON residence.contact.ContactID = residence.property.ContactID
    WHERE residence.contact.contactEmailAddress1 ='$contactEmailAddress1' AND activePosting = '1') props,
    (SELECT FOUND_ROWS() AS 'activeCount') actives;")
    or die('<li class=error>Ooops</li>'. mysql_error());

//create HTML li items to show each posting and create jQuery to insert to a div
$rowCount = 0;
while ($row = mysql_fetch_array($fetch)) {
    $activeCount = $row["activeCount"];
    //$activeCount = 0; //test - get default error message, seems next 3+ lines are not executing when query has 0 rows
    if( $activeCount == 0 ) {
    $error_NoActives = "<li>You have $activeCount active postings.</li>";
    //don't get this message with 0 active posts, get default error
    $errorMessages[0] = $error_NoActives;
    } else {
        //$activeCount displays correctly if non-zero
        $error_NumberOfActives = "<ul>Welcome back. You have $activeCount active postings.
        //do stuff using $rowCount. Construct li items.
        $rowCount++;
        }
    }
}

while ループについて、または MySQL の FOUND_ROWS() と SQL_CALC_FOUND_ROWS について、何かを理解していないのではないかと思います。

いずれにせよ、クエリが 0 行を返す場合、$error_NoActives ステートメントは実行されていません。

4

2 に答える 2

1

行が 0 であるため、ループするものが何もないため、while ループは実行されません。行が 0 行を超える場合は WHILE の周りに if ステートメントを設定し、行が 0 行の場合は else でコードを記述できます。ウェルカム メッセージの構文エラーも修正されました。

//fetch the user's active posts and their count
$fetch = mysql_query("SELECT SQL_CALC_FOUND_ROWS * FROM (
    SELECT propertyID, streetAddress, city3, city2 FROM residence.property
    INNER JOIN contact ON residence.contact.ContactID = residence.property.ContactID
    WHERE residence.contact.contactEmailAddress1 ='$contactEmailAddress1' AND activePosting = '1') props,
    (SELECT FOUND_ROWS() AS 'activeCount') actives;")
    or die('<li class=error>Ooops</li>'. mysql_error());
//create HTML li items to show each posting and create jQuery to insert to a div
$rowCount = 0;
if( mysql_num_rows($fetch) > 0 )
{
    while ($row = mysql_fetch_array($fetch)) {
        $activeCount = $row["activeCount"];
        //$activeCount = 0; //test - get default error message, seems next 3+ lines are not executing when query has 0 rows

            //$activeCount displays correctly if non-zero
            $error_NumberOfActives = "<ul>Welcome back. You have $activeCount active postings.";
            //do stuff using $rowCount. Construct li items.
            $rowCount++;
            }
    }
}
else {
    $error_NoActives = "<li>You have $activeCount active postings.</li>";
    //don't get this message with 0 active posts, get default error
    $errorMessages[0] = $error_NoActives;
}
于 2013-05-29T19:48:01.230 に答える
1

while ループは、結果がある場合にのみ実行されます。結果なしで実行しようとすると、$row のすべての値が null になるため、これは正しく機能しています。

必要なことを行う正しい方法は、次のように mysql_num_rows を使用することです。

if(mysql_num_rows($fetch)) {
    while($row = mysql_fetch_assoc($fetch)) {
        $error_NumberOfActives = "<ul>Welcome back. You have $activeCount active postings.
        //Do stuff with $row.
    }
} else {
    $error_NoActives = "<li>You have $activeCount active postings.</li>";
}

クエリから SELECT FOUND_ROWS() を完全に削除できます。

また、もう 1 つの注意点は、ダイス ステートメントです。テスト中にそれを使用するだけであれば、問題ありません。ただし、ライブ コードの die ステートメントに依存しないでください。より良い解決策は次のとおりです。

$query = "mysqlquery";
if(mysql_query($query)) {
} else {
    //some error code
}

つまり、エラーをより適切に処理できます。

于 2013-05-29T19:52:37.170 に答える