2013-09-13 2 views
0

Я попробовал следующий код, но ошибка «Неустранимая ошибка: вызов функции-члена fetchAll() на не-объект», кто может помочь?Неустранимая ошибка: вызов функции-члена 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

ли $ установка дб как объект п.д.о.? –

+1

Я предполагаю, что ваш вызов '$ db-> query ($ query);' не работает, заставляя '$ queryku' присваивать значение' null'. Появляются ли какие-либо ошибки? –

+0

Вам нужно проверить, работают ли ваши вызовы в базе данных. Я подозреваю, что вызов 'query()' возвращает false, но если вы проверите ошибки из базы данных, вы увидите, почему – andrewsi

ответ

0

У вас проблема в том, что ваш запрос недействителен. Вы пропустили важную часть, которая объединяет строку, содержащую условную агрегацию, которую вы создали в своих столбцах (которую вы создаете с помощью первого SELECT с GROUP_CONCAT), со строкой, содержащей фактический 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); 
+0

Я уже позвонил db подключиться к файлу в начале include (" включает/sqlconnect.inc "); то мне еще нужно снова подключить БД? – user2389248

+0

ошибка синтаксиса show show, «$» – user2389248

+0

Если у вас уже есть открытое соединение с db, тогда вам не нужно снова подключаться. Я просто предоставил вам шаблонный код, который позволяет получить набор результатов. – peterm

Смежные вопросы