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 :: Версия для печати :: Передача объекта между классами либо правильное использование PDO
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Передача объекта между классами либо правильное использование PDO

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

1. hhh0pE - 19 Июля, 2011 - 03:45:28 - перейти к сообщению
Здравствуйте.
ООП в php на практике начал изучать недавно(а точнее - пару дней назад).
Возник вопрос, а параллельно и второй.
Итак, для работы с mysql использую PDO.

1) Есть класс DB для работы с mysql. В нем пока что лишь одна функция connect();

PHP:
скопировать код в буфер обмена
  1.  
  2. class DB {
  3. ..
  4. private static $BDobj=false;
  5.  
  6. public function connect($user=default_user, $pass=default_pass, etc) {
  7. ..
  8. try{
  9.                         if(!self::$BDobj) {
  10.                                 self::$BDobj = new PDO($this->type_of_base.":host=".$this->host.";dbname=".$this->database, $this->username, $this->password);
  11.                                 return self::$BDobj;   
  12.                         }else{
  13.                                 return self::$BDobj;   
  14.                         }
  15.                 } catch(Exception $e){
  16.                         echo $e->getMessage();         
  17.                 }
  18. }
  19.  
  20. }
  21.  


и класс Trek -- для работы с музыкальными треками.
И в нем, в методе Add(параметры) использую такой код:
PHP:
скопировать код в буфер обмена
  1.  
  2. try {
  3.                 $query="INSERT INTO treks (name, author, time, fcode, scode, upload_date) VALUES (".$this->name.", ".$this->author.", ".$this->time.", ".$this->fcode.", ".$this->scode.", ".$this->upload_date.");";  
  4.                        
  5.                 $bd = DB::connect();
  6.  
  7.                 //echo get_class($bd); Выводит "PDO"
  8.  
  9.                 $bd->query($query);
  10.                 }catch(Exception $e) {
  11.                         echo $e->getMessage();
  12.                         echo mysql_error();
  13.                 }
  14.  


Т.е. переменной $bd я передал объект PDO, соответственно $bd->query() должно работать. Но ничего не происходит.. Вообще ничего, исключение так же не вызывается Недовольство, огорчение

Собственно, хотелось бы узнать свою ошибку..


2) И параллельно второй вопрос:
Мне кажется, что я сильно усложнил обычную работу с PDO.
Например, можно при каждой работе с базой просто создавать новый объект PDO и работать с ним. Но меня смущает, что каждый раз будет создаваться новое соединение.. Как быть?

Заранее спасибо за ответы!
2. DeepVarvar - 19 Июля, 2011 - 08:19:57 - перейти к сообщению
hhh0pE пишет:
$bd = DB::connect();

Зачем? Это абстрактный класс..
Нужно что-то типа:

db::connect();
$view = db::query("SELECT bla bla bla");
db::insert("INSERT INTO bla bla bla");
// закончили работать с базой - закрываемся
db::close();

Cоединение только одно, на протяжении всех расчетов.
Перед выводом юзеру результата - закрываем.
3. White - 19 Июля, 2011 - 08:34:49 - перейти к сообщению
в функции connect вы объявляете $user, $pass, а в
конструктор класса PDO отправляете переменные $this->database и т.п.
теперь вопрос, если вы используете DB::connect() как метод целого класса, а не объекта, то вероятно должны оперировать только статическими свойствами класса, а $this->database и ей подобные можно было бы использовать только в случае $some_object->connect().
т.е. вы пытаетесь использовать $this в контексте класса, а не объекта.
4. hhh0pE - 19 Июля, 2011 - 16:49:47 - перейти к сообщению
DeepVarvar, у PDO методы не статические, по-этому предложенный Вами вариант не подходит..

White пишет:
в функции connect вы объявляете $user, $pass, а в
конструктор класса PDO отправляете переменные $this->database и т.п.

Все верно, просто на форуме я написал не весь код, о чем свидетельствует слово "etc" в параметрах метода Улыбка

Но как тогда работать с БД через PDO? В том плане, что бы не создавать множество подключений к базе при каждой работе с онной. Возможно, есть какая-то функция проверки на подключение, etc..
(Добавление)
Да и как, собственно, тогда передать объект между классами?
5. Slavenin - 19 Июля, 2011 - 18:08:06 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. class a
  2. {
  3.   function a()
  4.   {
  5.     ;
  6.   }
  7.   function foo()
  8.   {
  9.     echo 'класс а';
  10.   }
  11. }
  12.  
  13. class b
  14. {
  15.   public $f;
  16.  
  17.   function b($obj)
  18.   {
  19.     this->f=$obj;
  20.   }
  21. }
  22.  
  23. $ob1 = new a();
  24. $ob2 = new b($ob1);
  25. $ob2->f->foo();


но можно и проще

