PHP

Как выполнить запрос в бд на php ооп

Всем добрый день. Начал изучать ООП php. Сейчас мне нужно реализовать запрос к БД. На данный момент я реализовал подключение к БД через класс но запнулся на выполнение запросов. Ниже листинг того что удалось сделать:

<?// Параметры для подключения

class connect_db
{
private $host, $user, $password, $table, $link;

public function parametr_connect()
{
$this->host = "localhost";
$this->user = "mysql";
$this->password = "mysql";
$this->table = "db";
$this->link = mysqli_connect ($this->host, $this->user, $this->password, $this->table);
}

}

$connect_mysql = new connect_db();
$connect_mysql->parametr_connect();
if ($connect_mysql->connect_errno) {
echo "Не удалось подключиться к MySQL: " . $connect_mysql->connect_error;
}
else
{

}
?>

На подключение не ругается (проверял изменяя пароль в свойстве password. Но мне не понятно как работать с методом parametr_connect после его вызова. Пожалуйста помогите, т. к. информацию не могу найти. Заранее спасибо и всех с наступившим.
Ну так используй $this->link в методах, в чем проблема-то?

По идее, ожидается что экземпляры класса "клиент БД" инкапсулируют все кроме публичных свойств и методов для работы с базой, а сам класс должен быть грамотно описан.
Поэтому, во-первых, напиши интерфейс базового класса; во-вторых, напиши сам базовый класс, реализующий только общий функционал (общую логику), и сохраняющий приватные методы (специфичные для СУБД или структуры базы) абстрактными - даже если потомок сейчас будет только один; в-третьих, вынеси "прибитые гвоздями" параметры подключения в параметры метода установки соединения (желательно ассоц. массивом, и с пробросом через конструктор); в-четвертых, реализуй приватные методы (непосредственно работы с БД) в классе-потомке, который и будет инстанцироваться как конечная реализация (но в юзеркоде работать следует с уровнем базового класса, не привязываясь к потомку!).

// И кстати, только бараны используют mysqli в новых (не легаси) проектах, при том что уже тыщу лет есть PDO. А отсутствие контроля ошибок, вообще неприемлемо.
Владимир Кроликов
Владимир Кроликов
86 419
Лучший ответ
Виталий Алтынников Я знаю про PDO но в нем нужно разбираться (я не хочу его шаблонно использовать). Я хочу сделать так, изучить возможности использования работы mysqli на php ооп. Далее переписать код проекта (да, я его написал в процедурном стиле и поэтому я столкнулся с проблемой дублирование кода и невозможности и невозможности объявления этого кода единожды для его использования на разных страницах. Конечно есть вариант делать на каждый sql запрос отдельный файл, но это честно говоря бред) на объектно ориентированный стиль, далее PDO и попутно с ним ajax)))
Виталий Алтынников Ну опять же разработка на перспективу, поэтому лучше делать так как надо, нежели потом от этого страдать :)
Виталий Алтынников Ознакомившись в общем, там не сильно много менять нужно будет.
Реализация подключение к бд, как я думаю - должна быть в конструкторе вашего класса, при создании экземпляра класса $connect_mysql = new connect_db(); создаётся и подключение к бд, далее необходимо реализовать методы бд. Класс -> База данных должен уметь: заносить данные в бд, делать выборку, обновлять и удалять. Соответственно далее вы и реализуете эти методы в классе. Ваш класс должен называться class Bd, реализовывать отдельно класс подключения к бд не целесообразно. Что-то типа того https://myrusakov.ru/php-db-class.html
Андрей Чех
Андрей Чех
894
Виталий Алтынников То есть я эти методы объявляю в классе и вызываю их как в фанкции в коде программы. Верно ли я говорю?
Виталий Алтынников public function __construct()
{
$this->host = "localhost";
$this->user = "mysql";
$this->password = "mysql";
$this->table = "db";
$this->mysqli = new mysqli($this->host, $this->user, $this->password, $this->table);
$this->mysqli->query("SELECT * FROM db");
$this->mysqli->num_rows();
}

К примеру я хочу вывести количество полученных строк, через процедурный стиль делается это через функцию mysqli_num_rows. В ООП я не могу их вывести, показывает ошибку Fatal error: Uncaught Error: Call to undefined method mysqli::num_rows() in C:\OpenServer\domains\test.ru\index.php:16 Stack trace: #0 C:\OpenServer\domains\test.ru\index.php(28): connect_db->__construct() #1 {main} thrown in C:\OpenServer\domains\test.ru\index.php on line 16 ну типа я вызываю неопределенный метод. Помогите дописать