0

我有一个应用程序读取它的一个类:

public function __construct()
{
  global $config;
  //Establish a connection to the database and get results set
  $this->db = new Database("localhost",$config["dbuser"],$config["dbpass"],"student");
  $this->records = $this->db->query("SELECT * FROM major") or die("ERROR: ".$this->db->error);
  echo "<pre>".var_dump($this->records)."</pre>";
}

我的问题是这var_dump shows$this->records一个布尔值。我已经阅读了文档,发现 SELECT 查询应该返回一个结果集。这是应用程序使用的唯一查询。

数据库类:

  class Database
  {
      private $con;

     public function __construct($server,$user,$password,$database)
     {
        $this->con = new mysqli($server,$user,$password,$database) or die ("FATAL ERR: ".mysqli_error());
     }

    public function query($qry)
   {
     if(!isset($this->con)) die("ERROR: YOU ARE TRYING TO QUERY BEFORE THE CONNECTION IS ESTABLISHED!");
     return $this->con->query($qry) or die("FATAL ERROR:".$this->con->error);
   }
}

有什么想法我哪里出错了吗?

4

3 回答 3

3

这是不正确的。赋值运算符 ( =) 的优先级高于文字“或”运算符。(不要与“ ||”运算符混淆,它的优先级高于“ =”。)

中似乎有一个错误mysqli::query(),导致它在极少数情况下在 select 语句上返回布尔值“true”。(合法的返回值将是布尔“假”或mysqli_result对象。)

您不必相信我的断言,您可以自己在 PHP shell 中轻松尝试:

$a = false or true;
var_dump($a);

结果:

bool (false)

那是因为上面的赋值等价于:

($a = false) or true;
于 2016-10-14T09:15:04.830 回答
0

这个问题的问题与mysqli_query()功能无关,而与运算符优先级有关。

在那里,=运算符的优先级高于运算OR符,意味着将在之前执行分配OR(我在另一个答案中详细解释了这种行为,mysqli or die,它必须死吗?

问题线是

 return $this->con->query($qry) or die("FATAL ERROR:".$this->con->error);

在这里,return运算符(出于显而易见的原因)可能具有最低优先级。意味着第一个 PHP 将执行逻辑运算符,然后返回其结果 - 一个布尔值!

但是为什么脚本实际上并没有因为逻辑运算符的执行而死掉呢?

由于上面链接的答案中解释了逻辑运算符执行优化。PHP 不会费心去实际执行最右边的操作符。最左边的已经计算为 就足够了,这true意味着整个表达式将返回true任何一种方式。

为了解决这个问题,函数的代码必须这样改变:

public function query($qry)
{
    $ret = $this->con->query($qry) or trigger_error($this->con->error);
    return $ret;
}

而调用代码应改为简单

$this->records = $this->db->query("SELECT * FROM major");
echo "<pre>".var_dump($this->records)."</pre>";

调用,因为第二次检查错误是没有意义的——这个函数永远不会返回一个类似false的值。

于 2016-10-16T19:00:56.780 回答
-1

答案将在所谓的魔术方法中。PHP 的神奇方法之一称为 __debugInfo()。如果定义了这个魔法方法,当你调用 var_dumb(obj) 时,它将输出函数所说的任何内容。通常这样做是为了隐藏父类的私有和受保护功能。

于 2016-10-15T20:03:26.083 回答