2012-11-28 81 views
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查询应返回结果集。这是应用程序使用的唯一查询。

DB类:

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

任何想法,我要去的地方错了吗?

+0

@YourCommonSense,这里的问题/赏金仍然相关吗?我不太确定究竟是什么问题。你能澄清一下吗? – Dekel

+0

如果查询不是'select'查询(例如更新/插入),'mysqli :: query'的结果将不是** result_set,而是布尔值。也许这里什么都不清楚? – Dekel

回答

3

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

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

你不必相信我这句话断言,您可以轻松地尝试一下自己在PHP外壳:

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

结果:

bool (false) 

这是因为上述分配等同于:

($a = false) or true; 
+0

有没有赋值操作符 –

+0

事实上有:$ this-> records = $ this-> db-> query(“SELECT * FROM major”)或者die(“ERROR:”。$ this-> > DB->错误); – user7018291

+1

他的问题在代码中较早。所讨论的函数不是你引用的'Database :: query',而是用前者调用的'mysqli :: query'。 'return $ this-> con> query($ qry)or die()'是问题陈述 –

-1

答案就是所谓的魔法。 PHP的一个神奇方法叫做__debugInfo()。如果定义了这个魔法方法,当你调用var_dumb(obj)时,它将输出无论函数说什么输出。这通常是为了隐藏父类的私有和受保护的函数。

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

为了解决这个问题,该函数的代码已经被改变了这种方式:

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

相关问题