我正在开发一个链接投票网站,我有这个功能,检查用户是否已经投票链接:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
在首页我显示一个图像用这行投票:
<a href="/index.php?action=vote&param=<?php echo $articles[$index]->getId(); ?>">
<img class="vote_button" src="assets/images/triangulo.png" />
</a>
Run Code Online (Sandbox Code Playgroud)
如果用户已经投票,我希望它插入"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 } ?>
Run Code Online (Sandbox Code Playgroud)
+++编辑:
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(){return $ this-> username; }
我尝试使用此代码来清理它:
$ query = sprintf("select where from votes where username ='$ user'和article_id = $ this-> id",mysql_real_escape_string($ user),mysql_real_escape_string($ password));
但我得到mysql_real_escape行的这个错误:
警告:mysql_real_escape_string()[function.mysql-real-escape-string]:在/home/mexautos/public_html/kiubbo/data/article.php上拒绝用户'mexautos'@'localhost'(使用密码:NO)访问第145行警告: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]:对第146行/home/mexautos/public_html/kiubbo/data/article.php中用户"mexautos"@"localhost"(使用密码:NO)的访问被拒绝警告: mysql_real_escape_string()[function.mysql-real-escape-string]:无法在第146行的/home/mexautos/public_html/kiubbo/data/article.php中建立到服务器的链接
一旦我解决了这个问题,我会在外面关闭标签,我不确定它是否单独工作.
你是对的我得到了错误的变量.我改为$ _SESSION ['user']并且它有效!
我明白你的意思:不是用循环编写链接而是选择它们并将它们写下来,我会检查它以学习如何去做.
我为此使用id,让我实现它.
谢谢,CS
如果用户已经投票,我希望它插入"if"来显示不同的图像,我尝试了这个,但它显示了错误
错误?啊,哈!可能有问题......有错误.我的建议:用扫帚或大声的噪音消除错误,然后你的代码可以工作.
如果这没有帮助,请尝试忽略它们.错误需要你的关注.这就是为什么在PHP(和大多数其他编程语言)中有如此多的错误消息和通知.通知是小宝贝错误,但还不危险,但是当完全成长时,他们可以取消比他们更大的应用程序.
事实上:如果你忽视他们,他们往往会因为无聊而离开.
但如果你得到一些仍然不会消失的非常一致的错误,可能还有另一种策略:
发布互联网上错误的不雅照片,最好是在SO上(SO是程序员TMZ).错误是骄傲和虚荣的,所以他们中的大多数都是如此惭愧,他们躲在岩石下哭泣,直到整个事情都被雾化.只有你没有心脏才能这样做.
更新:
余did't想不友善或不礼貌在这里,它只是有很多东西你的代码错误,我做的,你告诉我们,有一个事实乐趣WERE错误消息,但你并没有告诉我们,他们说.所以我们知道"它不起作用"仍然只能猜测...而且,它没有帮助"擦除那3行代码",或者它可能会.哪3行?3条随机线?问题:它看起来不错,没有明显的语法错误或任何东西.它可以工作.但它是以荒谬的方式完成的.
首先,parent::closeConnection($db);是死代码,因为函数返回true或false,并且永远不会到达parent::closeConnection($db);
下面的code().这不会造成任何损害,因为通常数据库连接会在脚本结束时自动关闭.如果getConnection返回现有句柄,那么这种方式可能更好,否则它会为每个查询打开/关闭连接.是的,那很糟糕.要么在脚本开头打开连接,要么在第一次使用时打开连接.
你的捕获声明没有多大意义.你显然没有处理错误,你只是传递了异常(我甚至不确定这是否合法.你可以通过忽略整个异常处理来实现同样的目的).你在其他地方处理它吗?
你的sql-query中的username-string没有被转义,所以攻击者也许可以用它来进行sql-injection.取决于您从哪里获取用户名.你确定你清理了一切吗?
你打开if语句之外的a-tag,但是在里面关闭它.这不是非法的,因为它有效.但它很难看.而且,即使你已经投票,你仍然有链接很好.所以,你可以不止一次投票?我对此表示怀疑.我认为你应该能够撤回你的投票,但不管怎样,最好还是单独采取行动.也许投票和不投票?可读性,可维护性,我不是你的母亲,但请保持你的代码库清洁(是的,我是一个伪君子).
让我们分析你的if语句:
if($articles[$index]->has_voted($articles[$index]->getUsername()) == true) { ...
Run Code Online (Sandbox Code Playgroud)
有点臭:$articles[$index]->getUsername().我假设$article->getUsername()返回文章作者的用户名.所以你要检查文章的作者是否已经对自己的文章进行了投票.您可能想要做的是将所有帖子标记为VISITOR,而不是已经投票的AUTHOR.我们无法帮助您,因为我们不知道获取访问者数据的代码($ _SESSIONish).
因此,假设您要标记用户已投票的文章.和kiubbo在它的首页上显示了30篇文章.这意味着你在一个循环中运行sql-queries,当你需要为零时,每个页面视图都有30个查询.为什么零而不是一个?因为当你选择文章时,你应该LEFT OUTER JOIN关于投票的文章.另一方面,我假设你有一些额外的SQL服务器和熟练的复制舞蹈.
这个并不重要,但是...你在用户名上做了选择.有没有ID?比如,主键INT(11)authorID?
现在够了.