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 :: Передача объекта между классами либо правильное использование PDO
Покинул форум
Сообщений всего: 6
Дата рег-ции: Июль 2011
Помог: 0 раз(а)
Здравствуйте.
ООП в php на практике начал изучать недавно(а точнее - пару дней назад).
Возник вопрос, а параллельно и второй.
Итак, для работы с mysql использую PDO.
1) Есть класс DB для работы с mysql. В нем пока что лишь одна функция connect();
Т.е. переменной $bd я передал объект PDO, соответственно $bd->query() должно работать. Но ничего не происходит.. Вообще ничего, исключение так же не вызывается
Собственно, хотелось бы узнать свою ошибку..
2) И параллельно второй вопрос:
Мне кажется, что я сильно усложнил обычную работу с PDO.
Например, можно при каждой работе с базой просто создавать новый объект PDO и работать с ним. Но меня смущает, что каждый раз будет создаваться новое соединение.. Как быть?
Заранее спасибо за ответы!
DeepVarvar
Отправлено: 19 Июля, 2011 - 08:19:57
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
hhh0pE пишет:
$bd = DB::connect();
Зачем? Это абстрактный класс..
Нужно что-то типа:
db::connect();
$view = db::query("SELECT bla bla bla");
db::insert("INSERT INTO bla bla bla");
// закончили работать с базой - закрываемся
db::close();
Cоединение только одно, на протяжении всех расчетов.
Перед выводом юзеру результата - закрываем.
Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011 Откуда: Днепропетровск
Помог: 28 раз(а)
в функции connect вы объявляете $user, $pass, а в
конструктор класса PDO отправляете переменные $this->database и т.п.
теперь вопрос, если вы используете DB::connect() как метод целого класса, а не объекта, то вероятно должны оперировать только статическими свойствами класса, а $this->database и ей подобные можно было бы использовать только в случае $some_object->connect().
т.е. вы пытаетесь использовать $this в контексте класса, а не объекта.
----- if(time()>1356048000) die();
hhh0pE
Отправлено: 19 Июля, 2011 - 16:49:47
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Июль 2011
Помог: 0 раз(а)
DeepVarvar, у PDO методы не статические, по-этому предложенный Вами вариант не подходит..
White пишет:
в функции connect вы объявляете $user, $pass, а в
конструктор класса PDO отправляете переменные $this->database и т.п.
Все верно, просто на форуме я написал не весь код, о чем свидетельствует слово "etc" в параметрах метода
Но как тогда работать с БД через PDO? В том плане, что бы не создавать множество подключений к базе при каждой работе с онной. Возможно, есть какая-то функция проверки на подключение, etc.. (Добавление)
Да и как, собственно, тогда передать объект между классами?
Slavenin
Отправлено: 19 Июля, 2011 - 18:08:06
Посетитель
Покинул форум
Сообщений всего: 285
Дата рег-ции: Май 2010 Откуда: Тверь
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
hhh0pE пишет:
Но как тогда работать с БД через PDO?
ну pdo это уже класс, разве с ним нельзя работать?
а если так хочется написать клас по своему то почему бы не наследовать pdo?
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
hhh0pE
Отправлено: 19 Июля, 2011 - 18:54:16
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Июль 2011
Помог: 0 раз(а)
OrmaJever, дело в том, что я и рад бы не делать свой класс, но необходимо решить проблему:
не создавать каждый раз при работе с БД подключение. А в PDO нет проверки на действующее соединение, как я понял. Вот отсюда и отталкиваюсь.. Предложите другой вариант - буду только благодарен ;)
Slavenin, спасибо, сейчас попробую применить в моем коде. (Добавление)
По-идеи, можно просто создать глобальную переменную, которой присваивать значение 1 при подключении, а дальше просто проверять, есть ли подключение(по переменной). Но проблема в том, что если подключение уже существует, как получить уже созданный PDO объект?
DeepVarvar
Отправлено: 19 Июля, 2011 - 19:23:19
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
hhh0pE пишет:
Но проблема в том, что если подключение уже существует, как получить уже созданный PDO объект?
Сдается мне что вам требуется Singleton - то самое поведение, если экземпляр уже создан - при попытке создать еще один - вам вернется созданный ранее, в том состоянии в котором он остался после последнего к нему обращения выше по коду.
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
hhh0pE пишет:
не создавать каждый раз при работе с БД подключение. А в PDO нет проверки на действующее соединение, как я понял. Вот отсюда и отталкиваюсь.. Предложите другой вариант - буду только благодарен ;)
я с pdo не очень знаком, но зачем делать содинения 2 несколько раз? Обычно соединение проходит в конструкторе который вызывается только 1 раз при создании обьекта, а потом уже делать запросы.
а mysqli не подходит?
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
LifePlay
Отправлено: 19 Июля, 2011 - 19:31:53
Частый гость
Покинул форум
Сообщений всего: 135
Дата рег-ции: Авг. 2010 Откуда: Кобеляки, Украина
Помог: 0 раз(а)
Подскажите валенку. что если в начале кода прописать подключение к БД. То все дальнейшие действия с базой типа инсерт, селект и тд. Будут опять подключатся? Я просто думал что если раз подключился в начале то операции будут использовать существующие подключение.
hhh0pE
Отправлено: 19 Июля, 2011 - 19:34:38
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Июль 2011
Помог: 0 раз(а)
DeepVarvar, спасибо! Сейчас гуглю синглтон, заодно наткнулся на фабрику. Интересно
OrmaJever, правильно! Так вот как мне получить объект, если соединение с БД уже существует? И это должно быть в любом месте кода.
А чем mysqli отличается от обычного mysql? Можете объяснить? (Добавление) LifePlay, в случае обычного mysql_connect подключение будет только раз, все mysql_query будут работать на существующем подключении, если в параметре не указано иное
LifePlay
Отправлено: 19 Июля, 2011 - 19:55:02
Частый гость
Покинул форум
Сообщений всего: 135
Дата рег-ции: Авг. 2010 Откуда: Кобеляки, Украина
Помог: 0 раз(а)
hhh0pE пишет:
LifePlay, в случае обычного mysql_connect подключение будет только раз, все mysql_query будут работать на существующем подключении, если в параметре не указано иное
Ну так почему вы так не сделаете? Не подключитесь к базе вне класов?
hhh0pE
Отправлено: 19 Июля, 2011 - 19:56:23
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Июль 2011
Помог: 0 раз(а)
LifePlay, потому что я подключаюсь не обычным mysql_connect, а с помощью PDO, а это - класс.
OrmaJever
Отправлено: 19 Июля, 2011 - 20:38:19
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
hhh0pE пишет:
OrmaJever, правильно! Так вот как мне получить объект, если соединение с БД уже существует? И это должно быть в любом месте кода.
А чем mysqli отличается от обычного mysql? Можете объяснить?
один раз подключение а затем индефикатор подключения хранится в обьекте, и затем может быть куча запросов на этом подключении (Добавление)
mysqli отличается от mysql
1) имеет оо интерфейс
2) работает быстрее
3) безопаснее
4) разработка mysql прекратилась в php 4.1 и уже устарел и будет убран в php6
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
hhh0pE
Отправлено: 19 Июля, 2011 - 22:41:20
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Июль 2011
Помог: 0 раз(а)
OrmaJever, спасибо, буду знать ;)
Я остановился на таком варианте: класс DB наследует PDO, он же сделан синглтоном. То, что нужно! ;)
Спасибо, DeepVarvar
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.