我尝试了以下代码,但错误“致命错误:在非对象上调用成员函数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);
答案 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);