【问题标题】:SELECT 1 FROM and if statementSELECT 1 FROM 和 if 语句
【发布时间】:2014-02-23 00:14:41
【问题描述】:

我正在为我目前正在开发的网站做某种徽章系统,但在检查我的 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')");
}


}

那么我在这里做错了什么?

谢谢, 迈克尔

【问题讨论】:

    标签: php mysql select if-statement mysqli


    【解决方案1】:

    好的,有一些事情正在发生。首先,让我们解决您的问题:

    $results=mysql_query("SELECT 1 FROM badges WHERE badge = '$badgename' AND mid = '$userid'");
    if ($results>0) {
    

    由于 $results 是 一个资源,它会总是返回 > 0。所以改成这样:

    if (mysql_num_rows($results) > 0) {
    

    其次,为什么不SELECT badge FROM badges,而不是(看起来很奇怪)SELECT 1...

    而且,不要使用 mysql。它是deprecated。选择不同的database API

    【讨论】:

    • 谢谢,它工作正常!肯定会研究mysqli和PDO。它们与 MySQL 的最大区别是什么?
    【解决方案2】:

    您需要调用 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 捆绑在一起。

    【讨论】:

      【解决方案3】:

      您可以使用 count,在这些情况下我更喜欢使用计数而不是 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 到变量上。

      【讨论】:

        猜你喜欢
        • 2020-09-04
        • 1970-01-01
        • 2014-02-15
        • 2021-03-13
        • 1970-01-01
        • 1970-01-01
        • 2016-05-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多