我真的很困惑。
此查询在localhost上完全正常,但在任何实际的实时服务器上都不行。对同一数据库的其他查询有效,因此连接或pdo扩展没有任何问题。
基本上这是查询:
$sql = "SELECT * FROM bksb_Resources";
$query = $this->connection->query($sql, array());
query()方法返回PDOStatement对象
然后我在循环中调用$this->connection->fetch($query)
,然后循环路由到"连接"上的方法。对象:
function fetch_pdo($st)
{
return $st->fetch();
}
所以基本上它是从一张桌子中选择所有内容然后返回第一行(它是一个循环,但那并不是真的相关)。
在localhost上,这很好。没问题。
在我的实时服务器上,我得到:
Fatal error: Cannot access empty property in /var/www/html/demo/blocks/elbp/classes/db/MSSQL.class.php on line 652
其中第652行是从上面的fetch_pdo方法返回的。
我在运行fetch()之前打印出语句,并且在两台服务器上都没问题:
PDOStatement Object
(
[queryString] => SELECT * FROM bksb_Resources
)
我真的没有想法。我不明白为什么这会在一台服务器而不是另一台服务器上运行,而其他查询在现场服务器上运行正常。
(嗯......我说其余的,这本来是一个不同的问题,localhost上的查询返回了正确的结果,而实时查询没有返回任何内容,即使我在Management Studio上运行了复制/粘贴查询工作得很好......但是在尝试调试时,我遇到了这个问题。)
有人有任何想法吗?
由于
编辑:
致电$this->connection->query($sql, array());
打电话给:
/**
* Run an SQL query and return a statement - to be used for things like selecting
* @param type $sql
* @param type $params
* @return type
*/
public function query($sql, $params){
$this->lastSQL = $sql;
$func = 'query_'.$this->extension;
return $this->$func($sql, $params);
}
然后将其称为:
/**
* Run SQL query using PDO
* @param type $sql
* @param type $params
* @return $st Statement
*/
private function query_pdo($sql, $params)
{
$st = $this->dbh->prepare($sql);
$st->execute($params);
return $st;
}
如果你也想要它,这就是我调用fetch的循环:
$results = array();
while($row = $this->connection->fetch($query)){
$results[] = $row;
}
答案 0 :(得分:5)
我最近在PDO和MySQL后端遇到了这个错误。这是因为我的查询返回了一个带有空别名的列,如下面的查询:
SELECT name as "" FROM users;
这是一个完全有效的查询(在某种意义上,MySQL将完美地解释和执行它)但是当PDO尝试获取数据并且FetchMode设置为PDO时,这将导致“无法访问空属性”致命错误: :FETCH_OBJ
这应该给任何有相同问题的人提供一些如何修复它的提示。在某些时候,PDO将实例化一个stdClass并尝试为查询返回的每个列设置一个属性。当返回具有空名称的列时,PDO将基本上执行以下代码:
// $obj is an stdClass instance
$prop = ''; // the name of the query column
$obj->$prop = $value; // the value of the query columns
这导致“无法访问空属性”致命错误。