[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите новичку
СкивС
Доброго всем дня, а может и ночи...Помогите новичку. Недавно начал изучать PHP, то там понемногу посмотрю, почитаю, то там...в основе же лежат уроки Попова, не буду говорить плохи они или нет, не в моей квалификации, но с косяками я уже столкнулся и до кое чего сам докопался, но не будем углубляться в дебри...вот моя проблема: (по курсам не безызвестного) в общем задача такая вытащить из БД информацию и закинуть ее на страницу сайта...до этого по отдельности все работало, имеется ввиду написанный код, а когда его вплел в этот файл - результат ошибка, помогите застрял и дальнейшая практика и изучение зависло... вот мой исходник

<?php
include './block/bdc.php'; /*соединение с базой*/

$sql = ("SELECT title,meta_d,meta_k,text FROM set WHERE page='index'");
$res = $pdo->query($sql);
$row = $res->fetch(PDO::FETCH_ASSOC);

?>
<!DOCTYPE HTML>
<html>
<head>
<meta name="description" content="<?php echo $row['meta_d']; ?>">
<meta name="keywords" content="<?php echo $row['meta_k']; ?>">

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title><?php echo $row['title']; ?></title>
<link href="STYLE.css" rel="stylesheet" type="text/css">
</head>

<body><table width="690" border="0" align="center" cellpadding="0" cellspacing="0" class="main_border">
<!--Подключение блока шапки-->
<?php include ("block/header.php"); ?>
<tr>
<td><table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<!--Подключение меню блок-->
<?php include ("block/left.php");?>
<td width="74%" valign="top" class="right">
<?php echo $row['text']; ?>
</td>
</tr>
</table></td>
</tr>
<!--Подключение footer блока-->
<?php include("block/footer.php");?>
</table>

</body>
</html>

После запуска выдает такую ошибку Fatal error: Call to a member function fetch() on boolean in C:\server\data\htdocs\PHPSite\index.php on line 6
Без запроса за данными к базе, все норм подключается к базе без ошибок.

мой конфиг

Сервер: localhost via TCP/IP
Тип сервера: MySQL
Версия сервера: 5.6.26 - MySQL Community Server (GPL)
Версия протокола: 10
Пользователь: SkivS@localhost
Кодировка сервера: UTF-8 Unicode (utf8)

Веб-сервер
Apache/2.4.16 (Win64) PHP/5.6.11
Версия клиента базы данных: libmysql - mysqlnd 5.0.11-dev - 20120503 - $Id: 3c688b6bbc30d36af3ac34fdd4b7b5b787fe5555 $
PHP расширение: mysqli Документация
Версия PHP: 5.6.11

Помогите люди и вам воздастся +100500 в карму!
kaww
СкивС, В тексте ошибки написано, что пытаешься вызвать fetch() из boolean, т.е. $res не объект, как ты ожидаешь. Теперь идешь в документацию по методу PDO::query() (http://php.net/manual/ru/pdo.query.php#refsect1-pdo.query-returnvalues) и смотришь в каком случае так происходит.
Цитата
PDO::query() возвращает объект PDOStatement или FALSE, если запрос выполнить не удалось.

Осталось выяснить, почему не выполняется запрос. Там же в комментариях есть примеры того, как получить эту инфу.
Игорь_Vasinsky
Цитата
$sql = ("SELECT title,meta_d,meta_k,text FROM set WHERE page='index'");
$res = $pdo->query($sql);
$row = $res->fetch(PDO::FETCH_ASSOC);


$res = false, т.к. запрос кривой.

SELECT title,meta_d,meta_k,text FROM set WHERE page='index'"

set - наименование таблицы? ))
set это слукжебное слово в мускуле, если ты уж назвал так таблицу - то используй апострофы

SELECT title,meta_d,meta_k,text FROM `set` WHERE page='index'"


вообще возьми за правило - имена таблиц и колонок обрамлять апострофами

SELECT `title`,`meta_d`,`meta_k`,`text` FROM `set` WHERE page='index'"


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
AllesKlar
о, проснулись все разом???

Не лезя в глубокие дебри, возьмем сразу за рога:
Цитата
Call to a member function fetch() on boolean in...

Тут английским по белому написано, что ты попытался вызвать функцию у переменной типа булеан.
Ууупс... пока что для тебя функцию можно вызвать только у переменной типа объект там чего-то (в твоем случае у объекта класса PDO).
Но ты же там написал
Цитата
$res = $pdo->query($sql);
и в переменной $res должен быть как раз этот объект.. а оно пишет булеан... от ведь незадача.

идем смотреть, в какое ты еще дермище, акромя Попова втоптался.
Тута http://php.net/manual/ru/pdo.query.php вот что пишут:
Цитата
PDO::query — Выполняет SQL запрос и возвращает результирующий набор в виде объекта PDOStatement
НО всегда, везде и обязательно к прочтению раздел Возвращаемые значения а там указано, что:
Цитата
PDO::query() возвращает объект PDOStatement или FALSE, если запрос выполнить не удалось.
А вот и наш булеан.
Т.е. фигню false возвратила твоё
$pdo->query($sql);
А почему?
А потому что, для начала включи вывод ошибок:
 
<?php
error_reporting(-1);
ini_set('display_errors', 1);
// .... а тут уже дальше твой код


А когда в выводе ошибок не будет, то значит есть логическая ошибка, либо ошибка запроса к базе.
Т.е.
echo $sql;
а значение из $sql пытаешься выполнить, например, в phpmyadmin

И будет тебе сон здоровый и уважение одноклассников.
100500 в карму не надо, а вот если морскую свинку возьмешь на передержку (ну или на шашлык), то спасибо.


_____________
[продано копирайтерам]
СкивС
Игорь_Vasinsky
Спасибо, все заработало...'set' это таблица, просто я поменял название когда все переделывал по новой...а по поводу апострофов - просто где то у меня прокатило без них вот я и упустил этот момент...ларчик просто открывался.Спасибо. Просьба еще одна, есть ресурс или книга где подробно рассказано о PDO, а то в основном все примеры и мануалы про mysql
AllesKlar
Цитата
Просьба еще одна, есть ресурс или книга где подробно рассказано о PDO

Самое лучшее пособие: http://php.net/pdo

_____________
[продано копирайтерам]
СкивС
Цитата (AllesKlar @ 3.08.2015 - 09:46)
Цитата
Просьба еще одна, есть ресурс или книга где подробно рассказано о PDO

Самое лучшее пособие: http://php.net/pdo

Спасибо, я его видел и даже чуть чуть лазил там, но пока информацию не воспринял. Нужно побольше практики.)))
AllesKlar
СкивС
Это был не сарказм, это действительно самое лучшее пособие.
Ставь задачу, пытайся сделать, потом вываливай сюда, все вместе разгребем.

_____________
[продано копирайтерам]
СкивС
Добрый всем день опять, проблема...при создании страницы Админа, вроде все сделал правильно...создал папку отдельную, внес туда нужные файлы....вот в чем загвоздка - задача внести данные в таблицу - две стр одна форма, вторая обрабатывает, когда ввожу данные в поля формы у системы ноль эмоций, в базу тоже ничего не заносится!!! Ошибок никаких нет...

<?php
include ("block/bdc.php");

if (isset ($_POST['title'])) {$title = $_POST['title'];}
if (isset ($_POST['mrta_d'])) {$meta_d = $_POST['meta_d'];}
if (isset ($_POST['meta_k'])) {$meta_k = $_POST['meta_k'];}
if (isset ($_POST['description'])) {$description = $_POST['description'];}
if (isset ($_POST['text'])) {$text = $_POST['text'];}


?>
<!DOCTYPE HTML>
<html>
<head>


<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Обработка</title>
<link href="STYLE.css" rel="stylesheet" type="text/css">
</head>

<body><table width="690" border="0" align="center" cellpadding="0" cellspacing="0" class="main_border">
<!--Подключение блока шапки-->
<?php include ("block/header.php"); ?>
<tr>
<td><table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<!--Подключение меню блок-->
<?php include ("block/left.php");?>
<td width="74%" valign="top" class="right">
<?php

if (isset ($title) && ($meta_d) && ($meta_k) && ($description) && ($text))
{$res = $pdo->query("INSERT INTO 'product' (title,meta_d,meta_k,description,text) VALUES ('$title','$meta_d','$meta_k','$description','$text')");
if($res == 'true') {echo "<p> Ваш товар занесен </p>";}
else {echo "<p> Ваш товар не занесен </p>"; }


}

else

{"echo <p> информация не передана</p>";}

?>
</td>
</tr>
</table></td>
</tr>
<!--Подключение footer блока-->
<?php include("block/footer.php");?>
</table>

</body>
</html>
AllesKlar
СкивС
Цитата
когда ввожу данные в поля формы у системы ноль эмоций, в базу тоже ничего не заносится!!! Ошибок никаких нет...


Это значит, что ошибки таки есть, но их вывод у тебя заглушен.
В самом начале сткрипта включай вывод ошибок и смотри дальше.

<?php
error_reporting(-1);
ini_set('display_errors', 1);


И код, плиз, форматируй (кнопка PHP), а то глаза всем сломаешь.

_____________
[продано копирайтерам]
Kusss
мдя ... обрабатывай форму ДО загрузки страницы, а не в середине.

isset нужно использовать как положено, а не как хочется.
if (isset ($title, $meta_d ,$meta_k ,$description, $text))


А вообще нужно вот так
// Если нажали кнопку добавить
// <input type="submit" name="add" value="Добавить">

if (isset($_POST['add'])){
// тут уже проверки делать.
}


СкивС
Цитата (AllesKlar @ 4.08.2015 - 13:28)
СкивС
Цитата
когда ввожу данные в поля формы у системы ноль эмоций, в базу тоже ничего не заносится!!! Ошибок никаких нет...


Это значит, что ошибки таки есть, но их вывод у тебя заглушен.
В самом начале сткрипта включай вывод ошибок и смотри дальше.

<?php
error_reporting(-1);
ini_set('display_errors', 1);


И код, плиз, форматируй (кнопка PHP), а то глаза всем сломаешь.

Немного не до понял...твой код вставил и на страницу где форма и где страница обработчик...после этого попробовал все повторить - ноль эмоций, в папке с логами оже нет новых отчетов...только старые которые проявлялись...
ПыСы По поводу сломанных глаз, тоже не понял))) в смысле форматировать кнопкой PHP?
Спасибо вам за терпение.
СкивС
Цитата (Kusss @ 4.08.2015 - 13:40)
мдя ... обрабатывай форму ДО загрузки страницы, а не в середине.

isset нужно использовать как положено, а не как хочется.
if (isset ($title, $meta_d ,$meta_k ,$description, $text))


А вообще нужно вот так
// Если нажали кнопку добавить
// <input type="submit" name="add" value="Добавить">

if (isset($_POST['add'])){
// тут уже проверки делать.
}

Я правильно понял, перенести код обработки до загрузки страницы и на страницу где форма добавить вашу строчку к кнопке и код на проверку....я так сделал результат тот же....никакого
kaww
СкивС,
В запросе ошибки:
1. не 'product' а `product'`
2. не (title,meta_d,meta_k,description,text) а (`title`,`meta_d`,`meta_k`,`description`,`text`) . В частности проблема в ,text), т.к. text - зарезервированное слово.
3. Может еще что-то.

if($res == 'true') - так делать неправильно, если хочешь проверить на true, то делай if ($res === true). Но в этом случае это не нужно. Что возвращает PDO::query() смотри в мануале (ссылка в первом моем сообщении).
СкивС
"Бубен" проверками на ошибки помог - теперь требуется квалифицированный шаман....в логах появились ошибки - [Tue Aug 04 13:27:21.938017 2015] [:error] [pid 4856:tid 804] [client 127.0.0.1:60414] script 'C:/server/data/htdocs/PHPSite/admin/new_product.php' not found or unable to stat
[Tue Aug 04 13:27:21.953017 2015] [:error] [pid 4856:tid 828] [client 127.0.0.1:60416] script 'C:/server/data/htdocs/PHPSite/admin/add_product.php' not found or unable to stat
все выше перечисленное проделал....не выходит....и да при поломке файла с доступом к бд, ничего не происходит как входит так и входит в админку, а в основной папке если нарушишь файл паролем и хостом сразу ошибки?!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.