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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

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



Новичок


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


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




Привет. начал изучать ООП, пишу небольшой скрипт...
есть класс для работы с БД

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


и еще один класс
PHP:
скопировать код в буфер обмена
  1. class User {
  2.  var $row;
  3.  function __construct($uid) {
  4.          if($db->resnum_qu("SELECT * FROM `USERS` WHERE `ID` = ".$uid." LIMIT 1") != 1) return '';
  5.          else $this->row = $db->result();
  6.   }


В коде создаю сначала объект класса БД
PHP:
скопировать код в буфер обмена
  1. $db = new dbclass;
  2. $db->init($db_name, $db_user_name, $db_user_pass);

далее пытаюсь создать класс пользователя
$USER = new User("1");
и получаю ошибку Call to a member function resnum_qu() on a non-object

догадываюсь, что проблема в том, что класс пользователя "не видит" класс БД.

вопрос: как лучше реализовать программу? наследовать класс БД?
 
 Top
Мелкий Супермодератор
Отправлено: 11 Октября, 2011 - 21:56:56
Post Id



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


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


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




smumrik пишет:
наследовать класс БД?

Ни в коем случае.

smumrik пишет:
как лучше реализовать программу?

Паттерн Singleton обычно используется.

Ну и плюс имена методов разные - resnum_qu и qu


-----
PostgreSQL DBA
 
 Top
OrmaJever Модератор
Отправлено: 11 Октября, 2011 - 22:03:06
Post Id



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


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


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




smumrik пишет:
function __construct($uid) {
if($db->resnum_qu("SELECT * FROM `USERS` WHERE `ID` = ".$uid." LIMIT 1") != 1) return '';
else $this->row = $db->result();
}

такк... откуда берётся $db? А неоткуда! Потомучто нужно передавать либо параметром либо через global ну или создавать обьект внутри контруктора


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
smumrik
Отправлено: 11 Октября, 2011 - 22:06:22
Post Id



Новичок


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


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




Мелкий
почитал в википедии http://ru.wikipedia.org/wiki/Одиночка_(шаблон_проектирования)
ничего не понял, можно подробней?
или все таки прочитать книгу «Приемы объктно-ориентированного проектирования. Паттерны проектирования», Э. Гамма, Р. Хелм, Р. Джонсон, Д. Влиссилес
нужно?
(Добавление)
OrmaJever пишет:
такк... откуда берётся $db? А неоткуда! Потомучто нужно передавать либо параметром либо через global ну или создавать обьект внутри контруктора

а какой вариант более удачный?
мне кажется, что внутри конструктора создавать объет БД неудачный вариант Однако
(а если у меня тысяча объектов, то что и тысяча объектов класса БД что ли)
(Добавление)
а как передать параметром? да и что передавать? объект класса БД в конструктор класса USER? Однако

(Отредактировано автором: 11 Октября, 2011 - 22:35:50)

 
 Top
OrmaJever Модератор
Отправлено: 11 Октября, 2011 - 22:26:28
Post Id



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


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


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




Вспомнил ещё один вариант
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.   }

(Добавление)
ах забыл написать
PHP:
скопировать код в буфер обмена
  1. $db = new dbclass;
  2. $db->init($db_name, $db_user_name, $db_user_pass);
  3. $user = new user(/* ... */);
  4. $user->db = $db; // а ещё лутше написать так $user->db = &$db;  
  5. // но это взависимоти от ситуации
  6. // дальше как нужно


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Мелкий Супермодератор
Отправлено: 11 Октября, 2011 - 22:34:38
Post Id



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


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


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




smumrik пишет:
нужно?

Нужно, если хотите развиваться в направлении программирования. Правда я сам ещё не осилил эту книгу.

smumrik пишет:
ничего не понял, можно подробней?

Например, мой класс для мелких проектов:
Спойлер (Отобразить)


Соответственно, в месте, где нужно выполнить запрос:

Класс dbresult просто для удобства абстрагирования, да реализует несколько хороших интерфейсов.


-----
PostgreSQL DBA
 
 Top
smumrik
Отправлено: 11 Октября, 2011 - 22:37:25
Post Id



Новичок


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


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




OrmaJever
а так

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


$USER = new User(2, $db);
echo $USER->row["ID"];
неудачный вариант?
 
 Top
White
Отправлено: 11 Октября, 2011 - 22:40:40
Post Id



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


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


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




smumrik пишет:
function __construct($db,$id) {

$USER = new User($db,1);
так конечно работать будет, но это плохой вариант. решается проблема либо синглтоном, либо статическими методами самого dbclass. можно сделать так в классе dbclass

PHP:
скопировать код в буфер обмена
  1. class dbclass {
  2.   public static $con;
  3.  
  4.   private function __construct() {}
  5.  
  6.   public static function init($db_name, $db_user_name, $db_user_password) {
  7.     if(!self::$con) self::$con=new dbclass;
  8.     self::$con->dbid = mysql_connect('localhost', $db_user_name, $db_user_password);
  9.     mysql_select_db($db_name, self::$con->dbid);
  10.  }
  11.  
  12. ...
  13. }
  14. dbclass::init($db_name, $db_user_name, $db_user_pass);
  15.  
  16. class User {
  17.   public $row;
  18.   function __construct($uid) {
  19.     if(dbclass::$con->resnum_qu("SELECT * FROM `USERS` WHERE `ID` = ".$uid." LIMIT 1") != 1) return '';
  20.     else $this->row = dbclass::$con->result();
  21.   }
  22. }
  23.  
  24. $user = new User(1);
  25. echo $user->row["ID"];

(Отредактировано автором: 11 Октября, 2011 - 22:42:12)



-----
if(time()>1356048000) die();
 
 Top
caballero
Отправлено: 11 Октября, 2011 - 22:42:39
Post Id


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


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


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




Цитата:
$USER = new User(2, $db);
echo $USER->row["ID"];
неудачный вариант?

так присвой хотябы внуьренней переменной эту $db
следующий метод как вызывать будешь? Ссылка то локальная


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



Новичок


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


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




OrmaJever
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;


не работает, ведь при создании объекта $user = new user(); $db туда не передается
 
 Top
caballero
Отправлено: 11 Октября, 2011 - 22:56:14
Post Id


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


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


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




и что что не передается

ты ж сам присваиваешь
$user->db = $db;


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



Новичок


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


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




caballero но это же уже после создания объекта!
в момент создания объекта $this->db в классе пустая же
 
 Top
caballero
Отправлено: 11 Октября, 2011 - 23:01:40
Post Id


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


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


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




Цитата:
в момент создания объекта $this->db в классе пустая же

И какая проблемма?


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



Новичок


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


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




caballero пишет, что нет такого объекта
 
 Top
caballero
Отправлено: 11 Октября, 2011 - 23:13:57
Post Id


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


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


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




где в каком месте пишет
и о каком объекте речь
кто обращается к этому объекту в каком месте?


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 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