Василий М.
Новичок
1. Класс для работы с БД ДОЛЖЕН лишь оперировать SQL-запросами. Если вы делаете класс для работы с БД, то он должен быть лишь синтаксическим сахаром над стандартной библиотекой, причем он должен оперировать заполнителями (http://www.phpinfo.su/articles/additionally/klass_dlja_bezopasnoj_raboty_s_subd_mysql.html , http://phpfaq.ru/safemysql)Всегда писал в процедурном стиле и все устраивало. Но вот сейчас почему-то захотелось в попробовать написать что-то в стиле ООП. Захотелось, ну и сразу как-то обломалось... Короче говоря, столкнулся с тем, что не могу придумать как правильно спроектировать взаимодействие классов с подключением к БД. Собственно моя проблема в том, что хочется прописывать все учетные данные БД (логин, пароль, хост, имя базы) и настройки подключения в одном файле и в дальнейшем использовать это подключение во всех создаваемых классах, каждый из которых планирую размещать в отдельных файлах. Прошу прощения, если вопрос сформулировал слишком расплывчато, попробую обобщить сказанное примером:
Есть файл подключения к БД dbconn.php (в комментах некоторые вопросы):
Вот проект одного класса для работы с некоторым объектом:PHP:class DBConnection { private $db_host = 'localhost'; private $db_name = 'name'; private $db_username = 'user'; private $db_password = 'password'; public $mysqli; /* или лучше так? private $mysqli; public $result; тогда придется создавать методы для каждого взаимодействия с базой: SELECT, UPDATE, INSERT и т.д... нужно ли это? */ public function __construct() { $this->mysqli = new mysqli( $this->db_host, $this->db_username, $this->db_password, $this->db_name ); if (mysqli_connect_errno()) { printf("Подключение к серверу MySQL невозможно. Код ошибки: %s\n", mysqli_connect_error()); exit; } if (!$this->mysqli->set_charset("utf8")) { // какие-то настройки БД, например установка кодировки printf("Error loading character set utf8: %s\n", $mysqli->error); } return $this->mysqli; /* Закрываем соединение, если вместо "public $mysqli" решим использовать "public $result" function __destruct() { $this->mysqli->close(); } */ }
Правильно ли такое взаимодействие или есть варианты получше?PHP:<?php require_once('dbconn.php'); class Article { $this->link = new DBConnection; function __construct ( $link, $table, $id ) { ... } public function SelectFromBase () { // какие-то действия по выборке из базы $row = $link->sql_query("SELECT * FROM `articles` WHERE `id` = '$id'", 'fetch_assoc'); print_r($row); } public function WriteToBase ( ) { ... } public function ReadFromBase ( ) { ... } public function CheckInBase ( ) { ... } public function RemoveFromBase ( ) { ... } } ?>
P/S: Наверняка, для тех кто имеет опыт работы с ООП такой вопрос покажется не самым умным, но меня он занимает и тормозит уже длительное время. Так-что буду очень признателен за любой дельный совет.
2. Коннектор должен позволять создавать инстансы РАЗНЫХ подключений к разным базам. Посему, это
PHP:
private $db_host = 'localhost';
private $db_name = 'name';
private $db_username = 'user';
private $db_password = 'password';
4. WriteToBase / ReadFromBase / RemoveFromBase -- очевидно, это все должно быть реализовано в суперклассе, иначе это не ООП. Это банальный CRUD.