Виталий Бохин
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;
}
Чтоб минимизировать код, подключение происходит в классе, и в каждой функции создается экземпляр. Таких функций множество и при каждом создании экземпляра по идее каждый раз происходит запрос на подключение к базе. Как реализовать это дело так, чтоб происходило одно подключение, одним словом как экземпляр передать непосредственно в функцию, а не создавать его внутри функции? Перерыл горы литературы и никак не могу вьехать. Кто может рабочий пример привести, буду безгранично благодарен.
Виталий Я.
659 повідомлень
#10 років тому
Патерн синглтон.
Виталий Бохин
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 років тому
Попробуй указатель)


  1. function get_menu($parent_id, & $db){
  2. //тело функции
  3. }

Выходит  каждый раз "комок всего" передаешь полностью, а так лишь ссылку на ранее созданный 

Не помню как там работает ПДО и есть ли отличия в рнр5.2-5.5. (нужно читать доки), но твой вариант копирует в функцию экземпляр, и если нужно изменить что-то в $db внутри функции (например добавлять лог запросов) - это в твое варианте не выйдет

попробуй мой )
Виталий Бохин
953 повідомлення
#10 років тому
kirilev, в 5-м пхп  & $db и $db кажется одно и то же. нашол видеоуроки по ООП, если интересует 
Виталий Я.
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;
вобщем спасибо за отклики. закрываю тему