PHP:
скопировать код в буфер обмена
  1. class a
  2. {
  3.   a()
  4.   {
  5.     ;
  6.   }
  7.   function foo()
  8.   {
  9.     echo 'класс а';
  10.   }
  11. }
  12.  
  13. class b extend a
  14. {
  15.   b()
  16.   {
  17.     ;
  18.   }
  19. }
  20.  
  21. $ob2 = new b();
  22. $ob2->foo();
6. OrmaJever - 19 Июля, 2011 - 18:30:09 - перейти к сообщению
hhh0pE пишет:
Но как тогда работать с БД через PDO?

ну pdo это уже класс, разве с ним нельзя работать?
а если так хочется написать клас по своему то почему бы не наследовать pdo?
7. hhh0pE - 19 Июля, 2011 - 18:54:16 - перейти к сообщению
OrmaJever, дело в том, что я и рад бы не делать свой класс, но необходимо решить проблему:
не создавать каждый раз при работе с БД подключение. А в PDO нет проверки на действующее соединение, как я понял. Вот отсюда и отталкиваюсь.. Предложите другой вариант - буду только благодарен ;)

Slavenin, спасибо, сейчас попробую применить в моем коде.
(Добавление)
По-идеи, можно просто создать глобальную переменную, которой присваивать значение 1 при подключении, а дальше просто проверять, есть ли подключение(по переменной). Но проблема в том, что если подключение уже существует, как получить уже созданный PDO объект?
8. DeepVarvar - 19 Июля, 2011 - 19:23:19 - перейти к сообщению
hhh0pE пишет:
Но проблема в том, что если подключение уже существует, как получить уже созданный PDO объект?

Сдается мне что вам требуется Singleton - то самое поведение, если экземпляр уже создан - при попытке создать еще один - вам вернется созданный ранее, в том состоянии в котором он остался после последнего к нему обращения выше по коду.
9. OrmaJever - 19 Июля, 2011 - 19:31:17 - перейти к сообщению
hhh0pE пишет:
не создавать каждый раз при работе с БД подключение. А в PDO нет проверки на действующее соединение, как я понял. Вот отсюда и отталкиваюсь.. Предложите другой вариант - буду только благодарен ;)

я с pdo не очень знаком, но зачем делать содинения 2 несколько раз? Обычно соединение проходит в конструкторе который вызывается только 1 раз при создании обьекта, а потом уже делать запросы.
а mysqli не подходит? Закатив глазки
10. LifePlay - 19 Июля, 2011 - 19:31:53 - перейти к сообщению
Подскажите валенку. что если в начале кода прописать подключение к БД. То все дальнейшие действия с базой типа инсерт, селект и тд. Будут опять подключатся? Я просто думал что если раз подключился в начале то операции будут использовать существующие подключение.
11. hhh0pE - 19 Июля, 2011 - 19:34:38 - перейти к сообщению
DeepVarvar, спасибо! Сейчас гуглю синглтон, заодно наткнулся на фабрику. Интересно Улыбка

OrmaJever, правильно! Так вот как мне получить объект, если соединение с БД уже существует? И это должно быть в любом месте кода.
А чем mysqli отличается от обычного mysql? Можете объяснить?
(Добавление)
LifePlay, в случае обычного mysql_connect подключение будет только раз, все mysql_query будут работать на существующем подключении, если в параметре не указано иное Улыбка
12. LifePlay - 19 Июля, 2011 - 19:55:02 - перейти к сообщению
hhh0pE пишет:
LifePlay, в случае обычного mysql_connect подключение будет только раз, все mysql_query будут работать на существующем подключении, если в параметре не указано иное

Ну так почему вы так не сделаете? Не подключитесь к базе вне класов?
13. hhh0pE - 19 Июля, 2011 - 19:56:23 - перейти к сообщению
LifePlay, потому что я подключаюсь не обычным mysql_connect, а с помощью PDO, а это - класс.
14. OrmaJever - 19 Июля, 2011 - 20:38:19 - перейти к сообщению
hhh0pE пишет:
OrmaJever, правильно! Так вот как мне получить объект, если соединение с БД уже существует? И это должно быть в любом месте кода.
А чем mysqli отличается от обычного mysql? Можете объяснить?

Ответ сразу на 2 вопроса
PHP:
скопировать код в буфер обмена
  1. $mysqli = new mysqli('localhost', 'user', 'pass');
  2. $mysqli->query('INSERT INTO ...');
  3. $res = $mysqli->query('SELECT ...');
  4. $mysql->query(...);

один раз подключение а затем индефикатор подключения хранится в обьекте, и затем может быть куча запросов на этом подключении
(Добавление)
mysqli отличается от mysql
1) имеет оо интерфейс
2) работает быстрее
3) безопаснее
4) разработка mysql прекратилась в php 4.1 и уже устарел и будет убран в php6
15. hhh0pE - 19 Июля, 2011 - 22:41:20 - перейти к сообщению
OrmaJever, спасибо, буду знать ;)

Я остановился на таком варианте: класс DB наследует PDO, он же сделан синглтоном. То, что нужно! ;)
Спасибо, DeepVarvar Подмигивание

 

Powered by ExBB FM 1.0 RC1