Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> PDO singleTon
maruo  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 324
Пользователь №: 37433
На форуме: 3 года, 6 месяцев, 23 дня
Карма: 1




Подскажите где ошибка? возвращает пустой объект

class DataBase {

static private $PDOInstance;

public function __construct(){

if(!self::$PDOInstance) {
try {
self::$PDOInstance = new PDO('mysql:host=localhost;dbname=newrand', 'testuser', '12345');
self::$PDOInstance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
self::$PDOInstance->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (PDOException $e) {
die("PDO CONNECTION ERROR: " . $e->getMessage() . "<br/>");
}
}

return self::$PDOInstance;
}

private function __clone() {} //запрещаем клонирование объекта модификатором private

public function fetch_single_row($table,$col,$val) {
try{
$param = array($val);
$sel = self::$PDOInstance->prepare("SELECT * FROM $table WHERE $col=?");
$sel->execute($param);
return $sel->fetchAll();
}catch(PDOException $e){
die("PDO SQL ERROR: " . $e->getMessage() . "<br/>");
}

}

}


$cn = new DataBase;
$cn->fetch_single_row('users','user_id',42);

print_r($cn);




Все нашел, всегда так) Как напишешь на форуме сразу видишь ошибку, а в редакторе как то не так)
$cn = $cn->fetch_single_row('users','user_id',42);


Это сообщение отредактировал maruo - 6.05.2016 - 14:48
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Guest  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









Жесть.
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Zzepish  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Аццкая хрень
******

Профиль
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 5475
Пользователь №: 32538
На форуме: 4 года, 6 месяцев, 10 дней
Карма: 49




maruo
омг! Из __construct ничего не возвращается! По концепции singletone __construct должен быть private. У тебя должна быть единственная статичная функция: что-то вроде getConnectiontoDb, которая будет создавать или возвращать соединение с БД.
так-же приватными должны быть: __construct, __wakeup, __sleep, __clone. Вроде все


--------------------
Правда тоже ложь, но с иным углом.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
maruo  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 324
Пользователь №: 37433
На форуме: 3 года, 6 месяцев, 23 дня
Карма: 1




Zzepish
__construct, __wakeup, __sleep, __clone.
Это я уже дописал

Всмысле тоесть конструктор должен быть приватным и пустым?
А соединение получать через getConnection()?


private function __construct() {}

private function __clone() {}

private function __wakeup() {}

private function __sleep() {}


Вот посмотрите и поправьте что не так?

