SELECT 1 FROM和if语句

时间:2014-02-23 00:14:41

标签: php mysql select if-statement mysqli

我正在为我正在开发的网站做一些徽章系统,并在检查我的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')");
}


}

那我在这里做错了什么?

谢谢, 迈克尔

3 个答案:

答案 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调用到变量上。