При создании подключения к базе данных с использованием namespace и composer для автоматического подключения классов, происходит ошибка в следующем коде: PHP: namespace My\Database Class Database { private $link; public function __construct() { $this->connect(); } private function connect() { $config = require_once 'config.php'; $dsn = 'mysql:host=' . $config['host'] . ';dbname=' . $config['db_name'] . ';charset=' . $config['charset']; $this->link = new PDO($dsn, $config['username'], $config['password']); return $this; } он не определяет класс создаваемый new PDO, что вроде бы логично его же у нас нет. Вопрос что делать? Сперва создать класс отдельный в amespace My\Database Class PDO. Или тут что то изменить?
пробовал, разобраться бы в чем тут логика, мы создаем экземпляр класса PDO, ну у нас его нет изначально - как это решается в namespace. Щяс еще раз попробую для надежности.
Если его нет даже в глобальном пространстве имён, то, возможно, он просто не подключен? Гляньте phpinfo();
так PDO класса нет (есть в системе), я и спрашиваю его что создать(смысла создавать нет)? без namespac ов работает все хорошо с ними вот такое. PDO драйвер есть, получается путь не правильный к нему он где то в корне создается автоматически. получается как то ему путь правильно надо указать, как ?
\ помогает, это я что то запутался дальше в формах. Хотя, это если только из корня вызывать, буду тестировать дальше.
Помогите совсем уже не варит башка есть: PHP: use My\Database\Datab; use My\Action\Actlogin; $db = new Datab(); $actlogi = new Actlogin(); и тут у него все хорошо объекты создаются! но как только обращаюсь (добавляю) к свойству: PHP: $actlogi -> Actionlogin(); Ошибка: Notice: Undefined variable: db in C:\web\OSPanel\domains\mvc2\src\My\Action\Actlogin.php on line 31 PHP: <?php namespace My\Action; class Actlogin { public function Actionlogin() { if( isset($_POST['do_login'])) // при нажатии кнопки Вход заходим { $login = $_POST['login']; $login_html = htmlspecialchars($login); $password_start1 = $_POST['password']; $password_trim1 = trim($password_start1); $password_1 = htmlspecialchars($password_trim1, ENT_QUOTES | ENT_HTML5); $backup = '<div align="center"><input type="button" value="Назад" onclick="history.go(-1);"></div>'; if ($login == '') { $ername = '<div align="center"><font size="10" color="red">Введите имя!</font></div>'; echo $ername; echo $backup; return; } $sql = "SELECT `username`, `password`, `status` FROM `user` WHERE `username` = :login_html"; $array = array ( ':login_html' => $login_html ); $user = $db -> query($sql, $array); if (isset($user['0']['username']) != $login_html) { $ernameuser = '<div align="center"><font size="10" color="red">Такое имя пользователя не найдено!</font></div>'; echo $ernameuser; echo $backup; return; } $hash = $user['0']['password']; $status = $user['0']['status']; if (password_verify($password_1, $hash)) { $_SESSION['logged_user'] = $login; $_SESSION['status'] = $status; header("Location: http://mvc2"); } else { $erpassword = '<div align="center"><font size="10" color="red">Пароль не правлиный!</font></div>'; echo $erpassword; echo $backup; return; } } } } Что ему не так и что в классе можно поменять посоветуйте плиз. $db получается что ли снаружи?
Свою обвертку по БД сделай глобальной, тобишь статика. Либо могу свою посоветовать, но с каждым вопросом в ЛС --- Добавлено --- Что на счет всей логики Actionlogin https://php.ru/forum/threads/sdelano-77084-autentifikacija-polzovatelja.77120/ --- Добавлено --- https://github.com/MouseZver/Aero-Authentication/blob/master/php/77084/auth.php
она подойдет к PDO? Потом как нибудь может на JSON переделаю. пока просто код в этот же файл закинул проверку без наймспейсов. мне бы по проверки моей в нейспейсе которое, мысли какие для размышления чего он не берет оттуда.
про Auth - нет, ибо придется переписывать запросы, или обвертку новую (что совсем не изи) --- Добавлено --- Так же PDO имеет глобалку, чуть не забыл... PDO::functionName(...)
@Павел Голубцов, прежде чем ваять классы, надо сначала хотя бы основы языка выучить... Если ты не курсе, как работать с локальными и глобальными переменными в php, то о чём может идти речь? Ох, надоел же этот бред.... Ни от чего не защищает, SQL-инъекции пропускает, но все его радостно пишут...
но там prepare есть с `username` = :login_html" от SQL-инъекции я так использую htmlspecialchars($password_trim1,ENT_QUOTES| ENT_HTML5); там забыл прописать. А что не надо использовать ? Или регуляркой лучше ?
@Павел Голубцов, prepare не заметил, извини. Пароль вообще не надо через htmlspecialchars, ты же по любому его не хранишь и не выводишь, а хешируешь, логин - только при выводе, в базе пусть хранится так, как его ввели. Базе на html и js глубоко плевать.
Если логин проверять только при выводе htmlspecialchars, он то может и не совпасть с введенным думаю. поставил в логин <> и проверил только при выходе и не найден такой логин.
Без htmlspecialchars можно так написать что потом ошибку выдает. Поэтому почему бы и не использовать. Лучше написал бы как к $bd обратится а то не видит ее.
@Павел Голубцов, ну когда ты сравниваешь логин, то htmlspecialchars тоже ни к чему. Единственный случай, когда она нужна, это PHP: echo htmlspecialchars($user['login']); Потому что ты не в курсе, как работать с глобальными переменными в php. Почитай Хотя, вообще, в ОО-программе их не должно быть
Всего то нужно было передать переменную в метод: public function Actionlogin($db) По htmlspecialchars уже писал: логин можно написать так что потом будет ругаться скрипт и htmlspecialchars это устраняет, не возможно использовать его только при проверке так как будет не правильный логин, если этого не достаточно для использования htmlspecialchars везде то хз. Возможно его можно заменить полностью или частично регуляркой.
Ну как при использовании htmlspecialchars только при выводе логина у вас получится соответствие логинов? Если в базе лежит <IVAN> по проверится он с <IVAN>