0

I have try the following code but the error "Fatal error: Call to a member function fetchAll() on a non-object", anyone can help?

   $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);
4

1 回答 1

0

您的问题是您的查询无效。您错过了将包含您在列上创建的条件聚合的字符串(您使用带有 GROUP_CONCAT 的第一个 SELECT 生成的字符串)与包含表中实际 SELECT 的字符串连接的基本部分。

相反,你写了

SELECT @sql; 

它将一个字符串返回给客户端。

但在那之后

prepare stmt FROM @sql;

由于上述原因而失败。

现在对于您之前的问题,您已经得到了一个看起来像正确代码的答案。为了简化从 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);
于 2013-09-13T03:57:28.270 回答