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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Класс для создания соединения с базой

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
KEFIR4UK
Отправлено: 09 Февраля, 2015 - 17:55:02
Post Id



Частый гость


Покинул форум
Сообщений всего: 161
Дата рег-ции: Апр. 2014  


Помог: 0 раз(а)




Добрый вечер.Решил написать класс одиночку для соединения с БД.Правда никак не могу сделать запрос из базы.Сам класс вот такой:
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");
Где накосячидл)
 
 Top
skiphog
Отправлено: 09 Февраля, 2015 - 18:04:19
Post Id



Частый гость


Покинул форум
Сообщений всего: 139
Дата рег-ции: Дек. 2014  
Откуда: Киров, Россия


Помог: 11 раз(а)




PHP:
скопировать код в буфер обмена
  1. $db1 = Database::getInstance()->dbh->query('SELECT * FROM auth');


Либо опишите свой метод query() внутри класса.
 
My status
 Top
KEFIR4UK
Отправлено: 09 Февраля, 2015 - 18:06:17
Post Id



Частый гость


Покинул форум
Сообщений всего: 161
Дата рег-ции: Апр. 2014  


Помог: 0 раз(а)




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();

Вот так заработало

(Отредактировано автором: 09 Февраля, 2015 - 18:18:23)

 
 Top
skiphog
Отправлено: 09 Февраля, 2015 - 18:18:38
Post Id



Частый гость


Покинул форум
Сообщений всего: 139
Дата рег-ции: Дек. 2014  
Откуда: Киров, Россия


Помог: 11 раз(а)




Можете описать их в прямо в классе
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");
 
My status
 Top
Bio man
Отправлено: 10 Февраля, 2015 - 14:58:33
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




А переопределить класс PDO не приходило в голову?
Да и одиночки ныне считаются анти-паттерном, так что лучше иметь глобального поставщика услуг (service provider), который будет как центральная точка для создания объектов.
Такая реализация будет более гибкой и современной.
С одиночкой не получится создать параллельное подключение, а с поставщиком услуг можно создавать, как одиночки, так и обычные объекты.
 
 Top
KEFIR4UK
Отправлено: 10 Февраля, 2015 - 15:14:28
Post Id



Частый гость


Покинул форум
Сообщений всего: 161
Дата рег-ции: Апр. 2014  


Помог: 0 раз(а)




Bio man пишет:
А переопределить класс PDO не приходило в голову?
Да и одиночки ныне считаются анти-паттерном, так что лучше иметь глобального поставщика услуг (service provider), который будет как центральная точка для создания объектов.
Такая реализация будет более гибкой и современной.
С одиночкой не получится создать параллельное подключение, а с поставщиком услуг можно создавать, как одиночки, так и обычные объекты.

Приходило, но мне нужно будет возвращять послдений идентификатор вставленной записи если класс не сделать сингелтоном то идентификатор будет всегда возвращать 0 поскольку каждый раз бдет создаваться новый класс.
 
 Top
Ch_chov
Отправлено: 10 Февраля, 2015 - 15:19:00
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




http://tonylandis[dot]com/php/php5-p[dot][dot][dot]singleton-class/

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

Ну или в сервис это завернуть как уже предложили.
 
 Top
Bio man
Отправлено: 10 Февраля, 2015 - 15:22:26
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




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
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB