Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Класс для создания соединения с базой
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Класс для создания соединения с базой

Страниц (1): [1]
 

1. KEFIR4UK - 09 Февраля, 2015 - 17:55:02 - перейти к сообщению
Добрый вечер.Решил написать класс одиночку для соединения с БД.Правда никак не могу сделать запрос из базы.Сам класс вот такой:
PHP:
скопировать код в буфер обмена
  1.  
  2. class Database{
  3.         static private $Instance = NULL;
  4.         public $dbh;
  5.         private $host="localhost";
  6.         private $user="root";
  7.         private $password="";
  8.         private $db="testdb";
  9.         protected  function __construct(){
  10.                         try{
  11.                                 $this->dbh=new PDO("mysql:host=$this->host;dbname=$this->db",$this->user,$this->password);
  12.                                 $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  13.                                
  14.                         }catch(PDOException $e){
  15.                                 die($e->getMessage());
  16.                         }      
  17.         }
  18.         protected function __clone() {}
  19.         static public function getInstance(){
  20.                 if(self::$Instance ==NULL){
  21.                         self::$Instance = new Database();      
  22.                 }
  23.                 return self::$Instance;
  24.         }              
  25. }
  26.  

Запрос делаю таким образом
PHP:
скопировать код в буфер обмена
  1.  
  2.  $db1=Database::getInstance()->query("SELECT * FROM auth");
  3. $rows = $db1->fetchAll();
  4.  

Но метериться : Call to undefined method Database::query() на етой строке :
$db1=Database::getInstance()->query("SELECT * FROM auth");
Где накосячидл)
2. skiphog - 09 Февраля, 2015 - 18:04:19 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $db1 = Database::getInstance()->dbh->query('SELECT * FROM auth');


Либо опишите свой метод query() внутри класса.
3. KEFIR4UK - 09 Февраля, 2015 - 18:06:17 - перейти к сообщению
skiphog пишет:
PHP:
скопировать код в буфер обмена
  1. $db1 = Database::getInstance()->dbh->query('SELECT * FROM auth');


Либо опишите свой метод query() внутри класса.

А если мне понадобится метод prepare,exec и тд....
(Добавление)
PHP:
скопировать код в буфер обмена
  1.  
  2. $db_obj=Database::getInstance();
  3. $dbh=$db_obj->coonect()->query("SELECT * FROM auth");
  4. $rows = $dbh->fetchAll();

Вот так заработало
4. skiphog - 09 Февраля, 2015 - 18:18:38 - перейти к сообщению
Можете описать их в прямо в классе
PHP:
скопировать код в буфер обмена
  1. public function query($sql) {
  2.   return $this->dbh->query($sql);
  3. }
  4.  
  5. public  function exec($sql) {
  6.   return $this->dbh->exec($sql);
  7. }


Тогда вы уже сможете вызвать
PHP:
скопировать код в буфер обмена
  1. $db1=Database::getInstance()->query("SELECT * FROM auth");
5. Bio man - 10 Февраля, 2015 - 14:58:33 - перейти к сообщению
А переопределить класс PDO не приходило в голову?
Да и одиночки ныне считаются анти-паттерном, так что лучше иметь глобального поставщика услуг (service provider), который будет как центральная точка для создания объектов.
Такая реализация будет более гибкой и современной.
С одиночкой не получится создать параллельное подключение, а с поставщиком услуг можно создавать, как одиночки, так и обычные объекты.
6. KEFIR4UK - 10 Февраля, 2015 - 15:14:28 - перейти к сообщению
Bio man пишет:
А переопределить класс PDO не приходило в голову?
Да и одиночки ныне считаются анти-паттерном, так что лучше иметь глобального поставщика услуг (service provider), который будет как центральная точка для создания объектов.
Такая реализация будет более гибкой и современной.
С одиночкой не получится создать параллельное подключение, а с поставщиком услуг можно создавать, как одиночки, так и обычные объекты.

Приходило, но мне нужно будет возвращять послдений идентификатор вставленной записи если класс не сделать сингелтоном то идентификатор будет всегда возвращать 0 поскольку каждый раз бдет создаваться новый класс.
7. Ch_chov - 10 Февраля, 2015 - 15:19:00 - перейти к сообщению
http://tonylandis[dot]com/php/php5-p[dot][dot][dot]singleton-class/

С наследованием конечно лучше будет. Вместо getInstanсe можно сделать статический метод getConnection и возвращать в нём непросредственно соединение с базой. Конструктор приватным не получится сделать, но можно туда исключение поставить.

Ну или в сервис это завернуть как уже предложили.
8. Bio man - 10 Февраля, 2015 - 15:22:26 - перейти к сообщению
KEFIR4UK пишет:
Приходило, но мне нужно будет возвращять послдений идентификатор вставленной записи если класс не сделать сингелтоном то идентификатор будет всегда возвращать 0 поскольку каждый раз бдет создаваться новый класс.
Нет. Не в этом дело. Нужно просто иметь ссылку на объект. Хранить ссылку можно в сервис локаторе.
Одна из реализаций - https://github[dot]com/yiisoft/yii2/[dot][dot][dot]rviceLocator.php
Доки - https://github[dot]com/yiisoft/yii2/[dot][dot][dot]rvice-locator[dot]md

 

Powered by ExBB FM 1.0 RC1