class DataBase {

static private $PDOInstance;

static function GetInstance($host = 'localhost',$dbname = '',$username = '',$pswd = ''){

if(!self::$PDOInstance) {
try {
self::$PDOInstance = new PDO('mysql:host=localhost;dbname=newrand', 'testuser', '12345');
self::$PDOInstance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
self::$PDOInstance->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (PDOException $e) {
die("PDO CONNECTION ERROR: " . $e->getMessage() . "<br/>");
}
}

return self::$PDOInstance;
}
private function __construct() {}

private function __clone() {}

private function __wakeup() {}

private function __sleep() {}

public function fetchSingleRow($table,$col,$val) {
try{
$PDOInstance = self::GetInstance();
$param = array($val);
$sel = self::$PDOInstance->prepare("SELECT * FROM $table WHERE $col=?");
$sel->execute($param);
return $sel->fetch();
}catch(PDOException $e){
die("PDO SQL ERROR: " . $e->getMessage() . "<br/>");
}

}



Это сообщение отредактировал maruo - 6.05.2016 - 15:59
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Zzepish  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Аццкая хрень
******

Профиль
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 5475
Пользователь №: 32538
На форуме: 4 года, 6 месяцев, 10 дней
Карма: 49




maruo
конструктор должен быть приватным, но не обязательно пустим.
Указывай явно: public static, а не просто static.


--------------------
Правда тоже ложь, но с иным углом.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
AllesKlar  
[x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3375
Пользователь №: 38635
На форуме: 2 года, 11 месяцев, 9 дней
Карма: 170




    public static function GetInstance() {
if (!self::$PDOInstance) {
self::$PDOInstance = new self;
}
return self::$PDOInstance;
}

private function __construct() {
try {
self::$PDOInstance = new PDO('mysql:host=' . HOSTNAME . ';dbname=' . DBNAME, USERNAME, PASSWORD);
self::$PDOInstance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
self::$PDOInstance->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (PDOException $e) {
die("PDO CONNECTION ERROR: " . $e->getMessage() . "<br/>");
}
}


Смысл тот же, но с точки зрения архитектуры так правильнее.
GetInstance - возвращает существующий экземпляр, либо создает его.
Конструктор инициилизирует экземпляр.
Функция должна делать то, чего от нее ожидают. Сказано getInstance, значит пусть она и отдает instance и ничего другого больше не делает.

... $host = 'localhost',$dbname = '',$username = '',$pswd = '' ...
это убрать и прямо в конструкторе прописать обращение к константам.
Все равно, даже если эти переменные будут нести в себе новые значения, то вернется старый объект с подключением из старых значений из самого первого вызова GetInstance. Синглтон же...


--------------------
[продано копирайтерам]
PMПисьмо на e-mail пользователю
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
maruo  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 324
Пользователь №: 37433
На форуме: 3 года, 6 месяцев, 23 дня
Карма: 1




Слабоват я в ООП еще не все понимаю , теорию то вроде изучил, а с практикой слабо
Fatal error: Call to undefined method DataBase::prepare() in C:\OpenServer\domains\E-Sport.market\test.php on line 40
Укажите что не так и почему

class DataBase {

static private $PDOInstance;

public static function GetInstance() {

if (!self::$PDOInstance) {
self::$PDOInstance = new self;
}
return self::$PDOInstance;
}

private function __construct() {
try {
self::$PDOInstance = new PDO('mysql:host=localhost;dbname=newrand', 'testuser', '12345');
self::$PDOInstance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
self::$PDOInstance->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (PDOException $e) {
die("PDO CONNECTION ERROR: " . $e->getMessage() . "<br/>");
}
}


private function __clone() {}

private function __wakeup() {}

private function __sleep() {}

public static function fetchSingleRow($table,$col,$val) {
try{

$param = array($val);
$sel = self::GetInstance()->prepare("SELECT * FROM $table WHERE $col=?");
$sel->execute($param);
return $sel->fetch();
}catch(PDOException $e){
die("PDO SQL ERROR: " . $e->getMessage() . "<br/>");
}

}



}


$cn = DataBase::GetInstance();
$cn = $cn->fetchSingleRow('users','user_id',44);
echo '<pre>';
print_r($cn);


Это сообщение отредактировал maruo - 6.05.2016 - 16:51
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Oyeme  
Дата
Цитировать сообщение

Пользователь сейчас на форуме



Reality is wrong. Dreams are for real
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1673
Пользователь №: 16955
На форуме: 7 лет, 9 месяцев, 10 дней
Карма: 94




уберите static у fetchSingleRow

$PDOInstance создается в конструкторе только при создяние экземпляра класса.


--------------------
Programming: Private lessons via skype £45/h

Частные уроки в Лондоне / удаленно по skype.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
maruo  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 324
Пользователь №: 37433
На форуме: 3 года, 6 месяцев, 23 дня
Карма: 1




Oyeme
Так у меня же конструктор приватный.
Fatal error: Call to private DataBase::__construct() from invalid context in C:\OpenServer\domains\E-Sport.market\test.php on line 53

Это сообщение отредактировал maruo - 6.05.2016 - 17:15
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Zzepish  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Аццкая хрень
******

Профиль
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 5475
Пользователь №: 32538
На форуме: 4 года, 6 месяцев, 10 дней
Карма: 49




maruo
AllesKlar бросил тебе рабочую систему! Статический метод, который создает экземпляр класса, и возвращает его, если он не был создан раньше, иначе возвращает уже созданный экземпляр


--------------------
Правда тоже ложь, но с иным углом.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
maruo  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 324
Пользователь №: 37433
На форуме: 3 года, 6 месяцев, 23 дня
Карма: 1




Zzepish
Разобрался уже, У меня вопрос к экспертам, Насколько верно правильно использовать SingleTOn
Как класс для работы с БД?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Zzepish  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Аццкая хрень
******

Профиль
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 5475
Пользователь №: 32538
На форуме: 4 года, 6 месяцев, 10 дней
Карма: 49




maruo
как мне говорили в одном месте- смысла особо нет, ибо для разных клиентов синглтон будет свой. Но я использую его именно в этой вариации. Это удобно


--------------------
Правда тоже ложь, но с иным углом.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
maruo  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 324
Пользователь №: 37433
На форуме: 3 года, 6 месяцев, 23 дня
Карма: 1




Zzepish
А вот как вы решаете такой вопрос?
Хочу написать query bilder ( что то типо этого)
смотрел codeignaiter , там это в отдельном файле и классе .
Ну у меня же сингл тон. я по идее не могу наследовать Класс BD.
Только писать если в самом BD классе, правильно ли это?

Это сообщение отредактировал maruo - 7.05.2016 - 15:40
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса