PDO语句提取 - 无法访问空属性

时间:2013-06-21 09:43:25

标签: php sql-server pdo

我真的很困惑。

此查询在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;
     }

1 个答案:

答案 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

这导致“无法访问空属性”致命错误。