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 :: обращение к методам класса БД [2]

 PHP.SU

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


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

> Без описания
smumrik
Отправлено: 11 Октября, 2011 - 23:18:28
Post Id



Новичок


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


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




caballero
PHP:
скопировать код в буфер обмена
  1. class User {
  2.   public $db; // хотя можно и private, и через конструктор инстализировать
  3.  var $row;
  4.  function __construct($uid) {
  5.          if($this->db->resnum_qu("SELECT * FROM `USERS` WHERE `ID` = ".$uid." LIMIT 1") != 1) return ''; //теперь обращение  $this->db->*
  6.          else $this->row = $db->result();
  7.   }
  8.  
  9. $db = new dbclass;
  10. $db->init($db_name, $db_user_name, $db_user_pass);
  11. $user = new user(/* ... */);
  12. $user->db = $db;


5 строка
при создании объекта в db пусто, не так ли?
 
 Top
caballero
Отправлено: 11 Октября, 2011 - 23:28:30
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


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




кароче
PHP:
скопировать код в буфер обмена
  1.  
  2. class User {
  3.   private $db;
  4. function __construct($uid, $db) {
  5.   $this->db = $db;
  6.   $this->db->resnum_qu("select ...");)
  7.  
  8. }
  9.  
  10.    function    load(){
  11.           $this->db->resnum_qu("select ...");)
  12.      
  13. }
  14.  
  15.  
  16.  
  17.    function    save(){
  18.           $this->db->resnum_qu("insert  ...");
  19.      
  20. }
  21.  
  22. ...  и т.д.
  23. }
  24.  
  25.  
  26.  
  27. $user = new   User($db);
  28. $user->load();
  29. $user->save();

(Отредактировано автором: 11 Октября, 2011 - 23:29:51)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
OrmaJever Модератор
Отправлено: 12 Октября, 2011 - 00:32:55
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




