За последние 24 часа нас посетили 17688 программистов и 1702 робота. Сейчас ищут 1777 программистов ...

Практика использование ООП

Тема в разделе "PHP для новичков", создана пользователем Dimon2x, 26 ноя 2017.

  1. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну это надо копать глубоко исходник, но скорее всего как-то организовано. По внешнему виду таблицы похоже. Может @romach придёт и расскажет, зачем они при хранении сессии в базе собирают все эти данные в таблицу

    Флеш-данными называются данные, которые после одного использования удаляются. К примеру, Laravel так пишет сообщения об ошибках. Если валидация не пройдена, он автоматически пишет данные об ошибках в сессию и перенаправляет обратно на роут, выводящий форму. Всякие сообщения об успехе операции и т.п. тоже пишутся в флеш-данные. И метод, который их вытаскивает из сессии, одновременно их удаляет.
     
  2. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Не понимаю, почему ругается на HOST?

    PHP:
    1. <?php
    2.     error_reporting(E_ALL);
    3.    
    4.     class Db {
    5.         private static $connection = null;
    6.        
    7.         private static HOST = 'localhost';
    8.         private static USER = 'root';
    9.         private static PASSWORD = '';
    10.         private static DATABASE = 'test';
    11.         private static TABLE = 'users';
    12.        
    13.         private function __construct() {
    14.             $this->connection = mysqli_connect(self::HOST, self::USER, self::PASSWORD, self::DATABASE );
    15.         }
    16.        
    17.         public static function getInstance() {
    18.             if (self::$connection != null) {
    19.                 return self::$connection;
    20.             }
    21.            
    22.             return new self;
    23.         }
    24.     }
    25.    
    26.     $db = Db::getInstance();
     
  3. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Эм... Мне не понятно! Почему не отправлять данные сразу в роут об ошибки!? Что за прокладка между п.й и х.м. Мы детей делаем или не делаем? А то презерватив какой то получается.
    --- Добавлено ---
    Чё это за шляпа?
     
  4. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @askanim, в Laravel обычно на post- и get-запросы на один и тот же адрес вешаются разные обработчики. И вот ты заполнил форму, отправил её методом POST, она не правильная, laravel записал ошибки в сессию и автоматом сделал редирект обратно на код, выводящий форму. Можно, конечно, все ошибки в GET-параметрах, но это будет слишком. В Yii2 обычно один и тот же обработчик висит, и если были ошибки, они все выводятся прямо по POST-запросу, ну тут свои недостатки есть - если с ошибочной формой нажать обновление страницы, увидишь противное окошко.

    @Dimon2x, синтаксис объявлений констант в классе другой.
     
  5. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @Dimon2x
    Не пиши так это жиесть какой - то! О госпади оно ещё и живое, говорить может. Доктора! Доктора!!!!! Пациент ещё жив!
    (Я про данную программу);
    На вот пользуйся
    Создай ток в корне db.json
    PHP:
    1. class DB
    2. {
    3.     private static $db;
    4.  
    5.     /**
    6.      * @return \PDO
    7.      */
    8.     static public function connect()
    9.     {
    10.         if (static::$db === Null) {
    11.             $dbJson = file_get_contents(ROOT . "/db.json");
    12.             $db = json_decode($dbJson);
    13.             static::$db = new \PDO("mysql:host=".$db->host.";port=".$db->port.";dbname=".$db->dbname.";charset=".$db->charset,
    14.                                     $db->username, $db->password);
    15.         }
    16.         return static::$db;
    17.     }
    18.  
    19. }
    И зарегестрируй константу ROOT как корень сайта.
    И в корень добавь db.json
     
    Dimon2x нравится это.
  6. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    почему в json?
    --- Добавлено ---
    @askanim Не работает, ругается на db

    PHP:
    1. <?php
    2.     error_reporting(E_ALL);
    3.    
    4.     class DB
    5.     {
    6.         private static $db;
    7.         private $host = 'localhost';
    8.         private $dbname = 'test';
    9.         private $charset = 'utf8';
    10.         private $username = 'root';
    11.         private $password = '';
    12.        
    13.         static public function connect()
    14.         {
    15.             if (static::$db === Null) {
    16.                 static::$db = new \PDO("mysql:host=".$db->host.";dbname=".$db->dbname.";charset=".$db->charset,
    17.                                         $db->username, $db->password);
    18.             }
    19.             return static::$db;
    20.         }
    21.    
    22.     }
    23.    
    24.     $db = DB::connect();
     
  7. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @Dimon2x, перечитай всё про классы в мануале. Такую чушь пишешь.... Ты разницу между статическими полями и не статическими понимаешь?
    --- Добавлено ---
    У @askanim $db - это локальная переменная, а у тебя что?
     
  8. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    PHP:
    1. class Flash {
    2.         protected $saveSession;
    3.      
    4.         public function __construct() {
    5.             $this->saveSession = new Session();
    6.         }
    7.      
    8.         public function setMessage($id, $mess) {
    9.             $this->saveSession->setSession($id, $mess);
    Я правильно понимаю что
    PHP:
    1. $this->saveSession->setSession($id, $mess);
    то-же самое что:
    PHP:
    1. $saveSession = $this->saveSession;
    2. $saveSession = $this->setSession($id, $mess);
     
  9. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    @mkramer у меня же тоже локальна, потому что в этом классе
     
  10. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Вот это добавь в db json и туда забивай данные.
    Код (Text):
    1. {
    2.   "host": "localhost",
    3.   "dbname": "",
    4.   "charset" : "utf8",
    5.   "port": "3306",
    6.   "username": "",
    7.   "password": ""
    8. }
    --- Добавлено ---
    @Dimon2x потому что так удобней и в корне лежит!
     
    Dimon2x нравится это.
  11. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну не позорь себя так... Ты определения локальной переменной и отличия от поля класса не знаешь?
     
  12. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    @askanim а зачем для конфиг делать отдельный файл, почему не сделать бы поля?
     
  13. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @Dimon2x нет у тебя там вообще локальной переменной $db у тебя есть статическое св-во static::$db
     
  14. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
  15. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @Dimon2x так как я написал всё заработало через конфиг :? Или ты додумался как свой класс модернезировать?
    --- Добавлено ---
    @Dimon2x почитай про область видимости переменных и прочитай про что такое static и self, а ещё вообще по подробней изучи ооп на php ты там очень сильно плаваешь путаешь одно с другим!
    --- Добавлено ---
    Тебе @mkramer правильно всё написал.
     
  16. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    @askanim @mkramer Я правильно сделал метод выборки пользователя?

    PHP:
    1. <?php
    2.     error_reporting(E_ALL);
    3.    
    4.     class DB
    5.     {
    6.         private static $db;
    7.        
    8.         static public function connect()
    9.         {
    10.             if (static::$db === null) {
    11.                 $dbJson = file_get_contents("./db.json");
    12.                 $db = json_decode($dbJson);
    13.                
    14.                 static::$db = new \PDO("mysql:host=".$db->host.";dbname=".$db->dbname.";charset=".$db->charset,
    15.                                         $db->username, $db->password);
    16.             }
    17.             return static::$db;
    18.         }
    19.    
    20.     }
    21.    
    22.     $db = DB::connect();
    23.    
    24.     class User {
    25.         private $id;
    26.         private $db;
    27.        
    28.         public function __construct($id)
    29.         {
    30.             $this->id = $id;
    31.             $this->db = DB::connect();
    32.         }
    33.        
    34.         public function getUserName() {
    35.             $sql = $this->db->query("SELECT `login` FROM `users` WHERE id='" .$this->id . "'");
    36.             $res = $sql->fetchColumn();
    37.             return $res;
    38.         }
    39.  
    40.     }
    41.    
    42.     $user = new User('1');
    43.     echo $user->getUserName();
     
  17. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну работать будет, но можно лучше. Дочитай Зандстру до конца, там много рассказано о том, как организовать работу с БД. Если коротко, класс User подлжен представлять пользователя, а не лезть в БД... А в БД должен лезть какой-нибудь UserRepository.
     
    askanim нравится это.
  18. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @Dimon2x тебе нужно почитать про sql-инъекции и как сделать так чтобы их не было, прочитай про методы в pdo::bindParam and PDO::execute, прости я сейчас занят. Не могу тебе всё расписать, но не надо выбирать только поле логин! Выбирай все поля и ложи в какой - нибудь массив данных в стат переменную так как массив с данными о пользователе может понадобится в любой момент и чтобы базу 300 раз за ним не дёргать почитай про паттерн синглтон.
    --- Добавлено ---
    ещё можешь глянуть метод pdo::quote !
     
  19. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    про bindParam я знаю, мне надо научится пользоваться правильно классами
     
  20. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Для этого книжки надо читать, а не форумы. В одном посте на форуме всего Зандстру тебе пересказать невозможно
     
  21. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
  22. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @mkramer Какая зандстра ему базис надо подтягивать и уже когда он научится знать базис и знать минимально синтаксис php то может уже идти его читать. Он не отличает слона от мухи в программировании. Он даже не смог элементарно мой код разгадать и ему пришлось его полностью копипастить.
     
  23. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @Dimon2x, не надо код изучать, надо теорию изучать
     
    askanim нравится это.
  24. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Зандстра это уже для уверенных в себе прогеров, которые лишних вопросов уже не задают.
    --- Добавлено ---
    Это как начать изучать русский язык не с букв, а сразу начать читать как ставить запятые.
    --- Добавлено ---
    @Dimon2x знаешь что ты сейчас делаешь? Ты пытаешься забраться на дом одним шагом, когда рядом с тобой есть лестница и все идут по ней, а ты прыгаешь возле здания и не можешь на него запрыгнуть! Да со временем твой прыжок станет выше, но на здание один хрен ты никогда не запрыгнешь!
    --- Добавлено ---
    @Dimon2x Может уже пора перестать прыгать? И стоит пойти по лестнице? И в конечном счёте по лестнице рано или поздно в зависимости от того будешь ли ты по ней бежать или медленно ползти, но рано или поздно ты попадёшь на крышу здания!
     
    Dimon2x и mkramer нравится это.
  25. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Книга Котерова для этого подойдёт?