Помогите, плиз, разобраться с PHP
953 повідомлення
#10 років тому
Пишу миникаталог процедурным способом, но и объекты малость использую, в частности в работе с базой данных.class DbЧтоб минимизировать код, подключение происходит в классе, и в каждой функции создается экземпляр. Таких функций множество и при каждом создании экземпляра по идее каждый раз происходит запрос на подключение к базе. Как реализовать это дело так, чтоб происходило одно подключение, одним словом как экземпляр передать непосредственно в функцию, а не создавать его внутри функции? Перерыл горы литературы и никак не могу вьехать. Кто может рабочий пример привести, буду безгранично благодарен.
{
function __construct()
{
$this->db = new PDO('mysql:host=localhost;dbname=database','user','pass');
$this->db->query('SET NAMES utf8');
}
}
function get_menu($parent_id)
{
$db = new Db;
$sql = $db->db->prepare('SELECT * FROM categories WHERE parent_id=? ORDER BY nav');
$sql->execute(array($parent_id));
$result = $sql->fetchAll(PDO::FETCH_ASSOC);
return $result;
}
function get_parent_id($category_id)
{
$db = new Db;
$sql = $db->db->prepare('SELECT * FROM categories WHERE alias=?');
$sql->execute(array($category_id));
$result = $sql->fetch(PDO::FETCH_ASSOC);
return $result;
}
953 повідомлення
#10 років тому
Xazzzi, Читал пробовал, крутил, что-то не пашет и все. Пошел другим путем, так вроде норм? прокомментируй если хорошо разбирашься...class Dbсоздаю экземпляр один раз в начале шаблона, и отправляю переменную в функцию.
{
function __construct()
{
$this->db = new PDO('mysql:host=localhost;dbname=db','user','pass');
$this->db->query('SET NAMES utf8');
}
}
function get_menu($parent_id, $db)
{
$sql = $db->db->prepare('SELECT * FROM categories WHERE parent_id=? ORDER BY nav');
$sql->execute(array($parent_id));
$result = $sql->fetchAll(PDO::FETCH_ASSOC);
return $result;
}
$db = new Db;
$arr = get_menu($parent_id, $db);
828 повідомлень
#10 років тому
Добрый день, может так?public function __construct($server = NULL, $username = NULL, $password = NULL, $database = NULL, $port = NULL) {
$this->connect( ... );
}
function connect() {
//.. connecting ..//
}
function close() {
//.. close connection ..//
}
function func1() {
//.. function code ..//
}
function func2() {
//.. function code ..//
}
function func3() {
//.. function code ..//
}
function __destruct() {
$this->close();
}
953 повідомлення
#10 років тому
PerfectoWeb, Спасибо, надо тестить. сделал уже по своему (см. выше), может кривовато, но кол. запросов сократил вроде
2817 повідомлень
#10 років тому
Попробуй указатель)
- function get_menu($parent_id, & $db){
- //тело функции
- }
Выходит каждый раз "комок всего" передаешь полностью, а так лишь ссылку на ранее созданный
Не помню как там работает ПДО и есть ли отличия в рнр5.2-5.5. (нужно читать доки), но твой вариант копирует в функцию экземпляр, и если нужно изменить что-то в $db внутри функции (например добавлять лог запросов) - это в твое варианте не выйдет

попробуй мой )
953 повідомлення
659 повідомлень
#10 років тому
lufter, я ж предложил вам нормальное решение вашей проблемы, почему вы так стремитесь сделать через... кхм.Вотпосилання, с чем там нельзя разобраться мне не понятно.
Ваш код, который был приведен выше, смахивает на РНР4 скорее: ни обьявления свойства db в классе (что минимум Notice должно вызывать), ни областей видимости для свойств и функций. Или на копипаст, который вы сами не понимаете. Извините уж, как есть.
953 повідомлення
#10 років тому
Цитата (Xazzzi):ни обьявления свойства db в классе (что минимум Notice должно вызывать)
Xazzzi, не вызывает)))Цитата (Xazzzi):
ни областей видимости для свойств и функцийXazzzi, по умолчанию принимается public , не обязательно писать
не копипаст, все прекрасно понимаю, но конечно еще много всего неизведанного, учусь постоянно чему-то новому
Даже с синглтоном обьект нужно передавать через скобки в функцию.
Очень даже норм работает вышеприведенный мною код. Проверил деструктором (выдало один раз), значит и обьект создался один раз, клонов обьекта так же нет, тк. в пхп 5 (только для обьектов) $db = new Db; то же что и $db = & new Db; чтоб клонировать, нужно делать так $nev_db = clone $db;
вобщем спасибо за отклики. закрываю тему