Всем доброго времени суток, недавно начал изучать 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'>В данный момент список пуст ☹</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;
}
}
Код с ошибкой
$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
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Нужно, что-бы логотипы были рядом друг с другом(шли в ряд)
Здравстуйте, уважаемые кодеры и программисты имеется следующий адаптер для ViewPager и Tablayout, и значения заголовков берутся из массива, но тк