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 внутри функции

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Рачей
Отправлено: 22 Ноября, 2015 - 12:14:06
Post Id


Гость


Покинул форум
Сообщений всего: 94
Дата рег-ции: Окт. 2011  


Помог: 0 раз(а)




Привет всем... Перешел тут на работу с PDO и пипец не знаю как быть..


PHP:
скопировать код в буфер обмена
  1.  
  2.         function GetUser($user_id) {
  3.                 $st = $db->query("SELECT * FROMusers WHERE uid = '".$user_id."'");
  4.                 $user = $st->fetch(PDO::FETCH_ASSOC);
  5.                 return $user;
  6.         }
  7.  



Fatal error: Call to a member function query() on a non-object in /home/test/www/core/model.php on line 5


Почему не работает запрос к базе внутри функции? Если вынести за функцию запрос работает..
 
 Top
DelphinPRO
Отправлено: 22 Ноября, 2015 - 12:35:21
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Нужно предавать переменную $db в функцию. иначе откуда бы ей там взяться?

PHP:
скопировать код в буфер обмена
  1. function GetUser(\PDO $db, $user_id) {
  2.                 $st = $db->query("SELECT * FROMusers WHERE uid = '".$user_id."'");
  3.                 $user = $st->fetch(PDO::FETCH_ASSOC);
  4.                 return $user;
  5.         }


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Рачей
Отправлено: 22 Ноября, 2015 - 13:44:01
Post Id


Гость


Покинул форум
Сообщений всего: 94
Дата рег-ции: Окт. 2011  


Помог: 0 раз(а)




Спасибо, но не понял, ее в каждом запросе туда надо передавать вместе с айди юзера???

Получается что запрос
вот таким должен быть всегда?

Так правильно? Или в работе с PDO можно как-то иначе все организовать?

вот у меня как в конфиге написано

PHP:
скопировать код в буфер обмена
  1.  
  2. $dsn = "mysql:host=$host;dbname=$datb;charset=$char";
  3. $opt = array(
  4.     PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
  5.     PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
  6. );
  7.  
  8. $db = new PDO($dsn, $user, $pass, $opt);
  9.  
 
 Top
Dastor
Отправлено: 23 Ноября, 2015 - 08:51:22
Post Id


Гость


Покинул форум
Сообщений всего: 66
Дата рег-ции: Окт. 2014  


Помог: 3 раз(а)




 
 Top
andrewkard
Отправлено: 23 Ноября, 2015 - 11:23:46
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




Создайте класс Db, который будет работать с БД, упрощенно так:
PHP:
скопировать код в буфер обмена
  1.  
  2. class Db {
  3.     protected $link;
  4.  
  5.     public function __construct($dsn, $user, $pass) {
  6.         $options = array(
  7.             PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
  8.             PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
  9.         );
  10.         $this->link = new PDO($dsn, $user, $pass, $options);
  11.     }
  12.  
  13. public function GetUser($user_id) {
  14. $sql= "SELECT * FROMusers WHERE uid = ? ";
  15. $stmt = $this->link->prepare($sql);
  16. $stmt->execute(array($user_id));
  17. return $stmt->fetchAll();
  18. }
  19. }
  20.  
  21.  


и потом в коде создайте объект $db = new Db($dsn,$user,$password);
и работайте с ним так:
$user = $db->GetUser($user_id);

не передавайте в запросе данные:
Рачей пишет:
WHERE uid = '".$user_id."'

(Отредактировано автором: 23 Ноября, 2015 - 11:24:51)

 
 Top
DeepVarvar Супермодератор
Отправлено: 23 Ноября, 2015 - 11:33:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




andrewkard пишет:
$db->GetUser

andrewkard пишет:
$db->GetFoo

andrewkard пишет:
$db->GetBar

andrewkard пишет:
$db->GetBazz

........ прокручиваем пять тысяч строчек ........
andrewkard пишет:
$db->GetAnotherData

andrewkard пишет:
$db->GetMoreAnotherData

Угадал?
И вообще, почему бидэ должно уметь что-то кроме самого бидэ?
 
 Top
andrewkard
Отправлено: 23 Ноября, 2015 - 12:24:38
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




DeepVarvar пишет:
Угадал?

