我的函数总是返回一个布尔值,而不是查询结果
我有在类中的一个读取应用:我的函数总是返回一个布尔值,而不是查询结果
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);
}
}
任何想法,我要去的地方错了吗?
这是不正确的。赋值运算符(=
)的优先级高于文字“或”运算符。 (不要与“||
”运算符,它具有比“=
”更高的优先级相混淆。)
似乎有是在mysqli::query()
一个bug,导致它返回布尔“真”,在极少数情况下上一个选择语句。 (合法的返回值是布尔“假”或mysqli_result
对象)
你不必相信我这句话断言,您可以轻松地尝试一下自己在PHP外壳:
$a = false or true;
var_dump($a);
结果:
bool (false)
这是因为上述分配等同于:
($a = false) or true;
有没有赋值操作符 –
事实上有:$ this-> records = $ this-> db-> query(“SELECT * FROM major”)或者die(“ERROR:”。$ this-> > DB->错误); – user7018291
他的问题在代码中较早。所讨论的函数不是你引用的'Database :: query',而是用前者调用的'mysqli :: query'。 'return $ this-> con> query($ qry)or die()'是问题陈述 –
答案就是所谓的魔法。 PHP的一个神奇方法叫做__debugInfo()。如果定义了这个魔法方法,当你调用var_dumb(obj)时,它将输出无论函数说什么输出。这通常是为了隐藏父类的私有和受保护的函数。
此问题与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
的值。
@YourCommonSense,这里的问题/赏金仍然相关吗?我不太确定究竟是什么问题。你能澄清一下吗? – Dekel
如果查询不是'select'查询(例如更新/插入),'mysqli :: query'的结果将不是** result_set,而是布尔值。也许这里什么都不清楚? – Dekel