首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >选择1 FROM和if语句

选择1 FROM和if语句
EN

Stack Overflow用户
提问于 2014-02-23 00:14:41
回答 3查看 123关注 0票数 0

我正在为一个我目前正在开发的网站做一些徽章系统,并且在检查我的MySQL数据库时被卡住了。

我想看看用户是否已经拿到了徽章,如果没有,就把它放进去。

这是我的代码:

代码语言:javascript
运行
复制
$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,因为你建议我这么做。关于这个我有一些问题要问你。

代码语言:javascript
运行
复制
$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')");
}


}

那我在这里做错什么了?

谢谢你,迈克尔

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-23 00:17:31

好吧,有几件事发生了。首先,让我们解决您的问题:

代码语言:javascript
运行
复制
$results=mysql_query("SELECT 1 FROM badges WHERE badge = '$badgename' AND mid = '$userid'");
if ($results>0) {

因为$results是一个资源,所以它总是返回> 0。所以把它改变成这样:

代码语言:javascript
运行
复制
if (mysql_num_rows($results) > 0) {

第二,为什么不SELECT badge FROM badges,而不是一个(奇怪的)SELECT 1.

而且,不使用 mysql。是已弃用。选择不同的数据库API

票数 4
EN

Stack Overflow用户

发布于 2014-02-23 00:29:57

你需要打电话给mysql_num_rows,就像这样

代码语言:javascript
运行
复制
<?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中删除。

我建议这样做(附加的好处是,参数中的任何'或犹豫不决都可以正确转义):

代码语言:javascript
运行
复制
<?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,因为您似乎不想知道用户有多少这种类型的标记;这样,查询就会运行得更快一些,因为DB不需要在第一个匹配之后再查找任何匹配项。有关使用PDO的更多信息现在也是捆绑使用PHP的。

票数 1
EN

Stack Overflow用户

发布于 2014-02-23 00:20:13

您可以使用count,在这些情况下,我更喜欢使用count,而不是mysql_num_rows

代码语言:javascript
运行
复制
$row = mysql_fetch_row(mysql_query("SELECT COUNT(*) FROM badges WHERE badge = '$badgename' AND mid = '$userid'"));
if ($row[0]) ...

顺便说一下。您不应该在查询中插入这样的变量。最好使用新的mysqli扩展,并使用准备好的语句。如果这不是您的选项,那么在将mysql_real_escape_string插入到sql语句之前,至少应该将它调用到变量上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21962470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档