-1

我有以下代码,它使用用户 ID、值(喜欢或不喜欢)和提醒日期来更新我的数据库,只要用户“喜欢”比赛(这是一个帖子)。

$query 查看我的 userContests 表并存储它的全部内容。

userContests 表存储用户 ID、值(喜欢或不喜欢)、竞赛 ID 和提醒日期。

$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。由于前两次和最后两次没有,代码按照 echo 插入4 在第三个循环中,它根据 echo 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 个值,第三个是 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”分支并被插入。

但是,在所有其他情况下,都会执行此行

                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 回答