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
Форумы портала PHP.SU :: Версия для печати :: PDO внутри функции
Форумы портала PHP.SU » » Работа с СУБД » PDO внутри функции

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

1. Рачей - 22 Ноября, 2015 - 12:14:06 - перейти к сообщению
Привет всем... Перешел тут на работу с 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


Почему не работает запрос к базе внутри функции? Если вынести за функцию запрос работает..
2. DelphinPRO - 22 Ноября, 2015 - 12:35:21 - перейти к сообщению
Нужно предавать переменную $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.         }
3. Рачей - 22 Ноября, 2015 - 13:44:01 - перейти к сообщению
Спасибо, но не понял, ее в каждом запросе туда надо передавать вместе с айди юзера???

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

Так правильно? Или в работе с 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.  
4. Dastor - 23 Ноября, 2015 - 08:51:22 - перейти к сообщению
http://php.net/manual/ru/languag...iables.scope.php
5. andrewkard - 23 Ноября, 2015 - 11:23:46 - перейти к сообщению
Создайте класс 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."'
6. DeepVarvar - 23 Ноября, 2015 - 11:33:47 - перейти к сообщению
andrewkard пишет:
$db->GetUser

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

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

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

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

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

Угадал?
И вообще, почему бидэ должно уметь что-то кроме самого бидэ?
7. andrewkard - 23 Ноября, 2015 - 12:24:38 - перейти к сообщению
DeepVarvar пишет:
Угадал?

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

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

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

Я конечно не уверен, но слышал что глобальные переменные зло...? Или злые языки?
10. DeepVarvar - 01 Декабря, 2015 - 07:18:00 - перейти к сообщению
Рачей пишет:
глобальные переменные зло...? Или злые языки?
Сказки возомнивших не понятно что.
Ведь только в пыхе такая область видимости.
И из-за этой области видимости был введен костыль global.
Во всех остальных языках переменная объявленная в глобальном и/или вышестоящем скопе -- видна из ф-ции безо всяких global.
11. Sail - 01 Декабря, 2015 - 09:31:10 - перейти к сообщению
DeepVarvar пишет:
Во всех остальных языках переменная объявленная в глобальном и/или вышестоящем скопе -- видна из ф-ции безо всяких global.

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

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

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

В пыхе - это зло, сам знаешь.
В javascript тоже наблюдается тенденция неиспользования глобальных переменных при каждой возможности.
14. DeepVarvar - 01 Декабря, 2015 - 21:21:56 - перейти к сообщению
DelphinPRO пишет:
В пыхе - это зло, сам знаешь
Вот давай безо всяких, а как на духу.
Пошевели извилиной и ответь на вопросы:

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

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

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

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

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

 

Powered by ExBB FM 1.0 RC1