我的函数总是返回一个布尔值而不是查询结果

时间:2012-11-28 17:00:46

标签: php mysqli

我有一个应用程序读取其中一个类:

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);
   }
}

我出错的任何想法?

3 个答案:

答案 0 :(得分:3)

这是不正确的。赋值运算符(=)的优先级高于文字&#34;或&#34;运营商。 (不要与&#34; ||&#34;运算符混淆,运算符的优先级高于&#34; =&#34 ;.)

mysqli::query()中似乎存在一个错误,导致它返回布尔值&#34; true&#34;在极少数情况下,在select语句中。 (合法返回值将是布尔值&#34; false&#34;或mysqli_result对象。)

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

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

结果:

bool (false)

这是因为上述作业相当于:

($a = false) or true;

答案 1 :(得分:0)

此问题中的问题与mysqli_query()功能无关,而与operator precedence无关。

在那里,=运算符比OR运算符具有更高优先级,意味着赋值将在OR之前执行(我在详细解释了此行为)另一个答案是mysqli or die, does it have to die?

问题在于

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

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

但是为什么脚本实际上不会因逻辑运算符执行而死?

由于逻辑运算符执行优化在上面的链接的答案中解释。 PHP并不打算真正执行最右边的运算符。最左边的运算符已经评估为true,这意味着整个表达式将以任意方式返回true。 / p>

要解决此问题,必须以这种方式更改函数的代码:

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的值。

答案 2 :(得分:-1)

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