Попытка писать в ООП. Вопрос во взаимодействии классов с БД

Статус
В этой теме нельзя размещать новые ответы.

Василий М.

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

Есть файл подключения к БД 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: Наверняка, для тех кто имеет опыт работы с ООП такой вопрос покажется не самым умным, но меня он занимает и тормозит уже длительное время. Так-что буду очень признателен за любой дельный совет.
1. Класс для работы с БД ДОЛЖЕН лишь оперировать SQL-запросами. Если вы делаете класс для работы с БД, то он должен быть лишь синтаксическим сахаром над стандартной библиотекой, причем он должен оперировать заполнителями (http://www.phpinfo.su/articles/additionally/klass_dlja_bezopasnoj_raboty_s_subd_mysql.html , http://phpfaq.ru/safemysql)

2. Коннектор должен позволять создавать инстансы РАЗНЫХ подключений к разным базам. Посему, это
PHP:
private $db_host = 'localhost';
private $db_name = 'name';
private $db_username = 'user';
private $db_password = 'password';
- бред.

4. WriteToBase / ReadFromBase / RemoveFromBase -- очевидно, это все должно быть реализовано в суперклассе, иначе это не ООП. Это банальный CRUD.
 

Страшный Злодей

Бывший член клуба (достало хамство).
AmdY, жалкий Вы какой-то... Но свое дело сделали, отбили желание появляться на этом форуме. Сижу теперь на http://www.codingforums.com/php/ и очень доволен как культурой общения, так и вполне дружественной атмосферой. Только пожалуйста, не появляйтесь там, срите уж в каком-то одном месте!
 
Последнее редактирование:

Страшный Злодей

Бывший член клуба (достало хамство).
1. Класс для работы с БД ДОЛЖЕН лишь оперировать SQL-запросами. Если вы делаете класс для работы с БД, то он должен быть лишь синтаксическим сахаром над стандартной библиотекой, причем он должен оперировать заполнителями (http://www.phpinfo.su/articles/additionally/klass_dlja_bezopasnoj_raboty_s_subd_mysql.html , http://phpfaq.ru/safemysql)

2. Коннектор должен позволять создавать инстансы РАЗНЫХ подключений к разным базам. Посему, это
PHP:
private $db_host = 'localhost';
private $db_name = 'name';
private $db_username = 'user';
private $db_password = 'password';
- бред.

4. WriteToBase / ReadFromBase / RemoveFromBase -- очевидно, это все должно быть реализовано в суперклассе, иначе это не ООП. Это банальный CRUD.
Спасибо, за сделанные замечания! Их бы их ещё и к началу беседы, может быть и сама тема раскрылась в более конструктивном ключе. За время прошедшее с момента публикации топика, во многом уже конечно разобрался, но тем не менее, ваш пост оказался полезным.


Если вместо слова "бред", в вашем посте употребить что-нибудь типа "не правильно", "не верно" и т.д., то ценность Ваших замечаний оказалась бы значительно выше. Вместе с тем, следует заметить, что на фоне многих других участников дискуссии, Ваша речь выглядит более, чем культурно. Спасибо!
 
Последнее редактирование:

AmdY

Пью пиво
Команда форума
AmdY, жалкий Вы какой-то... Но свое дело сделали, отбили желание появляться на этом форуме. Сижу теперь на http://www.codingforums.com/php/ и очень доволен как культурой общения, так и вполне дружественной атмосферой. Только пожалуйста, не появляйтесь там, срите уж в каком-то одном месте!
У тебя кроме ваты в голове хоть что-то есть? Я тебе привёл книгу, привёл страницу с которой читать, сделал скриншот этой страницы. Да, я жалкий, как и мои попытки заставить включить мозг существа, у которого только мозжечок работает. К сожалению, новое место ты нашёл зашарпанное, целых 182 темы уровня "как пользоваться foreach".

Мне нравится передача "всё как у зверей", рассматриваешь себя и свои поступки с точки зрения животных инстинктов. Но очень страшно в жизни наблюдать за существами, которые заглушают в себе даже такие элементарные реакции, прячутся в раковине зоны комфорта: мол не троньте меня, я - амёба, я не хочу ничего решать и думать.
 

AmdY

Пью пиво
Команда форума
p.s. Тема вроде исчерпана, автору дали ответ, хоть он и не внял ему, а сейчас переход на личности. Не хочу закрывать, чтобы не началась песнь обиженных о произволе модераторов.
 

Absinthe

жожо
Не хочу закрывать, чтобы не началась песнь обиженных о произволе модераторов.
Думаешь, надо терпеть, когда какой-то тугодум, считающий себя пупом земли, оскорбляет направо и налево?
Почему его до сих пор не предупредили и не добавили в readonly за повтор нарушения?

То, что он развел, читать противно. Тема состоит из оскорблений чуть более, чем на 100%.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Ок, я закрыл, может начинать ныть про модераторов, и все такое.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху