Фатальная ошибка Uncaught Error: Call to a member function fetch() php [дубликат]

114
12 июня 2021, 23:50
На этот вопрос уже даны ответы здесь:
mysql_fetch_array() expects parameter 1 to be resource (or mysqli_result), boolean given (2 ответа)
Закрыт 1 год назад.

Всем доброго времени суток, недавно начал изучать php7 по учебнику, и я столкнулся с такой проблемой (Fatal error), и не могу понять, что же я сделал не так. Вкратце, создаю сайт-портфолио, и все мои разработанные проекты хранятся непосредственно в базе данных, и тут пришла беда, при открытии страницы возникает ошибка

Fatal error : Uncaught Error: Call to a member function fetch() on boolean in G:\Openserver\OSPanel\domains\myportfolio.ru\php\WorkingWithDatabase.php:81 Stack trace: #0 G:\Openserver\OSPanel\domains\myportfolio.ru\pages\portfolio.php(65): WriteDataTable->WriteTapePortfolio() #1 {main} thrown in G:\Openserver\OSPanel\domains\myportfolio.ru\php\WorkingWithDatabase.php on line 81

И так, 81 строка

while ($str_value = $pdo_data->fetch())

А 65 строчка находится в документе, где хранится разметка страницы

$class_writeDT->WriteTapePortfolio();

Вся специфика данной проблемы в том, что при SQL запросе

SELECT VERSION() AS version

который был продемонстрирован в учебнике автора Котеров чудесным образом исправно работает, но при выполнении моего запроса только ошибка. Но при проверке SQL - запроса в phpmyadmin ошибок не было найдено, и вся информация выводится на экран. Вся структура таблицы продемонстрирована ниже.

