В чем ошибка? PDO

272
09 августа 2018, 12:00

По непонятно мне причине выводит ошибку:

Fatal error: Uncaught Error: Call to a member function fetchAll() on boolean in /home/uhr/hr-tape.ru/index.php:43 Stack trace: #0 {main} thrown in /home/uhr/hr-tape.ru/index.php on line 43

 <?
    $config = json_decode(file_get_contents('config'));
    $local  = json_decode(file_get_contents($config->tpl.'/local.json'));
    try {
      $db     = new PDO('mysql:host='.$config->db->host.';dbname='.$config->db->name, $config->db->user, $config->db->pass); //д Данные верные
    }
    catch(PDOException $e) {
      exit(getTPL('errors/db_connect'));
    }
    function sendQuery($query,$vars) {
      global $db;
      try {
        $prepare = $db->prepare($query); //object(PDOStatement)#6 (1) { ["queryString"]=> string(68) "SELECT `id`, `title`, `desc` FROM `posts` ORDER BY `id` DESC LIMIT 5" }
        $execute = $prepare->execute($vars); //(выдает просто true) :c
        return $execute;
      }
      catch(PDOException $e) {
        exit(getTPL('errors/db_query'));
      }
    }
    function getTpl($filename) {
      global $config;
      return file_get_contents($config->tpl.'/'.$filename.'.html');
    }
    $title = $local->title;
    switch ($_GET['e']) {
        default:
            $title = $title->posts;
            $query_count = 'SELECT count(*) FROM `posts`';
            $query = 'SELECT `id`, `title`, `desc` FROM `posts` ';
            $array = null;
            $query .= 'ORDER BY `id` DESC LIMIT ';
            if (is_numeric($_GET['offset'])) {
                $query .= '?,';
                $array = array();
                array_push($array, $_GET['offset']);
            }
            $query .= 5;
            $response = sendQuery($query,$array)->fetchAll();
            $count = sendQuery($query_count, null)->fetchColumn();
            if (!empty($response)) {
                foreach ($response as $post) {
                    $posts.= str_replace(
                        array('$ID$','$TITLE$','$DESC$'),
                        array($post['id'],$post['title'],$post['desc']),
                        getTpl('posts_row'));
                }
                if (isset($_GET['scroll'])) exit ($posts);
                else $content = str_replace(array('$POSTS$','$COUNT$'),array($posts,$count),getTpl('posts'));
            }
            else if (!isset($_GET['scroll'])) {
                $content = getTpl('errors/posts_not_found');
            }
        break;
        case 'post':
            if (is_numeric($_GET['id'])) {
                $query = 'SELECT `id`, `title`, `desc-full` FROM posts WHERE id = ? LIMIT 1';
                $response = sendQuery($query,array($_GET['id']))->fetch(PDO::FETCH_BOTH);
                if ($response) {
                    $title = $response['title'];
                    $content = str_replace(array('$TITLE$','$DESC-FULL$'),array($response['title'],$response['desc-full']),getTpl('post'));
                } else {
                    $title = $local->error;
                    $content = getTpl('errors/post_not_found');
                }
            } else {
                $title = $local->error;
                $content = getTpl('errors/post_wrong_id');
            }
        break;
    }
    if (isset($content)) {
        if (isset($_POST['ajax'])) {
            exit (serialize(array($title,$content)));
        } else {
            exit(str_replace(
                array('$TITLE$','$CONTENT$','$CDN$'),
                array($title, $content, $config->cdn),
                getTpl('main')));
        }
    }
    ?>

Подскажите пожалуйста в чем проблема и как можно исправить?

Answer 1

Ну как бы логично, у Вас в комментарии написано execute просто отдаёт true (и документации тоже), а у него нет метода fetchAll, что и говорится в ошибке.

Исправить - возвращать PDOStatement, а не результат execute.

Что-то вроде:

$prepare = $db->prepare($query);
$execute = $prepare->execute($vars); // Тут стоит проверить результат выполнения запроса, для чего, собственно, идёт возврат булева значения
return $prepare; // Отдавать именно PDOStatement, из него уже можно извлекать, если есть что
READ ALSO
Как конвертировать QTableView to QWebView

Как конвертировать QTableView to QWebView

При запросе в Базу данных использую QSqlQueryModel, добавляю эту модель в QTableView все хорошо, отображаетсяМне необходимо эту табличку перевести в PDF

164
Статические константы класса и что с ними делать?

Статические константы класса и что с ними делать?

У меня есть два класса, которые раскинуты по разным хэдэрам и сурсным файлам, при этом в каждом из них есть некоторое количество статических...

159
Как сделать сравнение юникод строки из файла и const wchar_t*?

Как сделать сравнение юникод строки из файла и const wchar_t*?

Я перехватываю перемещение файла, в файле permissiontxt через \n записаны пути до файлов, которые перемещать нельзя Сейчас сильно остановился на больной...

203
CaptureStackBackTrace(&hellip;) Выдаёт неполный стек вызовов на x86

CaptureStackBackTrace(…) Выдаёт неполный стек вызовов на x86

А на x64 тот же самый код нормально работает, выдаёт полный стекВ чём может быть проблема? Может быть кто-нибудь сталкивался с подобной проблемой?

203