Вызываемая function fetch() не объект

286
24 ноября 2017, 08:15
public static function getNewsList()
{
    $db = DB::getConnection();
    $newList = array();
    $sql = $db->query('SELECT id, title, date, short_content '
        . 'FROM news '
        . 'ORDER BY date DESC '
        . 'LIMIT 10 ');
    if (!$sql) {
        echo "\nPDO::errorInfo():\n";
        print_r($db->errorInfo());
    }
    $result = $db->prepare($sql);
    $result->setFetchMode(PDO::FETCH_ASSOC);
    $result->execute();
    var_dump($result);
    $i = 0;
    while ($row = $result->fetch()) {
        $newList[$i]['id'] = $row['id'];
        $newList[$i]['title'] = $row['title'];
        $newList[$i]['data'] = $row['data'];
        $newList[$i]['short_content'] = $row['short_content'];
        $i++;
    }
    return $newList;
}

var_dump($result); возвращает object(PDOStatement)#4 (1) { ["queryString"]=> string(0) "" }

А PDO::errorInfo() - PDO::errorInfo(): Array ( [0] => 3D000 [1] => 1046 [2] => No database selected )

Привет, первым делом воспользовался поиском, но ответа не нашел. Выдает ошибку:

Fatal error: Call to a member function fetch() on a non-object in E:\OSPanel\domains\mysite.local\models\News.php on line 38

Я так понимаю это связано с тем, что var_dump($result) выводит bool(false). Я не пойму как найти ошибку. Помогите пожалуйста.

Код БД class Db

{
    public static function getConnection()
    {
        $paramsPath = ROOT .'../config/db_params.php';
        $params = include($paramsPath);
        $dsn = "mysql: host = {$params['host']}; dbname = {$params['dbname']}";
        $db = new PDO($dsn, $params['user'], $params['password']);
        $db->exec("set names utf8");
        return $db;
    }
}

и db_params

<?php
return [
    'host' => 'localhost',
    'dbname' => 'mvc_site',
    'user' => 'root',
    'password' => ''
];
Answer 1

Ты забыл выполнить запрос. Делается это с помощью execute();.

public static function getNewsList() {
    $db = DB::getConnection();
    $newList = array();
    $result = $db->query('SELECT id, title, date, short_content '
        . 'FROM news '
        . 'ORDER BY date DESC '
        . 'LIMIT 10 ');
    $result->execute();
    $i = 0;
    while ($row = $result->fetch()) {
        $newList[$i]['id'] = $row['id'];
        $newList[$i]['title'] = $row['title'];
        $newList[$i]['data'] = $row['data'];
        $newList[$i]['short_content'] = $row['short_content'];
        $i++;
    }
    return $newList;
}
Answer 2

Всем большое спасибо! 1. в соединении с БД нужно было убрать пробелы в строке с $dsn

 public static function getConnection()
    {
        $paramsPath = ROOT .'../config/db_params.php';
        $params = include($paramsPath);
        $dsn = "mysql:host={$params['host']};dbname={$params['dbname']}";
        $db = new PDO($dsn, $params['user'], $params['password']);
        $db->exec("set names utf8");
        return $db;
    }

2. В изначальном коде нужно было добавить $result->execute(); после выборки из БД

public static function getNewsList()
    {
        $db = DB::getConnection();
        $newList = array();
        $result = $db->query('SELECT id, title, date, short_content '
            . 'FROM news '
            . 'ORDER BY date DESC '
            . 'LIMIT 10 ');
        $result->execute();
        $i = 0;
        while ($row = $result->fetch()) {
            $newList[$i]['id'] = $row['id'];
            $newList[$i]['title'] = $row['title'];
            $newList[$i]['date'] = $row['date'];
            $newList[$i]['short_content'] = $row['short_content'];
            $i++;
        }
        return $newList;
    }
Answer 3

Причина:

$result->execute();

Попробуйте так:

public static function getNewsList() {
$db = DB::getConnection();

$sql = ('SELECT id, title, date, short_content '
    . 'FROM news '
    . 'ORDER BY date DESC '
    . 'LIMIT 10 ');
$result = $db->prepare($sql);
$result->setFetchMode(PDO::FETCH_ASSOC);
$result->execute();
$i = 0;
$newList= array();
while ($row = $result->fetch()) {
    $newList[$i]['id'] = $row['id'];
    $newList[$i]['title'] = $row['title'];
    $newList[$i]['data'] = $row['data'];
    $newList[$i]['short_content'] = $row['short_content'];
    $i++;
}
return $newList;
}
READ ALSO
MySQL отдает только нулевой элемент

MySQL отдает только нулевой элемент

При запросе к БД из PHP

232
Как добавить подтверждение по email! [требует правки]

Как добавить подтверждение по email! [требует правки]

Есть скрипт регистрации и авторизации, как же сделать еще и подтверждение по мылу после реги вот архив со всеми причиндалами https://yadisk/d/Ves1fc4F3PwGCX

224
Получить значение атрибута xml

Получить значение атрибута xml

Доброго времени суток!

226
Новичок в php задает вопрос) [требует правки]

Новичок в php задает вопрос) [требует правки]

Я только только начинаю разбираться в phpВот задание:

219