Хочу загнать в сессию объект, а в объект функцию подключения а БД, чтобы каждый раз include_once не писать... примерно так ( session_start(); - сюда же) PHP: class User { function acces_bd(){ try { $pdo = new PDO("$driver:host=$host; dbname=$db_name; charset=$charset", $db_user, $db_pass, $options); session_start(); } catch (PDOException $e) { print "Error!: " . $e->getMessage(); die("Ошибка подключения к базе"); } } } } подключаться через PDO так PHP: $_SESSION['user']=new User; $login=trim($_POST['login']); $pwd=trim($_POST['pwd']); $_SESSION['user']->acces_bd(); $sql= "SELECT login, password FROM zakazchik WHERE login = :login"; $params=[':login' => $login]; $stmt=$pdo->prepare($sql); $stmt->execute($params); $user=$stmt->fetch(PDO::FETCH_ACCOS); Ошибка. Понятно, что все дело в "$stmt=$pdo->prepare($sql);" - $pdo - объект внутри объекта. А как поправельному сделать
Во первом фрагменте нет сохранения PDO в сессию, а во втором фрагменте не раскрыто, откуда вдруг взялась переменная $pdo, но в общем - так сделать нельзя. В сессию можно сохранить только сериализуемые сущности; подключение к БД сериализуемой сущностью не является. Т.е. если коротко, то никак, только открывать подключение к БД каждый раз наново.
Подключение к БД у меня есть - проверил, PHP: $_SESSION['user']->acces_bd(); работает, но на эту строчку ругается PHP: $stmt=$pdo->prepare($sql); Fatal error: Uncaught Error: Call to a member function prepare() on null in C:\OSPanel\domains\test\include\auto.php:10 Stack trace: #0 {main} thrown in C:\OSPanel\domains\test\include\auto.php on line 10
Сессии не для этого предназначены. Вообще ХЗ, что вы пытаетесь сделать. Постоянное соединение? $pdo? --- Добавлено --- Вы бы сначала с областью видимости переменной разобрались, а уже потом покушались на архитектурные решения
я вообще сделал так да все работает, надо только global $pdo я хотел в объект $_SESSION['user'] и подключение к БД и session_start..... но так не получится, что бы запустить $_SESSION нужен session_start, я чтобы запустить session_start нужен объект $_SESSION['user']
global зло, от них избавляться лучше. Можно попробовать в конструктор передать подключения __construct() - передаешь подключения, а вообще еще лучше посмотреть что такое единая точка входа и как ее сделать, как посоветовали выше. чтобы запустить $_SESSION не нужен session_start(), тут наоборот, чтобы работала $_SESSION нужно запустить session_start(). --- Добавлено --- запрос можно сделать компактней: PHP: $stmt=$pdo->prepare("SELECT `login`, `password` FROM `zakazchik` WHERE `login` = ?"); $stmt->execute([$login]); $user=$stmt->fetch();
дык я так и делаю, только поготовленный, только не показал PHP: $stmt=$pdo->prepare("SELECT `login`, `password` FROM `zakazchik` WHERE login=":login); не показал - это очевидно... надо 1. или ссиию вынимать из функции 2. или функцию... короче - утром стулья - вечером деньги........ никак не плучиться запустить $__SESSION(функция), если в нутри функции start_sesson... или "start_sesson" ВЫНИМАТЬ НАРУЖУ... ПРИНЦИПИАЛЬНО... можно это обойти.... но зачем?
В методе acces_bd() должен быть PHP: return new PDO .... а не PHP: $pdo = new PDO ... тогда логически, всё будет выглядеть PHP: $_SESSION['user']->acces_bd()->prepare($sql); Но это нечто , вы хотите чтоб фотография ожила PS: просто в сессии экземпляр класса не будет жить. Т.е. если ваша цель создать единожды подключение к БД закинуть его в сессию и потом просто обращаться к ней, так оно работать не будет. В PDO есть постоянное соединение (https://www.php.net/manual/ru/pdo.connections.php), но там есть свои НО
откажись от этой идеи не надо избегать include/require. хорошей практикой считается использование лоадеров классов. они подгружают файлы, но при этом в твоём коде нет include, он происходит "за кадром". --- Добавлено --- В твоём случае стоит вынести работу с базой в отдельный класс-помошник. Обращайся к нему на "статический" манер или используй какой-нибудь приём по сохранению соединения PDO в статическом свойстве, это поможет тебе вызывать new PDO только один раз за сеанс работы. Т.е. за один HTTP запрос. Понимаешь о чём я? --- Добавлено --- И ещё, не надо думать о сессии как о кэше. Это не кэш. Сессия нужна для сохранения состояния в очень ограниченном контексте и объёме. Не надо в неё впихивать всё подряд, это приведёт только к неразберихе и потере контроля.
Все прекрасно работает, суть в том, что класс надо определить до открытия сессии... те PHP: $_SESSION['user'] = new User; class User { ......} session_start(); можно и объект PDO таким же манером загнать... только не к чему а в $_SESSION['user'] у меня 10 переменных вертится - она очень маленькая... опять же конструктор - штука удобная