不同的图像取决于用户是否已经投票

时间:2009-06-03 05:41:11

标签: php

我正在开发一个链接投票网站,我有这个功能,检查用户是否已经投票链接:

function  has_voted($user) 
    {
       try
        {
            $db = parent::getConnection();
            $query = "select id from votes where username = '$user' and article_id  = $this->id";
            $results = parent::execSQL($query);
            if($results->num_rows == 1) {
                return true;                 
            }
            else 
            {
                return false;
            }            
            parent::closeConnection($db);

        }
        catch(Exception $e){
            throw $e;
        }       
    }

在首页,我会显示一个图像,用这行投票:

  <a href="/index.php?action=vote&amp;param=<?php echo $articles[$index]->getId(); ?>">
<img class="vote_button" src="assets/images/triangulo.png" />
</a>

如果用户已经投票,我希望它插入“if”来显示不同的图像,我试过这个,但它显示错误:

    <a href="/index.php?action=vote&amp;param=<?php echo $articles[$index]->getId(); ?>">
<?php if($articles[$index]->has_voted($articles[$index]->getUsername()) == true) 
{ ?><img src="assets/images/triangulo.png"/></a><?php } 
else 
{ ?><img class="vote_button"  src="assets/images/triangulo2.png" /></a><?php } ?>

+++编辑:

Schnalle,

感谢分析,这就是我所做的:

  • 好吧我把parent :: closeConnection($ db)取出来了,谢谢

  • 我也试图删除catch语句但是我收到了这个错误:Parse error: syntax error, unexpected '}', expecting T_CATCH in /home/mexautos/public_html/kiubbo/data/article.php on line 155

  • 我在这里得到了用户名,我不知道它是否足够安全:

    function getUsername(){         返回$ this-&gt; username;     }

    我尝试使用此代码来清理它:

    $ query = sprintf(“从投票中选择id,其中username ='$ user'和article_id = $ this-&gt; id”,             mysql_real_escape_string($用户),             mysql_real_escape_string($密码));

    但我收到了mysql_real_escape行的错误:

警告:mysql_real_escape_string()[function.mysql-real-escape-string]:在/ home / mexautos / public_html / kiubbo / data / article中拒绝用户'mexautos'@'localhost'(使用密码:NO)第145行的.php     警告:mysql_real_escape_string()[function.mysql-real-escape-string]:无法在第145行的/home/mexautos/public_html/kiubbo/data/article.php中建立到服务器的链接     警告:mysql_real_escape_string()[function.mysql-real-escape-string]:在/home/mexautos/public_html/kiubbo/data/article.php上拒绝用户'mexautos'@'localhost'(使用密码:NO)访问第146行     警告:mysql_real_escape_string()[function.mysql-real-escape-string]:无法在第146行的/home/mexautos/public_html/kiubbo/data/article.php中建立到服务器的链接

  • 一旦解决了这个问题,我会在外面关闭标签,我不确定它是否单独工作。

  • 你是对的我得到了错误的变量。我改为$ _SESSION ['user']并且它有效!

  • 我明白你的意思:不是用循环编写链接而只是选择它们并将它们写下来,我会检查它以了解如何操作。

  • 我为此使用了id,让我实现它。

谢谢, CS

1 个答案:

答案 0 :(得分:9)

  

如果用户已经投票,我希望它插入“if”以显示不同的图片,我试过这个但是显示错误

错误?啊,哈!可能有问题......有错误。我的建议:用扫帚或大声的噪音消除错误,那么你的代码可能会起作用。

如果这没有帮助,请尝试忽略它们。错误需要你的关注。这就是PHP(以及大多数其他编程语言)中有如此多的错误消息通知的原因。通知是小宝贝的错误,但还不危险,但是当它们完全成长时,它们可以取消比它们更大的应用程序。
事实上:如果你忽视它们,它们往往会因为无聊而消失。

但如果你得到一些仍然不会消失的非常一致的错误,可能会有另一种策略:

在互联网上发布错误的不雅照片,最好是在SO上(SO是程序员TMZ)。错误是一种骄傲和虚荣,所以他们中的大多数都是如此惭愧,他们躲在岩石下哭泣,直到整个事情都被雾化。 只有在没有心的情况下才能这样做。

<强>更新

我不想在这里不友好或不礼貌,只是你的代码有很多问题,我取笑你告诉我们的事实 WERE 错误消息,但你没有告诉我们他们说什么。所以我们知道“它不起作用”,但仍然只能猜测...而且,它没有帮助“擦除那3行代码”,或者它可能。哪3行? 3条随机线?问题:它看起来不错,没有明显的语法错误或任何东西。它可以工作。但它是以荒谬的方式完成的。

  • 首先,parent::closeConnection($db);是死代码,因为函数返回true或false,并且永远不会到达下面的代码(parent::closeConnection($db); )。这不会造成任何损害,因为通常数据库连接会在脚本结束时自动关闭。如果getConnection返回现有句柄,那么这种方式可能更好,否则它会为每个查询打开/关闭连接。 是的,那很糟糕。要么在脚本开头打开一次连接,要么在第一次使用时打开连接。

  • 你的catch语句没有多大意义。你显然没有处理错误,你只是传递了异常(我甚至不确定这是否合法。你可以通过忽略整个异常处理来实现同样的目的)。你在其他地方处理它吗?

  • sql-query中的用户名字符串未被转义,因此攻击者可能会将其用于sql-injection。取决于您从哪里获取用户名。你确定你清理了一切吗?

  • 你打开if语句之外的a-tag,但是在里面关闭它。这不是非法的,因为它有效。但它很难看。而且,即使你已经投票,你仍然有链接很好。所以,你可以不止一次投票?我对此表示怀疑。我认为你应该能够撤回你的投票,但不管怎样,最好还是单独采取行动。也许投票和不投票?可读性,可维护性,我不是你的母亲,但请保持你的代码库清洁(是的,我是一个伪君子)。

让我们分析你的if语句:

if($articles[$index]->has_voted($articles[$index]->getUsername()) == true) { ...

有点臭:$articles[$index]->getUsername()。我假设$article->getUsername()返回文章作者的用户名。 所以你要检查文章的作者是否已经在他自己的文章上投票。你可能想要做的事情是将所有帖子标记为访问者,而不是 AUTHOR 已投票。我们无法帮助您,因为我们不知道获取访问者数据的代码($ _SESSIONish)。

  • 因此,假设您要标记用户已投票的文章。和kiubbo在它的首页上显示了30篇文章。这意味着你在一个循环中运行sql-queries,当你需要为零时,每个页面视图都有30个查询。为什么零而不是一个?因为当你选择文章时,你应该LEFT OUTER JOIN关于投票的文章。另一方面,我假设你为一些额外的SQL服务器和熟练的复制舞蹈赚了很多钱。

  • 这个并不重要,但是......你在用户名上做了选择。有没有ID?比如,主键INT(11)authorID?

现在已经足够了。