如果忽略检查选择查询的语句

时间:2015-06-25 19:44:26

标签: php mediawiki mediawiki-extensions

我收到了以下代码:

if(isset($_POST['vote'])){

        if (!$wgUser->isLoggedIn()) {
            // User is not online, don't accept the vote, set error message
            $msg = 'Login required to vote.';
        } if ($wgUser->isBlocked()) {
            // User is banned, don't accept the vote, set error message
            $msg = 'Account is banned.';
        } else {
            // User is online and not banned
            $buildId = htmlspecialchars($_POST['id'], ENT_QUOTES, 'UTF-8');
            $rating = htmlspecialchars($_POST['rating'], ENT_QUOTES, 'UTF-8');
            $comment = htmlspecialchars($_POST['comment'], ENT_QUOTES, 'UTF-8');
            $res = $db->select(
                'build_rating',
                array('article_id', 'username', 'vote', 'comment', 'date'),
                array('article_id' => $buildId, 'username' => $wgUser->getName()),
                __METHOD__
            );

            // Did user already vote on this build?
            if (!$res) {
                // Yes, let's update the vote and set success message
                $db->update(
                    'build_rating',
                    array('vote' => $rating, 'comment' => $comment),
                    array('article_id' => $buildId, 'username' => $wgUser->getName()),
                    __METHOD__
                );
                $msg = 'Your vote has been successfully updated.';

            } else {
                // No, let's insert the vote and set success message
                $db->insert(
                    'build_rating',
                    array('article_id' => $buildId, 'username' => $wgUser->getName(), 'vote' => $rating, 'comment' => $comment),
                    __METHOD__
                );
                $msg = 'Your vote has been successfully saved.';
            }
        }
    }

用于保存特定文章的用户评分。除了检查用户是否已经投票的if语句(在这种情况下它应该只是更新评级)或者它是一个全新的投票(在这种情况下它应该将其保存为新投票)之外,一切似乎都正常工作。出于某种原因,if语句不起作用,因为每个投票都被保存为新的投票。当用户实际上每篇文章只能放置一张时,用户可以简单地投100票。有人可以指出我的错误吗?

4 个答案:

答案 0 :(得分:1)

我不确定是什么数据库库,但是调用select()可能会返回一个迭代器。

if (count($res) == 0) {
    // update    
}

答案 1 :(得分:1)

我设法解决了这个问题,您需要输入以下if ($res->numRows())

答案 2 :(得分:0)

不是按照建议计算$ res中的行,也可以使用selectRow()而不是select()。 selectRow将返回(第一个)匹配行,如果没有则返回false。

答案 3 :(得分:0)

只需使用upsert();这将在单个查询中执行select / insert / update组合。 PHP代码看起来更简单,操作将是atomic,这将免除所有令人讨厌的竞争条件错误。