我正在为我正在开发的网站做一些徽章系统,并在检查我的MySQL数据库时遇到困难。
我想检查用户是否已获得徽章,如果没有,请将其放入。
这是我的代码:
$userid = $_SESSION['userid'];
$badgename = "222asd";
$results=mysql_query("SELECT 1 FROM badges WHERE badge = '$badgename' AND mid = '$userid'");
if ($results>0)
{
echo 'You already have this badge';
}
else
{
echo 'You deserved a new badge';
}
问题是,即使我将$ badgename变量更改为数据库中没有的内容,我总是会收到消息“你已经拥有此徽章”。
那我在这里做错了什么?
编辑: 我现在尝试使用MySQLI,因为你推荐了。关于这一点,我有一些问题要问你。
$numberofposts=$row['posts'];
$userid = $_SESSION['userid'];
$badgename = "222asd551222";
if($numberofposts >= 10){
$results=mysqli_query("SELECT 1 FROM `badges` WHERE `mid`='$userid' AND 'badge' = '$badgename'");
if($results->num_rows <= 0) {
mysqli_query("INSERT INTO badges ('mid', 'badge') VALUES ('$userid', '$badgename')");
}
}
那我在这里做错了什么?
谢谢, 迈克尔
答案 0 :(得分:4)
好的,还有一些事情正在发生。首先,让我们解决您的问题:
$results=mysql_query("SELECT 1 FROM badges WHERE badge = '$badgename' AND mid = '$userid'");
if ($results>0) {
由于$ results是资源,因此始终返回&gt;所以改变它是这样的:
if (mysql_num_rows($results) > 0) {
其次,为什么不SELECT badge FROM badges
,而不是(看起来很奇怪)SELECT 1
......
而且,不要使用 mysql。它是deprecated。选择其他database API
答案 1 :(得分:1)
你需要调用mysql_num_rows,例如像这样
<?php
mysql_connect(/* user, ... */);
$userid = $_SESSION['userid'];
$badgename = "222asd";
$results=mysql_query("SELECT 1 FROM badges WHERE badge = '$badgename' AND mid = '$userid' LIMIT 1");
if (mysql_num_rows($results) > 0)
{
echo 'You already have this badge';
}
else
{
echo 'You deserved a new badge';
}
正如cale_b指出并且手册指出:mysql_ *函数已被弃用,并且将在不久的将来从PHP中删除。
我会推荐这样的东西(额外的好处是,参数中的任何'
或watherver都会被正确转义:
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$userid = $_SESSION['userid'];
$badgename = "222asd";
$query = $dbh->prepare("SELECT 1 FROM badges WHERE badge = :badgename AND mid = :userid LIMIT 1");
$query->execute(array(':badgename' => $badgename, ':userid' => $userid)) or die("Could not execute statement");
if ($query->rowCount() > 0) {
echo 'You already have this badge';
} else {
echo 'You deserved a new badge';
}
另请注意,我在您的陈述中添加了LIMIT 1
,因为您似乎不想知道用户拥有多少这种类型的徽章;这样,您的查询将运行得更快,因为数据库不需要在第一个之后查找任何进一步的匹配。
More information on using PDO现在也捆绑了PHP。
答案 2 :(得分:0)
您可以使用计数,在mysql_num_rows
$row = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM badges WHERE badge = '$badgename' AND mid = '$userid'"));
if ($row[0]) ...
顺便说一句。你不应该将这样的变量插入到查询中。最好使用新的mysqli扩展并使用预准备语句。如果这不适合您,那么在将变量插入sql语句之前,至少应该将mysql_real_escape_string
调用到变量上。