За последние 24 часа нас посетили 20750 программистов и 1115 роботов. Сейчас ищет 401 программист ...

composer, namespace, PDO

Тема в разделе "PHP для новичков", создана пользователем Павел Голубцов, 20 июн 2019.

  1. Павел Голубцов

    Павел Голубцов Активный пользователь

    С нами с:
    4 мар 2019
    Сообщения:
    183
    Симпатии:
    4
    При создании подключения к базе данных с использованием namespace и composer для автоматического подключения классов, происходит ошибка в следующем коде:
    PHP:
    1. namespace My\Database
    2. Class Database
    3. {
    4.    
    5.     private $link;
    6.    
    7.     public function __construct()
    8.     {
    9.         $this->connect();
    10.     }
    11.    
    12.     private function connect()
    13.     {
    14.         $config = require_once 'config.php';
    15.         $dsn = 'mysql:host=' . $config['host'] . ';dbname=' . $config['db_name'] . ';charset=' . $config['charset'];
    16.         $this->link = new PDO($dsn, $config['username'], $config['password']);
    17.         return $this;
    18.     }
    он не определяет класс создаваемый new PDO, что вроде бы логично его же у нас нет.
    Вопрос что делать?
    Сперва создать класс отдельный в amespace My\Database Class PDO.
    Или тут что то изменить?
     
  2. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    Попробуйте:
    PHP:
    1. $this->link = new \PDO(/* параметры */);
     
  3. Павел Голубцов

    Павел Голубцов Активный пользователь

    С нами с:
    4 мар 2019
    Сообщения:
    183
    Симпатии:
    4
    пробовал, разобраться бы в чем тут логика, мы создаем экземпляр класса PDO, ну у нас его нет изначально - как это решается в namespace.
    Щяс еще раз попробую для надежности.
     
  4. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    Если его нет даже в глобальном пространстве имён, то, возможно, он просто не подключен?
    Гляньте phpinfo();
     
  5. Павел Голубцов

    Павел Голубцов Активный пользователь

    С нами с:
    4 мар 2019
    Сообщения:
    183
    Симпатии:
    4
    так PDO класса нет (есть в системе), я и спрашиваю его что создать(смысла создавать нет)?
    без namespac ов работает все хорошо с ними вот такое.
    PDO драйвер есть, получается путь не правильный к нему он где то в корне создается автоматически.
    получается как то ему путь правильно надо указать, как ?
     
    #5 Павел Голубцов, 20 июн 2019
    Последнее редактирование: 20 июн 2019
  6. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.816
    Симпатии:
    735
    Адрес:
    Татарстан
    что-то похожее было не помню - или new \PDO или new /PDO
     
  7. Павел Голубцов

    Павел Голубцов Активный пользователь

    С нами с:
    4 мар 2019
    Сообщения:
    183
    Симпатии:
    4
    \ помогает, это я что то запутался дальше в формах.
    Хотя, это если только из корня вызывать, буду тестировать дальше.
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
  9. Павел Голубцов

    Павел Голубцов Активный пользователь

    С нами с:
    4 мар 2019
    Сообщения:
    183
    Симпатии:
    4
    Помогите совсем уже не варит башка
    есть:
    PHP:
    1. use My\Database\Datab;
    2. use My\Action\Actlogin;
    3.  
    4. $db = new Datab();
    5. $actlogi = new Actlogin();
    и тут у него все хорошо объекты создаются!
    но как только обращаюсь (добавляю) к свойству:
    PHP:
    1. $actlogi -> Actionlogin();
    Ошибка:
    Notice: Undefined variable: db in C:\web\OSPanel\domains\mvc2\src\My\Action\Actlogin.php on line 31
    PHP:
    1. <?php
    2. namespace My\Action;
    3. class Actlogin
    4. {
    5.     public function Actionlogin()
    6.     {
    7.         if( isset($_POST['do_login'])) // при нажатии кнопки Вход заходим
    8.         {
    9.             $login = $_POST['login'];
    10.             $login_html = htmlspecialchars($login);
    11.          
    12.             $password_start1 = $_POST['password'];
    13.             $password_trim1 = trim($password_start1);
    14.             $password_1 = htmlspecialchars($password_trim1, ENT_QUOTES | ENT_HTML5);
    15.          
    16.             $backup = '<div align="center"><input type="button" value="Назад" onclick="history.go(-1);"></div>';
    17.          
    18.             if ($login == '')
    19.             {
    20.                 $ername = '<div align="center"><font size="10" color="red">Введите имя!</font></div>';
    21.                 echo $ername;
    22.                 echo $backup;
    23.                 return;
    24.             }
    25.          
    26.             $sql = "SELECT `username`, `password`, `status` FROM `user` WHERE `username` = :login_html";
    27.             $array = array
    28.             (
    29.                 ':login_html' => $login_html
    30.             );
    31.             $user = $db -> query($sql, $array);
    32.          
    33.             if (isset($user['0']['username']) != $login_html)
    34.             {
    35.                 $ernameuser = '<div align="center"><font size="10" color="red">Такое имя пользователя не найдено!</font></div>';
    36.                 echo $ernameuser;
    37.                 echo $backup;
    38.                 return;
    39.             }
    40.          
    41.             $hash = $user['0']['password'];
    42.             $status = $user['0']['status'];
    43.             if (password_verify($password_1, $hash))
    44.             {
    45.                 $_SESSION['logged_user'] = $login;
    46.                 $_SESSION['status'] = $status;
    47.                 header("Location: http://mvc2");
    48.             }
    49.             else
    50.             {
    51.                 $erpassword = '<div align="center"><font size="10" color="red">Пароль не правлиный!</font></div>';
    52.                 echo $erpassword;
    53.                 echo $backup;
    54.                 return;
    55.             }
    56.         }
    57.     }
    58. }
    Что ему не так и что в классе можно поменять посоветуйте плиз.
    $db получается что ли снаружи?
     
    #9 Павел Голубцов, 20 июн 2019
    Последнее редактирование: 20 июн 2019
  10. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.734
    Симпатии:
    1.315
    Адрес:
    Лень
  11. Павел Голубцов

    Павел Голубцов Активный пользователь

    С нами с:
    4 мар 2019
    Сообщения:
    183
    Симпатии:
    4
    она подойдет к PDO?
    Потом как нибудь может на JSON переделаю.
    пока просто код в этот же файл закинул проверку без наймспейсов.
    мне бы по проверки моей в нейспейсе которое, мысли какие для размышления чего он не берет оттуда.
     
    #11 Павел Голубцов, 20 июн 2019
    Последнее редактирование: 20 июн 2019
  12. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.734
    Симпатии:
    1.315
    Адрес:
    Лень
    про Auth - нет, ибо придется переписывать запросы, или обвертку новую (что совсем не изи)
    --- Добавлено ---
    Так же PDO имеет глобалку, чуть не забыл... PDO::functionName(...)
     
  13. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    @Павел Голубцов, прежде чем ваять классы, надо сначала хотя бы основы языка выучить... Если ты не курсе, как работать с локальными и глобальными переменными в php, то о чём может идти речь?
    Ох, надоел же этот бред.... Ни от чего не защищает, SQL-инъекции пропускает, но все его радостно пишут...
     
  14. Павел Голубцов

    Павел Голубцов Активный пользователь

    С нами с:
    4 мар 2019
    Сообщения:
    183
    Симпатии:
    4
    но там prepare есть с `username` = :login_html" от SQL-инъекции
    я так использую htmlspecialchars($password_trim1,ENT_QUOTES| ENT_HTML5);
    там забыл прописать.
    А что не надо использовать ?
    Или регуляркой лучше ?
     
  15. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    @Павел Голубцов, prepare не заметил, извини. Пароль вообще не надо через htmlspecialchars, ты же по любому его не хранишь и не выводишь, а хешируешь, логин - только при выводе, в базе пусть хранится так, как его ввели. Базе на html и js глубоко плевать.
     
  16. Павел Голубцов

    Павел Голубцов Активный пользователь

    С нами с:
    4 мар 2019
    Сообщения:
    183
    Симпатии:
    4
    Если логин проверять только при выводе htmlspecialchars, он то может и не совпасть с введенным думаю.
    поставил в логин <> и проверил только при выходе и не найден такой логин.
     
    #16 Павел Голубцов, 20 июн 2019
    Последнее редактирование: 20 июн 2019
  17. Павел Голубцов

    Павел Голубцов Активный пользователь

    С нами с:
    4 мар 2019
    Сообщения:
    183
    Симпатии:
    4
    Без htmlspecialchars можно так написать что потом ошибку выдает.
    Поэтому почему бы и не использовать.
    Лучше написал бы как к $bd обратится а то не видит ее.
     
    #17 Павел Голубцов, 20 июн 2019
    Последнее редактирование: 20 июн 2019
  18. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    @Павел Голубцов, ну когда ты сравниваешь логин, то htmlspecialchars тоже ни к чему. Единственный случай, когда она нужна, это
    PHP:
    1. echo htmlspecialchars($user['login']);
    Потому что ты не в курсе, как работать с глобальными переменными в php. Почитай :) Хотя, вообще, в ОО-программе их не должно быть
     
  19. Павел Голубцов

    Павел Голубцов Активный пользователь

    С нами с:
    4 мар 2019
    Сообщения:
    183
    Симпатии:
    4
    Всего то нужно было передать переменную в метод:
    public function Actionlogin($db)

    По htmlspecialchars уже писал:
    логин можно написать так что потом будет ругаться скрипт и htmlspecialchars это устраняет, не возможно использовать его только при проверке так как будет не правильный логин, если этого не достаточно для использования htmlspecialchars везде то хз.
    Возможно его можно заменить полностью или частично регуляркой.
     
  20. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.734
    Симпатии:
    1.315
    Адрес:
    Лень
    Ты с самого начала все данные испортил
     
  21. Павел Голубцов

    Павел Голубцов Активный пользователь

    С нами с:
    4 мар 2019
    Сообщения:
    183
    Симпатии:
    4
    У меня с данными все нормально, а использовать или не использовать какие либо функции дело каждого.
     
  22. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    так-то да, но хорошие программисты используют функции правильно, а плохие как получится
    вот и думай
     
  23. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.734
    Симпатии:
    1.315
    Адрес:
    Лень
    Кто такое умозаключение поставил ?
     
  24. Павел Голубцов

    Павел Голубцов Активный пользователь

    С нами с:
    4 мар 2019
    Сообщения:
    183
    Симпатии:
    4
    Ну как при использовании htmlspecialchars только при выводе логина у вас получится соответствие логинов?
    Если в базе лежит <IVAN> по проверится он с &lt;IVAN&gt;
     
  25. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.734
    Симпатии:
    1.315
    Адрес:
    Лень
    какую ошибку выдает ?