Всем привет, может кто объяснит как писать функции для запроса, и потом с этими функциями работать и подключать их где надо? Вот например есть вот такой запрос он выводит на главной странице сколько друзей просятся в друзья, но на главной странице я не хочу этот запрос делать: PHP: $friends_num = $pdo->prepare(' SELECT `user_friends_demands` FROM `users` WHERE `user_id` = :user_id'); $friends_num->execute(['user_id' => $user_id]);//Из сессии подставляем id пользователя $res_friends = $friends_num->fetch(); Как же написать функции вообще для запросов.
Вот написал вот такую функцию для этого запроса: PHP: function friend_col() { include($_SERVER['DOCUMENT_ROOT'].'/system/data/mysql.php'); /*Подключения к бд*/ $user_id = $_SESSION['user_id']; $friends_num = $pdo->prepare(' SELECT `user_friends_demands` FROM `users` WHERE `user_id` = :user_id'); $friends_num->execute(['user_id' => $user_id]);//Из сессии подставляем user_id, для индетификации пользователя $res_friends = $friends_num->fetch(); return $res_friends['user_friends_demands']; } Правильно ли?
@mkramer а как значит? если я начинаю писать функцию, и в них еще не разбираюсь вообще, когда то раз может 2 раза пробовал написать их. На счет базы, что вверху всех функций подключить? если да пробовал ругается, так как не подключена бд, если я указываю в самом верху файла функций( вот две функции которые пока что есть, написаны типа мною, и они слабоваты: PHP: include($_SERVER['DOCUMENT_ROOT'].'/system/data/mysql.php'); /*Подключения к бд*/ function friend_col() { // include($_SERVER['DOCUMENT_ROOT'].'/system/data/mysql.php'); /*Подключения к бд*/ // $user_id = $_SESSION['user_id']; $friends_num = $pdo->prepare(' SELECT `user_friends_demands` FROM `users` WHERE `user_id` = :user_id'); $friends_num->execute(['user_id' => $user_id]);//Из сессии подставляем user_id, для индетификации пользователя $res_friends = $friends_num->fetch(); return $res_friends['user_friends_demands']; } function user_pm_col() { // include($_SERVER['DOCUMENT_ROOT'].'/system/data/mysql.php'); /*Подключения к бд*/ // $user_id = $_SESSION['user_id']; $friends_num = $pdo->prepare(' SELECT `user_pm_num` FROM `users` WHERE `user_id` = :user_id'); $friends_num->execute(['user_id' => $user_id]);//Из сессии подставляем user_id, для индетификации пользователя $res_friends = $friends_num->fetch(); return $res_friends['user_pm_num']; } В верху этих функций я подключил бд, и у меня ругается: ( ! ) Fatal error: Call to a member function prepare() on a non-object in Но когда я во внутрь функцию подключаю БД то не ругается!!! Как мне быть?
@san4ez Ай да там раскоментировать нужно) А как мне быть с подключением к бд, чтобы он в каждом файле не подключался, как один раз его подключить и проинклудить? А то у меня получается так: Файл1: инклуд БД Файл2: инклуд БД Файл3: инклуд БД И так во всех файлах подключаю где использую запросы к БД, и в таком случае получается загрузка страниц идет с хорошей задержкой. Думаю если бы один раз подключиться к БД проблем бы не было бы с задержкой. Спасибо за объяснения.
Прочитать нормально руководство по PHP 1) Использовать глобальные переменные. В процедурном коде до 10 глобальных переменных на проект считается нормой. Когда до ОО-кода дойдёшь, там их не любят (хотя я лично одну-две допускаю), но есть разные решения, их заменяющие 2) Передавать объект PDO в функцию параметром.
мое мнение (новичка): так и нужно, и обязательно в конце загрузки страницы закрывать соединение с бд. Могу ошибаться. --- Добавлено --- то есть в конце всех операций с бд в коде, а не загрузки страницы)
О, ещё одно хорошее решение - сделать функцию, возвращающую подключение к БД, а внутри - статическую локальную переменную (загугли) PHP: function getDb() { static $db = null; if ($db === null) { $db = new PDO(/* ... */); } return $db; } И дёргать откуда угодно. Статическая локальная переменная и проверка в 4 строке гарантируют, что подключение к БД будет выполнено только один раз, сколько раз не была бы вызвана эта функция
PHP: Class SQL { const HOST = ''; const DB_NAME = ''; const USER = ''; const PASSWORD = ''; const CHARSET = 'utf8'; const HOST_LOCAL = TRUE; protected static $INSTANCE = NULL; public static function instance() { if ( self::$INSTANCE === NULL ) { self::$INSTANCE = new PDO( sprintf ( 'mysql:host=%s;dbname=%s;charset=%s', ( self::HOST_LOCAL ? 'localhost' : self::HOST ), ( self::HOST_LOCAL ? 'ray_local' : self::DB_NAME ), self::CHARSET ), ( self::HOST_LOCAL ? 'root' : self::USER ), ( self::HOST_LOCAL ? '' : self::PASSWORD ), [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => FALSE, ] ); } return self::$INSTANCE; } public static function __callStatic( $method, $args ) { return call_user_func_array ( [ self::instance(), $method ], $args ); } public static function P( $sql, $args = [] ) { $stmt = self::instance() -> prepare( $sql ); $stmt -> execute( $args ); return $stmt; } } //// другой.php SQL::P( "SELECT FOLDER, LOL FROM table_test" ) -> fetchAll( PDO::FETCH_KEY_PAIR );
@mkramer Натолкни меня на статейку эту, спасибо... Да и еще вопрос, у меня есть 2 файла один отвечает за defined(локал, юзер, пароль, бд) а второй файл за подключения к бд. Мне нужно в файле подключение единственный вход делать?
Тебя навсегда забанили в гугле? http://pogugli.com/?159108 --- Добавлено --- Причём здесь единственный вход? Ты о чём вообще?
@MouseZver А по проще нет, а то я в функциях не очень разбираюсь, имею введу примерный синтаксис как у меня сделать( а то ты сокращаешь куски кода, ты в них просто разбираешься а я нет. Короче вот 2 файла, и как с них сообразить такой же класс, как у тебя? PHP: <?php /*Конфигурационный файл*/ $db_server = 'localhost'; $db = ''; $user = 'root'; $pass = ''; //Кодировка $charset = 'utf8'; $err_connect = 'Не могу соединится с БД'; $err_db_select = 'Данная БД отсутствует на сервере'; и второй файл который обрабатывает эти данные: PHP: <?php include ($_SERVER['DOCUMENT_ROOT'].'/system/data/db.php'); $dsn = "mysql:host=$db_server;dbname=$db;charset=$charset"; $opt = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ]; $pdo = new PDO($dsn, $user, $pass, $opt); ?> Как написать такой же класс, понятным для меня методом? Хотелось бы сделать такой класс... Спасибо!!! --- Добавлено --- @mkramer То ошибся, за единственный вход!!!
https://php.ru/forum/threads/kak-pi...om-pravilno-podkljuchat-ix.63885/#post-520514 http://phpfaq.ru/pdo/pdo_wrapper
@MouseZver, какие классы, если человек глобальные переменные от локальных не сильно отличает, и конфиг от единой точки входа, функции-то не сильно понимает. @_ne_scaju_, делать единую точку входа или нет - тебе решать. Если единая точка входа, конфиг в ней подключается, если точек входа много - конфиг в каждой подключается.
@mkramer @MouseZver Если я правильно понял, при использовании класса для БД нужно будет всего лишь, ВЫЗЫВАТЬ сам класс и пользоваться им? Покажите пожалуйста на этом примере, или скажите что не так делаю? PHP: //Запрос на вывод логина юзера SQL::P('SELECT `user_login` FROM `users` WHERE `user_id` = :user_id'); ##############а дальше как действовать?########### ##############что делать что подставлять?######### ##############и действуют ли тут плейсхолдеры?#### $user->execute(['user_id' => $user_id]);//Из сессии подставляем id пользователя $res_user = $user->fetch(); if ($res_user){ echo 'Привет '.$res_user['user_login'].'<br>'; }
Классы не вызывают. Вызывают методы. В случае с кодом от @MouseZver статические методы, поэтому без создания экземпляра. Я тебе про классы не стал писать, поскольку считаю, что сначала с функциями надо разобраться. ну и не люблю я вот такие классы, из одной статики.
@mkramer вот кстати я согласен с тобой надо разобраться с функциями а классы на потом оставить. Так а как же добиться чтобы я не подключал в каждом файле БД, что для этого потребуется? И подключения которое я использую к БД нормальное?
Ещё раз. Зависит от архитектуры приложения. Если у тебя единая точка входа, то включаешь в самом верху index.php и радуешься. Если не единая - то включаешь в каждом файле.
как тогда обращаешься к бд вне класса какого - либо если PHP: $db = new db(); function test() { return $db -> ... # хрена ибо non object как с другой стороны статическим методом глобально прописывать где угодно можно. --- Добавлено --- убирем: global $var - это прошлое function ..() use () - х2потеря производительности
Я написал функцию чуть выше. А ещё есть паттерн registry, если мы уж про ООП говорим. --- Добавлено --- И ещё куча паттернов, которые упоминать в этой теме не сильно уместно, чтоб ТС не грузить непонятными названиями
@mkramer пока что нет у меня единой точки, подключения идет во всех файлах. Хотел спросить единая точка, это типа в этом файле подключены все модули все скрипты сайта? --- Добавлено --- @MouseZver не много не понял тебя!!!