PHP更新MySQL循环

时间:2012-07-22 02:01:06

标签: php mysql arrays loops insert

我有以下代码,每当用户“喜欢”比赛(这是一个帖子)时,用userID,值(喜欢或不喜欢)和提醒日期更新我的数据库。

$ 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.由于前两次和后两次它没有,代码插入根据echo 4,当它在第3个循环时,它根据echo 3插入,因为匹配。

现在,我知道in_array()但不知道如何在我的mysql查询的上下文中使用它。我怀疑这可能是解决方案......

有人可以帮忙吗?

2 个答案:

答案 0 :(得分: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

}

答案 1 :(得分: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
}