--
-- Структура таблицы `portfolio`
--
CREATE TABLE `portfolio` (
  `Id_news` INT(11) NOT NULL,
  `Title` text NOT NULL COMMENT 'Заголовок',
  `Description` text NOT NULL COMMENT 'Описание',
  `Picture` text DEFAULT NULL COMMENT 'Фотография проекта',
  `Working_time` INT(11) NOT NULL COMMENT 'Время выполнения работы',
  `Price` FLOAT DEFAULT NULL COMMENT 'Цена работы',
  `Link_project` text DEFAULT NULL COMMENT 'Ссылка на готовый проект',
  `Date` DATE NOT NULL COMMENT 'Дата публикации',
  `Link_news` text NOT NULL COMMENT 'Ссылка на статью',
  `Views` INT(11) NOT NULL COMMENT 'Количество просмотров'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Дамп данных таблицы `portfolio`
--
INSERT INTO `portfolio` (`Id_news`, `Title`, `Description`, `Picture`, `Working_time`, `Price`, `Link_project`, `Date`, `Link_news`, `Views`) VALUES
(4, 'Родительский контроль', 'Программный продукт помогает родителям контролировать своего ребенка в компьютерном пространстве и выстроить дневной график.', '/img/portfolio/parancecontrol/mainimage.png', 65, 68000, '', '2019-06-30', '/pages/desktop/parance-control.php', 0);
--
-- Индексы сохранённых таблиц
--
--
-- Индексы таблицы `portfolio`
--
ALTER TABLE `portfolio`
  ADD PRIMARY KEY (`Id_news`);
--
-- AUTO_INCREMENT для сохранённых таблиц
--
--
-- AUTO_INCREMENT для таблицы `portfolio`
--
ALTER TABLE `portfolio`
  MODIFY `Id_news` INT(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;
COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Код страницы (без HTML)

<?php
    require_once('../php/WorkingWithDatabase.php');
    $class_writeDT = new WriteDataTable();
    $class_writeDT->WriteTapePortfolio();
?>

Код документа WorkingWithDatabase.php

<?php
class ConnectPDO{
    private $host = 'localhost';
    private $database = 'database';
    private $login = 'mysql';
    private $password = 'mysql';
    public function Connect(){
        try {
            $connect_pdo = new PDO(
                "mysql:host{$this->host};database={$this->database}",
                $this->login,
                $this->password
            );
            return $connect_pdo;
        } catch (PDOException $e) { 
            return null;
        }
    }
}
class WorkingWithBatabase{
    // Получение данных из таблицы
    // Возвращает массив полученных данных
    private $connect_pdo;
    public function WorkingWithBatabase(){
        $class_connectPDO = new ConnectPDO();
        $this->connect_pdo = $class_connectPDO->Connect();
    }

    private function Reconnect(){
        $class_connect = new ConnectPDO();
        $int_timeout = 5;
        set_time_limit($int_timeout);
        while (true) {
            if(($this->connect_pdo = $class_connect->Connect()) != null){
                return true;
            }
        }
    }
    public function SelectData($sql)
    {
        if($this->connect_pdo != null){
            return $this->connect_pdo->query($sql);
        } else {
            Reconnect();
        }
    }
}
class WriteDataTable{
    public function WriteTapePortfolio(){
        require_once('library.php');
        $class_workDb = new WorkingWithBatabase();
        $class_workDate = new WorkingWithDate();

        $str_sql = "SELECT `Title`, `Description`, `Picture`, `Working_time`, `Price`, `Link_news` FROM `portfolio`;";
        $pdo_data = $class_workDb->SelectData($str_sql);
        $str_protocol = ($_SERVER["HTTPS"]) ? "https://" : "http://";
        try {
            while ($str_value = $pdo_data->fetch()) {
                echo '                        
            <article>
                <div class="card" style="width: 18rem; box-shadow: 0px 1px 6px 2px var(--main-color-box-shadow);">
                    <img src="' . $str_value[2] . '" class="card-img-top" alt="...">
                    <div class="card-body">
                        <h5 class="card-title">' . $str_value[0] . '</h5>
                        <p class="card-text">' . $str_value[1] . '</p>
                        <ul id="short_info_project">
                            <li><img class="icon-social" src="' . $str_protocol + $_SERVER["SERVER_NAME"] . ':81/img/icons/money.png" />Цена: <b>' . $class_workDate->ConvertNumberToMoney($str_value[4], "rub") . '</b></li>
                            <li><img class="icon-social" src="' . $str_protocol + $_SERVER["SERVER_NAME"] . ':81/img/icons/accept.png" />Время работы: <b>' . $class_workDate->DeclinationOfTheDay($str_value[3]) . '</b></li>
                        </ul>
                        <a href="' . $str_value[4] . '" class="btn btn-primary color_button">Переход куда-нибудь</a>
                    </div>
                </div>
            </article>';
            }
        } catch (Exception $e) {
            echo "<p class='clear_list'>В данный момент список пуст &#9785;</p>";
        }
    }
}

Код документа library.php

<?php
class WorkingWithDate
{
    private $str_day = "день";
    private $str_days = "дня";
    private $str_dayS = "дней";
    // Кодировки символов
    private $str_unicodeRub = "в‚Ѕ";
    //
    // Склонения дня (день, дня, дней)
    //
    public function DeclinationOfTheDay($int_day)
    {
        $str_nameDay = "";
        $str_holdNumber = $int_day;
        $int_lengthNumber = iconv_strlen($int_day);
        if ($int_lengthNumber >= 0) {
            if ($int_lengthNumber < 10) {
                if ($str_holdNumber == 1) {
                    return $int_day + $this->str_day;
                } else if ($str_holdNumber > 1 && $str_holdNumber < 5) {
                    return $int_day + $this->str_days;
                } else {
                    return $str_holdNumber + $this->str_dayS;
                }
            } else {
                if ($str_holdNumber[$int_lengthNumber - 1] == '1' && $str_holdNumber[$int_lengthNumber - 2] != '1') {
                    return $int_day + $this->str_day;
                } else if (($str_holdNumber[$int_lengthNumber - 1] == '2' || '3' || '4') && $str_holdNumber[$int_lengthNumber - 2] != '1') {
                    return $int_day + $this->str_days;
                } else {
                    return $int_day + $this->str_dayS;
                }
            }
        } else {
            return "";
        }
    }
    //
    //  Конвертирование числа в денежный формат
    //
    public function ConvertNumberToMoney($double_price, $str_currency)
    {
        $str_tempPrice = (string) $double_price;
        $int_lengthPrice = iconv_strlen($str_tempPrice);
        $str_intPart = "";
        $str_factionalPart = "";
        $bool_isIntPart = true;
        // Выделение целой и дробной части
        for ($index = 0; $index < $int_lengthPrice; $index++) {
            if ($bool_isIntPart) {
                if ($str_tempPrice[$index] != '.' || ',') {
                    $str_intPart .= $str_tempPrice[$index];
                } else {
                    $bool_isIntPart = false;
                }
            } else {
                $str_factionalPart .= $str_tempPrice[$index];
            }
        }
        $str_intPart = NumberSplit((int) $str_intPart) + (string) $str_factionalPart;
        switch ($str_currency) {
            case "rub":
                $str_intPart .= $this->str_unicodeRub;
                break;
        }
        return $str_intPart;
    }
    //
    //  Эффекта разделения значения
    //
    public function NumberSplit($int_value)
    {
        $str_temp = "";
        $int_count = 0;
        $int_lengthValue = iconv_strlen((string) $int_value);
        // Получение связки первых чисел
        $int_firstSpace = $int_lengthValue - (($int_lengthValue / 3) * 2);
        for ($index = 0; $index < $int_firstSpace; $index++) {
            $str_temp .= $int_value[$index];
        }
        for ($index = $int_firstSpace - 1; $index < $int_lengthValue; $index++, $int_count++) {
            if ($int_count == 2) {
                $str_temp .= ' ' + $int_value[$index];
                $int_count = 0;
            } else {
                $str_temp .= $int_value[$index];
            }
        }
        return $str_temp;
    }
}
Answer 1
  1. Не думаю, что автор книги PHP 7 в подлиннике будет говнокодить.
  2. Ответ на данный вопрос безумно прост - это ошибка в строке подключения. Очень жаль, что люди не попытались вникнуть в суть проблемы

Код с ошибкой

$connect_pdo = new PDO(
                "mysql:host{$this->host};database={$this->database}",
                $this->login,
                $this->password

Правильный код

$connect_pdo = new PDO(
                "mysql:host{$this->host};dbname={$this->database}",
                $this->login,
                $this->password
READ ALSO
Проблема в размещении картинок рядом. PHP

Проблема в размещении картинок рядом. PHP

Нужно, что-бы логотипы были рядом друг с другом(шли в ряд)

88
Android обращение к ресурсам из адаптера

Android обращение к ресурсам из адаптера

Здравстуйте, уважаемые кодеры и программисты имеется следующий адаптер для ViewPager и Tablayout, и значения заголовков берутся из массива, но тк

87