我有一个应用程序读取其中一个类:
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);
}
}
我出错的任何想法?
答案 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)时,它将输出函数所说的任何输出。通常这样做是为了隐藏父类的私有和受保护函数。