-1

ユーザーがコンテスト(投稿)を「いいね」するたびに、ユーザーID、値(好きまたは嫌い)、およびリマインダー日付でデータベースを更新する次のコードがあります。

$query は私の userContests テーブルを見て、その内容全体を保存します。

userContests テーブルには、userID、値 (好きか嫌いか)、contestID、およびリマインダーの日付が格納されます。

$getfreq は、値 123、234、345、456、567 を含む配列です

コードがそれ自体を説明していることを願っています。各セクションにコメントするために最善を尽くしました. ここでの基本的なポイントは、$getfreq に値 345 が含まれている場合、リマインダーの日付でデータベースを挿入または更新することです。

$userID = 1;
$value = 1;
$contestID = 1737;
if (($userID > 0) && ($contestID > 0) && ($value < 2)){
    $query = mysql_query("SELECT * FROM userContests WHERE userID='$userID' AND contestID='$contestID';") or die(mysql_error()); 

    $getfreq = mysql_query("
            SELECT wp_term_relationships.term_taxonomy_id 
            FROM wp_term_relationships 
            WHERE wp_term_relationships.object_id = $contestID
        "); 

    while ($row = mysql_fetch_assoc($getfreq)) {
        if ($value == 1){ // If the contest is liked
            if (mysql_num_rows($query) > 0) {  //if a value matching the userID and contest ID already exists in database
                 if ($row[term_taxonomy_id] == 345) { // if Daily entry, update the row with reminder date
                    echo "1";
                    mysql_query("UPDATE userContests SET value='$value', reminder= DATE_ADD(CURDATE(),INTERVAL 1 DAY) WHERE userID='$userID' AND contestID='$contestID';") or die(mysql_error());
                    $frequency = 'Daily';
                } else { // if anything other than above, insert the row with current date
                    echo "2";
                    mysql_query("UPDATE userContests SET value='$value', reminder= CURDATE() WHERE userID='$userID' AND contestID='$contestID';") or die(mysql_error());
                }
            } else { // if there is no previous row in database matching userID and contestID
                if ($row[term_taxonomy_id] == 345) { // if Daily entry, insert the row with reminder date
                    echo "3";
                    mysql_query("INSERT INTO userContests (userID, contestID, value, reminder) VALUES ('$userID', '$contestID', '$value', 'DATE_ADD(CURDATE(),INTERVAL 1 DAY)') ") or die(mysql_error());
                } else { // if anything other than above, insert the row with current date
                    echo "4";
                    mysql_query("INSERT INTO userContests (userID, contestID, value, reminder) VALUES ('$userID', '$contestID', '$value', CURDATE()) ") or die(mysql_error());
                }
            }
        } else if ($value == 0){ // if the value is disliked
            if (mysql_num_rows($query) > 0) {  //if a value matching the userID and contest ID already exists in database, simply update the row without reminder
                echo "5";
                mysql_query("UPDATE userContests SET value='$value' WHERE userID='$userID' AND contestID='$contestID';") or die(mysql_error());
            } else { // if there is no previous row in database matching userID and contestID, simply insert the row without reminder
            echo "6";
                mysql_query("INSERT INTO userContests (userID, contestID, value) VALUES ('$userID', '$contestID', '$value') ") or die(mysql_error());
            }
        }
    }
}

私のコードは動作します。並べ替え。私の問題は、挿入コードが自分のデータベースに 5 回挿入されていることです。一度だけ挿入したい。

コード内のエコーはデバッグに役立ちます。エコーとして 4 4 3 4 4 を受信して​​います。

問題の原因がループであることはわかっていますが、問題を解決する方法がわかりません。

コードを 5 回挿入する理由は、コードがループするときに $row = 345 かどうかを確認するためだと推測しました。最初の 2 回と最後の 2 回はそうでないため、コードは echo に従って挿入されます4 3 番目のループでは、一致があるため、エコー 3 に従って挿入されます。

今、私は in_array() を認識していますが、mysql クエリのコンテキストでそれを使用する方法がわかりません。これが解決策になるのではないかと思います...

誰でも助けることができますか?

4

2 に答える 2

3

これは非常に紛らわしいですが、私は勝手な推測をしています。

結果セットで '345' エントリを検索し、見つかった場合は何かを実行し、見つからなかった場合は別のことを実行したいと考えていますよね?

いずれにせよ、これを行う方法は次のarray_search();とおりです。

$resultSet= mysql_get_assoc($getfreq);

if ( array_search(345,$resultSet) !== false )
{

# - 345 Is here!!! -

//do what you gotta do...


}

else
{

# - 345 is not in $resultSet -

//do something else here

}
于 2012-07-22T02:57:05.667 に答える
2

ループにエラーはないと思います。

SQLの挿入にある変数を更新することは決してありません。

つまり、$ getfreqに5つの値があり、3番目の値は345であるため、「3」の分岐が発生し、他のすべての場合は「4」の分岐が発生します。他の変数はこれまで変更されていません。

あなたはこの枝に入ります

           if ($row[term_taxonomy_id] == 345) { // if Daily entry, insert the row with reminder date
                echo "3";
                mysql_query("INSERT INTO userContests (userID, contestID, value, reminder) VALUES ('$userID', '$contestID', '$value', 'DATE_ADD(CURDATE(),INTERVAL 1 DAY)') ") or die(mysql_error());
            } else { // if anything other than above, insert the row with current date
                echo "4";
                mysql_query("INSERT INTO userContests (userID, contestID, value, reminder) VALUES ('$userID', '$contestID', '$value', CURDATE()) ") or die(mysql_error());
            }

3番目のケースでは、「3」ブランチに入り、挿入されます。

ただし、他のすべての場合、この行は実行されます

                mysql_query("INSERT INTO userContests (userID, contestID, value, reminder) VALUES ('$userID', '$contestID', '$value', CURDATE()) ") or die(mysql_error());

あなたはそれをelse枝に持っているからです。

ループをまったく実行せず、一度だけチェックしたい場合は、次のようなことを行う必要があります。

$getfreq = mysql_query("
        SELECT COUNT(taxonomy_id) AS freq
        FROM wp_term_relationships 
        WHERE wp_term_relationships.object_id = $contestID
         AND wp_term_relationshis.taxonomy_id = 345
    ");    

$data = mysql_fetch_assoc($getfreq);

if ($data['freq'] > 1) {
    //do something
} else {
    //do something else
}

私は頭のてっぺんからそれをやっているので、私はそれを正しく書いたことを願っています:)

複数の値を確認する場合は、次のことを試してください。

$getfreq = mysql_query("
        SELECT DISTINCT term_taxonomy_id
        FROM wp_term_relationships 
        WHERE wp_term_relationships.object_id = $contestID
    ");    

while ($row = mysql_fetch_assoc($getfreq)) {
    $taxonomy_id = $row[term_taxonomy_id];
    $seen[$taxonomy_id] = 1;
}

if ($seen[334]) {
   //something
} else if ($seen[456]) {
   //something else
} else {
   //last branch
}
于 2012-07-22T02:23:46.903 に答える