【问题标题】:mysql_num_rows in an if statementif 语句中的 mysql_num_rows
【发布时间】:2012-03-25 07:18:19
【问题描述】:

我面临的问题是,mysql_num_rows 在整个代码中给了我一个 1 的输出,但是当我在 if 语句中将它匹配为 0 时,它返回 true 并执行代码。 所以 $license 返回 ..... 而不是它的实际值。

我尝试自己使用这些来调试问题。

  • 尝试 print_r 查看数据是否存在。 - 是的。
  • 尝试在第一部分回显 $license - 返回正确的值。
  • 尝试检查 mysql_num_rows 的值 - 返回 1。
  • 在 if 语句中将其与 0 匹配 - 当它应该为 false 时返回 true,因为值为 1。

有什么帮助吗?

$check = mysql_query("SELECT * FROM licenses WHERE email='$email'") or die(mysql_error
                                                                           ());
if (mysql_num_rows($check) > 0)
{
    while ($data = mysql_fetch_array($check))
    {
        print_r($data); // for test
        $name = $data['name'];
        $license = $data['pid'];
        echo $license; // test print 1
        $comments = $data['comments'];
    }

    if ($license == "Sgsmorgan")
        $license = "EWP Discounted Basic (Simpleleveraging)";
}

$count = mysql_num_rows($check); // for test
echo $count; // returns 1.
if (mysql_num_rows($check) == 0)
    $name = "";
$license = "...........";
echo $license;// test print 2
$comments = "Email doesnt exist in the database";

【问题讨论】:

  • mysql 扩展已过时,即将弃用。新代码应该使用 mysqli 或 PDO,两者都有重要的优势,比如支持准备好的语句。说到,示例代码可能容易受到SQL injection 的攻击。参数化语句以关闭漏洞。
  • 除非您正在编写数据库管理程序,否则不要使用SELECT *;只选择您需要的列。
  • 为了便于阅读,请选择并申请indent style
  • 以后,请考虑在发布之前缩进您的代码。这将使发现错误变得更加容易。
  • 我同意你们的两个 cmets。我只是在学习这一点,所以我想我会编写一个可以工作的基本框架,然后将其修复以防止注射。关于 *,使用它,因为这比提到 3 个字段容易,但肯定会这样做。不过,我真的找不到我的代码哪里出错了。我已经多次检查了这些代码。

标签: php mysql-num-rows


【解决方案1】:

你的意思是这样的:

if (mysql_num_rows($check)==0)
{
    $name = "";
    $license = "...........";
    echo $license; //Test print 2
    $comments = "Email doesnt exist in the database";
}

而不是

if (mysql_num_rows($check)==0)
$name = "";
$license = "...........";
echo $license; //Test print 2
$comments = "Email doesnt exist in the database";

不使用大括号意味着只包含if 语句下面的第一行。所以$license 总是设置为...........

始终使用大括号。

【讨论】:

  • @Kishor - 为了证实迈克尔的理论,$name 最后设置的值是多少?
  • 修复了它。我会记住这一点,不会再重复这些东西了:)谢谢
  • @Kishor:我仍然每周都会收到来自if($x = 1) 而不是if($x == 1) 等条件的错误,所以我打赌你会再次重复各种事情。当它击中自己的头部时,你只会变得更好。
  • @Anthony,这就是为什么值得做if (1 == $x) 因为if (1 = $x) 会导致解析错误。它不那么直观,但不太容易出错(或者,如果您打开了错误报告,就很难错过错误)。
  • @Anthony:除了Yoda conditions,另一个常见的习惯用法是用额外的括号将条件中的有意赋值括起来:if (isset($foo) && ($foo = trim($foo))) {...}。在 Objective-C 之外(以及一些 linters),这不会产生任何通知,但会通知任何程序员不要将赋值更改为等价比较。
【解决方案2】:

我认为问题在于,此时已没有更多行了,因为您的 while 循环已获取所有行。

如果我没记错的话,这段代码:

while ($ignored = mysql_fetch_array($check)) {
    echo "Got a row! Rows left: " . mysql_num_rows($check);
}

应该输出类似:

Got a row! Rows left: 3
Got a row! Rows left: 2
Got a row! Rows left: 1
Got a row! Rows left: 0

【讨论】:

  • 只有 1 行 email='$email' 我在 if 语句中将 mysql_num_rows 的值与 0 匹配之前将其检查为 $count。 $count 为 0,if 语句也为真。
  • @Kishor - 好吧,如果不是 while 循环,那么如果将条件更改为:if ($count == 0),会发生什么?
  • 同样的事情发生了。很清楚是我错过了最后一个 if 语句下的大括号。 -_-
【解决方案3】:

跟进大卫的根本原因,这里有一个非常简单的解决方法:

$check = mysql_query("SELECT * FROM licenses WHERE email='$email'") 
         or die(mysql_error());

if (mysql_num_rows($check) > 0) {
    while ($data = mysql_fetch_array($check)) {
        $name    = $data['name'];
        $license = $data['pid'];
        $comments = $data['comments'];
    }

    $license = ($license == "Blahblah") ? "This is a second level license" : $license;

} else {
    $name = "";
    $license = "...........";
    $comments = "Email doesnt exist in the database";
}

【讨论】:

  • $license = ($license == "Blahblah") ? "这是二级许可证" : $license;似乎有点混乱,因为我只是在学习 php。无论如何,我在最后一个 if 语句下缺少大括号。
  • 是的,我在想,你错过它的部分原因是因为你养成了不在大括号中关闭单行条件的坏习惯,这是有效的,但很难做到阅读并可能很快导致忘记其他条件的打开和关闭位置。听从 Michael 的建议并始终使用花括号。我更改那一行(更改为称为ternary 的条件语法)的原因是因为它通常有助于清理一些您不想使用 3-5 行代码来设置 1 var 的地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多