3

我在这里真的很困惑。

这个查询在 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();
}

所以基本上它是从表中选择所有内容,然后返回第一行(这是一个循环,但这并不真正相关)。

在本地主机上,这很好。没问题。

在我的实时服务器上,我得到:

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 上的查询返回了正确的结果,而 live 上的查询什么也没返回,即使我在 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;
     }
4

1 回答 1

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

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

于 2014-01-08T13:45:36.657 回答