Вобщем то мелкий был прав. Для класса дб лутше использовать синглтон. Тогда будет так
PHP:
скопировать код в буфер обмена
  1. class User {
  2.   private $db;
  3.  var $row;
  4.  function __construct($uid) {
  5.          $this->db = DB::singleton(); // и выдумывать ничего не надо
  6.          if($this->db->resnum_qu("SELECT * FROM `USERS` WHERE `ID` = ".$uid." LIMIT 1") != 1) return ''; //теперь обращение  $this->db->*
  7.          else $this->row = $db->result();
  8.   }


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
caballero
Отправлено: 12 Октября, 2011 - 00:48:01
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


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




если используется синглетон то на фига тогда
private $db;
$this->db


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
smumrik
Отправлено: 12 Октября, 2011 - 15:56:06
Post Id



Новичок


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


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




OrmaJever
ок, использую синглтон
PHP:
скопировать код в буфер обмена
  1.  
  2. class dbclass {
  3.  public static $db;
  4.  var $dbid;
  5. ................
  6.  
  7.  private static function getDB() {
  8.     if(!self::$db) self::$db=new dbclass;
  9.         return self::$db;
  10.  }
  11.  
  12.  # Подключение к БД
  13. function init($db_name, $db_user_name, $db_user_password)
  14.  {
  15.   self::$db->dbid = mysql_connect('localhost', $db_user_name, $db_user_password);
  16.   mysql_select_db($db_name, self::$db->dbid);
  17.  }
  18.  # Выполнение запроса
  19. function qu($qu)
  20.  {
  21.     if(!self::$db->query_id=mysql_query($qu, self::$db->dbid)) return self::$db->error();
  22.     return self::$db->query_id;
  23.  }
  24. и т.д.....
  25.  

правильно?
а в классе User будет
PHP:
скопировать код в буфер обмена
  1.  
  2. dbclass::$db->resnum_qu("SELECT * FROM `USERS` WHERE `ID` = ".$uid." LIMIT 1") != 1) return '';
  3.     else dbclass::$db->row = dbclass::$db->result();

и везде, где нужно подключиться к БД нужно будет писать dbclass::$db-> метод, так?
 
 Top
caballero
Отправлено: 12 Октября, 2011 - 17:13:01
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


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




теперь это нафига
public static $db;


а это
else $this->row = $db->result();
сработает когда не сработает select
наведи порядок в обычном if

кароче
$db = DB::singleton()
$db->resnum_qu()

или еще проще
DB::singleton()->resnum_qu()


и так везде
иначе смысл синглетона какой


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
smumrik
Отправлено: 12 Октября, 2011 - 17:38:21
Post Id



Новичок


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


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




caballero пишет:
теперь это нафига
public static $db;

я сделал по подобию кода в этой статье http://dron[dot]by/post/pattern-proe[dot][dot][dot]dinochka-na-php/
а какая разница как я буду писать, dbclass::$db->метод или dbclass::$getDB()->метод?
а, понял, dbclass::$getDB() всегда выдает там объект класса БД, так?
(Добавление)
caballero пишет:
а это
else $this->row = $db->result();
сработает когда не сработает select
наведи порядок в обычном if

сработает, когда сработает селект Радость так в условии !=1
 
 Top
caballero
Отправлено: 12 Октября, 2011 - 17:57:37
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


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




Цитата:
всегда выдает там объект класса БД, так

да
поэтому никакие промежуточные переменные а тем более члены класса не нужны

Цитата:
сработает, когда сработает селект так в условии !=1

возможно
просто подобный стиль написания в мозг не укладывается


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
smumrik
Отправлено: 12 Октября, 2011 - 18:09:14
Post Id



Новичок


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


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




caballero
PHP:
скопировать код в буфер обмена
  1.  class dbclass {
  2.   public static $db;
  3.  var $dbid;
  4.  var $query_id;
  5.  var $query_res;
  6.  var $num_results;
  7.  
  8.  public static function getDB() {
  9.         if(!self::$db) self::$db=new dbclass;
  10.         return self::$db;
  11.  }
  12.  # Подключение к БД
  13. static function init($db_name, $db_user_name, $db_user_password)
  14.  {
  15.   $this->dbid = mysql_connect('localhost', $db_user_name, $db_user_password);
  16.   mysql_select_db($db_name, $this->dbid);
  17.  }
  18.   function qu($qu)
  19.  {
  20.     if(!$this->query_id=mysql_query($qu, $this->dbid)) return $this->error();
  21.     return $this->query_id;
  22.  }

правильно ли, что писать dbclass::getDB()-> нужно писать только при работе с классом извне(из других классов)? в самом классе нужно писать $this?
этот код удачно работает с классом выше
PHP:
скопировать код в буфер обмена
  1. dbclass::getDB()->init($db_name, $db_user_name, $db_user_pass);
  2. dbclass::getDB()->qu('SET NAMES UTF8');

(Отредактировано автором: 12 Октября, 2011 - 18:14:59)

 
 Top
White
Отправлено: 12 Октября, 2011 - 18:44:14
Post Id



Частый посетитель


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


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




smumrik правильно, только не забудьте сделать
PHP:
скопировать код в буфер обмена
  1. private function __construct() {}
в dbclass, чтобы оградиться от собственных ошибок и не наплодить случайно лишних сущностей.


-----
if(time()>1356048000) die();
 
 Top
Hakob
Отправлено: 06 Ноября, 2011 - 17:26:10
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Нояб. 2011  


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




Привет всем кто поможет?

Можна ли саздат класс для подключения бд в котором содержится бд_хост, бд_user, бд_pass а если можна на сколко ето безапасна ????
 
 Top
caballero
Отправлено: 06 Ноября, 2011 - 17:32:09
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


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




класс в предыдущих постах показан
к безопасности класс или нет никакого отношение не имеет

(Отредактировано автором: 06 Ноября, 2011 - 17:33:07)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Hakob
Отправлено: 06 Ноября, 2011 - 18:07:10
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Нояб. 2011  


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




это как joomla ?

если да то не нада я сам хочу написать сйт так как мне удобна
просто хотелась db_host, db_user, db_pass писать в одном файле а точнее в классе, потом вызват с других файлах кагда нужна подключится бд.
 
 Top
Страниц (2): « 1 [2]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB