С Новым годом! Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 18.12.2018
Сообщений: 1

Ошибка: Call to a member function prepare() on a non-object

18.12.2018, 20:32. Показов 2240. Ответов 1
Метки api, pdo, rest (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, форумчане! Надеюсь, что попал в нужную тему.

Суть проблемы такова.
Нужно написать REST API с двумя методами: retrieve(id) и generate(). Проблем с написанием особо не возникло, руководствовался данным туториалом и доками.
Я написал пока метод retrieve, который должен выводить из БД значения с определённым id, который указывается в GET - запросе.
Собственно вот код, который у меня получается:

database.php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
    class Database
    {
        //  DB information
        private $host = 'localhost';
        private $db_name = 'task';
        private $username = 'root';
        private $password = '';
        private $conn;
 
        public function getConnection()
        {
            $this->conn = null;
 
            try
            {
                $this->conn = new PDO('mysql:host='. $this->host .';dbname='. $this->db_name, $this->username, $this->password);
                $this->conn->exec('set names utf8');
            }
            catch(PDOException $e)
            {
                echo "Connection error: " . $e->getMessage();
            }
 
            return $this->conn;
        }
    }
?>
api.php (по названию таблицы в БД)
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
    class Api
    {
        //  database connection and table name
        private $conn;
        private $table_name = "api";
 
        //  object properties
        public $id;
        public $val;
 
        //  constructor with connection
        public function __construct($db)
        {
            $this->conn = $db;
        }
 
        public function retrieve()
        {
            //  qury to read records
            $query =    'SELECT *
                        FROM ' .
                            $this->table_name . '
                        WHERE
                            id = :id';
 
            //  prerpare query statement
            $stmt = $this->conn->prepare($query);
 
            //  bind id param
            $stmt->bindParam(':id', $this->id, PDO::PARAM_INT);
 
            //  execute query
            $stmt->execute();
 
            //  get retrieved row. fetch() faster then fetchAll()
            $row = $stmt->fetch(PDO::FETCH_ASSOC);
 
            $this->val = $row['val'];
        }
    }
?>
и сам метод retrieve.php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php
    // required headers
    header("Access-Control-Allow-Origin: *");
    header("Content-Type: application/json; charset=UTF-8");
    header("Access-Control-Allow-Methods: GET");
    header("Access-Control-Allow-Credentials: true");
    header('Content-Type: application/json');
 
    // include database and object files
    include_once '../config/database.php';
    include_once '../objects/api.php';
    
    // instantiate database and product object
    $database = new Database();
    $db = $database->getConnection();
    
    // prepare Api object
    $api = new Api($db);
 
    // set ID property of record to read
    $api->id = isset($_GET['id']) ? $_GET['id'] : die();
 
    $api->retrieve();
 
    if ($api->id!=null)
    {
        //  create array with data
        $api_arr = array(
            'id'    =>  $api->id,
            'val'   =>  $api->val
        );
 
        // set response code - 200 OK
        http_response_code(200);
    
        // make it json format
        echo json_encode($api_arr);
    }
    else
    {
        http_response_code(404);
        echo json_encode(array('Error' => 'Oh, sorry! We did not find this data. Try another data!'));
    }
?>
Ошибка, которую выдаёт:
<b>Fatal error</b>: Call to a member function prepare() on a non-object in <b>C:\OSPanel\domains\api\objects\api.ph p</b> on line <b>28</b><br />

Не могу понять, что не так. при вызове retrieve.php?id=2 создаётся экземпляр класса БД, затем вызывается его метод getConnection(), который возвращает, как я понял, PDOStatement.
Затем этот аргумент передаётся в конструктор класса Api, который передаёт состояние своей локальной переменной. После этого вызывается сам retrieve(), который использует эту переменную в своих нуждах, но почему-то на методе prepare() выдаёт указанную ошибку.

P.S. прошерстил уже кучу тем на разных форумах, так и не нашёл решения, почему-то кажется, что оно простое и основано на моей глупости или невнимательности.
Если нужна доп. информация, то с радостью поделюсь ей.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.12.2018, 20:32
Ответы с готовыми решениями:

Fatal error: Call to a member function prepare() on a non-object
Не знаю куда написать, и можно здесь тему, можно и в бд, не пинайте, если написал не туда. Проблема в следующем : выходит ошибка Fatal...

Ошибка: Call to a member function prepare() on null
Добрый день Есть файл со следующим кодом для подключения к базе на Open Server $host = 'localhost'; $db_name = 'MOF'; ...

Ошибка Call to a member function getAll() on a non-object
Файл globale_class.php. В этом файле указывает на ошибку &quot;Fatal error: Call to a member function getAll() on a non-object in...

1
98 / 64 / 36
Регистрация: 04.12.2018
Сообщений: 158
18.12.2018, 20:50
Лучший ответ Сообщение было отмечено vashukovdanil как решение

Решение

Цитата Сообщение от vashukovdanil Посмотреть сообщение
PHP
1
2
$database = new Database();
 $db = $database->getConnection();
Тут же может и null вернуться. Надо бы это отловить и не пытаться обращаться к базе. Выдать клиенту какой-нить объект { error, message } или статус 503 Service Unavailable.

Цитата Сообщение от vashukovdanil Посмотреть сообщение
PHP
1
header('Content-Type: application/json');
Кстати, зачем 2-й раз этот заголовок?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.12.2018, 20:50
Помогаю со студенческими работами здесь

Call to a member function query() on a non-object
Доброй, продуктивной, ночи! Столкнулся с проблемой. Если в классе есть конструктор, при вызове функции queru выдает ошибку Call to a...

Ошибка при работе с ПДО "Call to a member function setAttribute() on a non-object"
привет, всех с наступившим! :drink: вот часть класса для работы с бд class DB{ private $handler; private static function...

Fatal error: Call to a member function on a non-object in
Прошу помощи. Начал учить ООП в php. Не могу додуматься почему не идёт class FFF { function ZZZ() { echo &quot;порядок...

Fatal error: Call to a member function find() on a non-object
Где он теряет свойство объекта? &lt;? include('simple_html_dom.php'); $companies = new simple_html_dom(); ...

Ошибка call to a member function query() on a non-object in php mysqli
Добрый день, выскакивает ошибка call to a member function query() on a non-object $resut = $mysqli-&gt;query(&quot;SELECT `users` FROM `$gid`...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru