致命错误:调用成员函数fetchAll

时间:2013-09-13 03:31:28

标签: php mysql pivot

我尝试了以下代码,但错误“致命错误:在非对象上调用成员函数fetchAll()”,任何人都可以提供帮助吗?

   $query = "SET @sql = NULL;".
   "SELECT GROUP_CONCAT(DISTINCT 
   CONCAT('sum(case when gameid = ''',gameid,''' then score else 0 end) AS ''',gameid, '''') 
   INTO @sql ".
   " FROM  scores;".
   " SELECT @sql; ". 
   " prepare stmt FROM @sql; ". 
   " execute stmt;"; 

   $result_array = array();
   $queryku = $db->query($query); 
   $result_array = $queryku->fetchAll(PDO::FETCH_OBJ);
   var_dump($result_array);

1 个答案:

答案 0 :(得分:0)

您的问题是您的查询无效。您错过了一个重要的部分,它连接了一个字符串,该字符串包含您在列上创建的条件聚合(使用第一个SELECT和GROUP_CONCAT生成的SELECT),其中包含一个包含表中实际SELECT的字符串。

相反,你写了

SELECT @sql; 

将字符串返回给客户端。

但就在那之后

prepare stmt FROM @sql;

因上述原因而失败。

现在到your previous question你已经得到了一个看起来像正确代码的答案。为了简化从php调用此代码,我强烈建议将其包装到存储过程

DELIMITER $$
CREATE PROCEDURE sp_pivotscores()
  SET @sql = NULL;
  SELECT
    GROUP_CONCAT(DISTINCT
      CONCAT(
    'sum(case when gameid = ''',
    gameid,
    ''' then score else 0 end) AS ''',
    gameid, ''''
  )
    ) INTO @sql
  FROM  scores;

  SET @sql = CONCAT('SELECT coalesce(playerid, ''Column Total'') as playerid, ', @sql, ', sum(score) as row_total
                FROM scores
                 GROUP BY playerid WITH ROLLUP');

  PREPARE stmt FROM @sql;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;

然后你的php代码可能看起来像

try {
    $db = new PDO('mysql:host=localhost;dbname=your_db_name;charset=UTF8', 'user', 'password');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

    $query = $db->prepare("CALL sp_pivotscores()");

    $query->execute();
    $result = $query->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
    echo "Exeption: " .$e->getMessage(); //TODO better error handling
    $result = false;
}
$query = null;
$db = null;

var_dump($result);