2015-03-13 2 views
1

Есть ли какие-либо ошибки в моем коде? Я попытался отобразить результат, но возвратил ноль, и вместо этого появился заголовок выше или есть какой-либо способ, как это сделать гладко. Пожалуйста, дайте мне знать. БлагодаряSQLSTATE [HY000]: Общая ошибка в PDOStatement-> fetchAll (2)

$pdo = Database::connect(); 
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION, 1); 
    $sql = ("    SET @curRank1 = 0; 
          SET @curRank2 = 0; 
          SELECT 
           D1.reading_date 
           ,D1.consumer_id 
           ,D1.readings AS previous 
           ,D2.readings AS current 
           ,(D2.readings - D1.readings) AS kwh_used 

          FROM 
          (
           SELECT M1.*, @curRank1 := @curRank1 + 1 AS rank 
           FROM consumption M1 
           LEFT JOIN consumption M2 
           ON Date(M1.reading_date) = Date(M2.reading_date) 
           AND M1.reading_date > M2.reading_date 
           WHERE M2.reading_date IS NULL 
          ) D2 
          LEFT JOIN 
          (
           SELECT M1.*, @curRank2 := @curRank2 + 1 AS rank 
           FROM consumption M1 
           LEFT JOIN consumption M2 
           ON Date(M1.reading_date) = Date(M2.reading_date) 
           AND M1.reading_date > M2.reading_date 
           WHERE M2.reading_date IS NULL 
          ) D1 
          ON D2.rank = (D1.rank + 1) 
          WHERE D1.reading_date IS NOT NULL 
          AND D1.consumer_id = :consumer_id"); 
    $q = $pdo->prepare($sql); 
    $q->execute(array($id)); 
    $q->nextRowset(); 
    $data = $q->fetchAll(PDO::FETCH_ASSOC); 

EDIT: SQLSTATE [HY000]: Общая ошибка onPDOStatement-> fetchAll (2)

ответ

1

Я считаю, что вы используете обязательный синтаксис, что и MySQLi использует. PDO просто использует заполнители, поэтому :consumer_id должен быть ?.

+0

был установлен как \t, если { \t \t $ ID = $ _REQUEST [ 'consumer_id'] (пусто ($ _ GET [ 'consumer_id'])!); \t} –

+0

Да, это не проблема. Вы не говорите SQL, как это получить. Rizier или мой ответ должны работать на вас. http://php.net/manual/en/pdostatement.execute.php – chris85

+0

Уже пробовал также эхо, что user_id, если оно равно null, и оно возвращает не null –

1

Если вы используете позиционные заполнители (например ?) Затем вы можете использовать обычный массив, как вы делаете, но если вы используете именованные заполнители (например :consumer_id) вы должны использовать ассоциативный массив вроде этого:

$q->execute(array(":consumer_id" => $id)); 

В противном случае он не будет знать, какой заменитель должен быть заменен на какое значение.

+0

Думаю, я пропустил, что PDO поддерживает привязку. – chris85

+0

@ chris85 Ну, теперь вы это знаете: D – Rizier123

+0

@ Rizeier123 ошибка исчезла, но произошла другая ошибка Предупреждение: PDO :: setAttribute() ожидает ровно 2 параметра, 3 заданных по строке 12 ($ sql) –

0

Please let me know how to debug this

Использование $q->debugDumpParams();

Затем запустите запрос непосредственно (Mysql Termina/Mysql Workbench/PhpMyAdmin или же вы хотите) и посмотреть, если вы получите тот же результат, как ваш код

ПРИМЕЧАНИЕ: Я просто отвечаю, как обычно тестирую свой код с некоторой проблемой с PDO. Это не решение вашей проблемы.

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