我正在开发一个链接投票网站,我有这个功能,检查用户是否已经投票链接:
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&param=<?php echo $articles[$index]->getId(); ?>">
<img class="vote_button" src="assets/images/triangulo.png" />
</a>
如果用户已经投票,我希望它插入“if”来显示不同的图像,我试过这个,但它显示错误:
<a href="/index.php?action=vote&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
答案 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?
现在已经足够了。