【问题标题】:PHP MySQL comparison always true regardless of operands and operator无论操作数和运算符如何,PHP MySQL 比较始终为真
【发布时间】:2012-02-11 13:36:01
【问题描述】:

为了记录,我阅读了有关 PHP 中布尔比较的文档,但我不明白我的代码在这种情况下是如何关联的。我以为我在连接 MySQL 时遇到了问题,但事实证明一切都很好,我可以毫无问题地进行查询。所以,MySQL 与这篇文章并没有那么相关。

我使用它来报告试图在构造时连接的对象中的错误。请注意,我尝试了 ==、===、!= 和 !== 只是为了得到同样的问题。我什至尝试将参数转换为 bool 和 boolean。

以下代码块中的注释是相关的。

private function assert($test){ // Tried renaming in case PHP was funny about it.
    if ($test === FALSE){ // Tried ==, ===, !== and != and casting $test.
        if ($this->use_exception){
            throw new mysql_exception();
        }else{
            die("MySQL ".mysql_errno()." - ".mysql_error());
        }
    }
}

连接是典型的。

$this->con = mysql_connect($host, $un, $pw, false, $ssl ? MYSQL_CLIENT_SSL : 0);

// I get 'yay'
echo mysql_ping($this->con) ? "yay" : "nay";

// This disagrees. Tried no cast, and a cast to bool.
$this->assert((boolean)($this->con != FALSE));

mysql_ping() 表示一切正常,但 assert() 无论如何都会停止印刷机。

我尝试了每个运算符和演员组合,甚至出于对名称冲突的偏执而重命名了函数。为什么 assert() 只看到 true?

编辑:

为了使我的问题更清楚,请考虑使用 Eugen 建议使用 is_resource 的替代实现。问题是我不知道为什么会发生以下情况。

private function assert($test){
    $test = $test ? true : false;
    if ($test === FALSE){
        echo "$test === false<br />";
    }
    if ($test == FALSE){
        echo "$test == false<br />";
    }
    if ($test !== FALSE){
        echo "$test !== false<br />";
    }
    if ($test == FALSE){
        echo "$test != false<br />";
    }
}

输出无序,经过一次比较后值发生变化。因为我可以进行查询,所以 $test 必须为真。我根本不应该得到输出,但我为每个操作员做。我也试过用 0 代替 FALSE。

错误的 PHP 实例?

1 !== false
=== false
!== false
!= false

【问题讨论】:

  • 你作为 $test 传递了什么?
  • 你从mysql_ping得到yay,这意味着$this-&gt;con实际上不是FALSE,这意味着$this-&gt;con != FALSE应该像它一样评估为true...
  • 那么问题出在哪里?正如我从您的帖子中了解到的那样,连接成功并且该函数返回一个链接标识符,它应该始终断言为 true .. L.E.:手册说“成功返回 MySQL 链接标识符,失败返回 FALSE。”所以我想你应该测试if ($this-&gt;con === FALSE)
  • @Mchl $this-&gt;con != FALSE 评估为true 应该意味着($test === FALSE)评估为false,而不是“停止印刷机”,我怀疑OP的意思是“为什么只断言()见假”

标签: php mysql windows xampp boolean


【解决方案1】:

你不能使用你的第二个例子并结合这个功能吗?你已经得到了一个值(是/否)

$this->con = mysql_connect($host, $un, $pw, false, $ssl ? MYSQL_CLIENT_SSL : 0);
$this->assert = mysql_ping($this->con) ? 1 : 0;

只是大声思考

【讨论】:

  • 除非 assert 是一个可以做某事的函数 .. 对不起,如果我弄错了,assert 不仅仅是一个布尔数据点。
  • 查看您的代码,您的意思是让 $this->assert 为 __set 使用的属性吗?至于检查 $this->connect() 中的值,我更愿意在单独的方法中进行错误检查,这样我就不必在整个类定义中使用 die()、mysql_error() 和 mysql_errno()。编辑:是的,这是一种方法。
  • 使用您的代码,您是否希望 $this->assert 是 0 或 1 的布尔值?我的代码应该可以解决问题,然后您可以添加“if ($assert) { mysqlquery and like }” ...断言不是预定义的函数或方法,对吗?查看上面的代码,您正在定义 assert 函数以执行与我的代码行类似的功能。
【解决方案2】:
$this->assert(is_resource($this->con));

【讨论】:

  • 感谢您抽出宝贵时间做出贡献!我试过这一行,但结果是一样的:不管我如何告诉它解释参数,assert() 仍然会杀死脚本。
  • 我在 OP 中添加了一个新示例。
猜你喜欢
  • 1970-01-01
  • 2015-05-31
  • 2013-08-25
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
  • 2021-10-04
  • 2010-12-16
相关资源
最近更新 更多