А что лучше 5000 функций в коде:
Рачей пишет:
function GetUser($user_id) {
?
У человека был вопрос:
Рачей пишет:
ее в каждом запросе туда надо передавать вместе с айди юзера???

я предложил вариант. На первых порах не самый худший.
 
 Top
DeepVarvar Супермодератор
Отправлено: 23 Ноября, 2015 - 13:14:27
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




andrewkard пишет:
На первых порах
Ты же знаешь что переучиваться сложнее чем сразу учиться правильно.
Не надо так советовать, у нас из без этого поповщины хватает.
andrewkard пишет:
А что лучше 5000 функций в коде

Три класса (или на худой конец файла с десятком ф-ций).
И пусть пишет global -- это гораздо правильнее (в контексте, да, он их не знает, но все же классов, их области видимости и инкапсуляции) чем тупоголовая передача параметров.
При рефакторе будет легче поудалять кучу глобалов и понатыкать $this, чем перепиливать апи с кол-вом и порядком аргументов.
 
 Top
Рачей
Отправлено: 30 Ноября, 2015 - 22:52:55
Post Id


Гость


Покинул форум
Сообщений всего: 94
Дата рег-ции: Окт. 2011  


Помог: 0 раз(а)




Во блин. Так научите как правильно?

Я конечно не уверен, но слышал что глобальные переменные зло...? Или злые языки?

(Отредактировано автором: 30 Ноября, 2015 - 23:01:49)

 
 Top
DeepVarvar Супермодератор
Отправлено: 01 Декабря, 2015 - 07:18:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Рачей пишет:
глобальные переменные зло...? Или злые языки?
Сказки возомнивших не понятно что.
Ведь только в пыхе такая область видимости.
И из-за этой области видимости был введен костыль global.
Во всех остальных языках переменная объявленная в глобальном и/или вышестоящем скопе -- видна из ф-ции безо всяких global.
 
 Top
Sail
Отправлено: 01 Декабря, 2015 - 09:31:10
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)




DeepVarvar пишет:
Во всех остальных языках переменная объявленная в глобальном и/или вышестоящем скопе -- видна из ф-ции безо всяких global.

От этого она не перестает быть злом в глобальном контексте Улыбка
 
 Top
DeepVarvar Супермодератор
Отправлено: 01 Декабря, 2015 - 20:41:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Sail пишет:
От этого она не перестает быть злом в глобальном контексте
Только для глобал-хейтеров, истинных адептов пхп.
Ато как жеж Керниган, Ритчи и Страуструп жили все эти четыре десятилетия без пыхового глобала?
Жуть же!
Петикантропы!
Пещерные люди!
Но пришел спаситель Лердорф и показал всем кузькину мать!
Истину глагольте, адепты пыха!
Глобал это вселенское зло!

UPD: И гото туда же! Конечно! Гото это зло!
Ведь до версии 5.3 в пыхе вообще гото не было!

А! Так вы думаете что гото это страшно? Дак вы не видели long_jmp -- вот где ад!
Адепты пыха атакуйте всех неверных!
В их жизни одна лишь тьма!
 
 Top
DelphinPRO
Отправлено: 01 Декабря, 2015 - 21:04:04
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




DeepVarvar пишет:
лобал это вселенское зло!

В пыхе - это зло, сам знаешь.
В javascript тоже наблюдается тенденция неиспользования глобальных переменных при каждой возможности.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
DeepVarvar Супермодератор
Отправлено: 01 Декабря, 2015 - 21:21:56
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




DelphinPRO пишет:
В пыхе - это зло, сам знаешь
Вот давай безо всяких, а как на духу.
Пошевели извилиной и ответь на вопросы:

1) Зачем вообще разрабы пыха воткнули глобал, если глобал это зло?
2) Почему разрабы пыха считают иначе чем "пыхо-глобало-хейтеры"?
3) Кто конкретно первым сказал фразу "глобал это плохо"? Ато очень похоже на байку "если ты это сообщение не напишешь десяти людям у тебя умрет мама".

DelphinPRO пишет:
В javascript тоже наблюдается тенденция
Знал бы ты, как в кругах сишников/плюсовиков называют жаваскриптистов и их модную нодочку ))
Еще раз -- четыре десятка лет все жили себе нормально и не задумывались что скоп глобален всегда.
И не только не боялись этого, а еще и использовали (и до сих пор используют) фичи такой видимости.
А тут нате вам!

Хотя для "пользователей языками" это же наоборот хорошо -- сидите в своей пеочнице. Какие глобалы? Ты что? Сталин за тобой наблюдает! И про других, коли увидел что вытворяют, негодники -- сразу в НКВД доложи!
 
 Top
DelphinPRO
Отправлено: 01 Декабря, 2015 - 22:14:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




DeepVarvar пишет:
Зачем вообще разрабы пыха воткнули глобал, если глобал это зло?

Писали-писали язык, потом пришел кто-то как ты, и спросил: "пацаны, а чо у вас переменные с локальной областью видимости? взрослые люди так не пишут", ну пацаны и добавили global. и гото заодно.

А вообще, ну его нафиг, этот холивар про плохой глобал, тыщу раз все уже обсосано.

(Отредактировано автором: 01 Декабря, 2015 - 22:15:43)



-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB