За последние 24 часа нас посетили 21985 программистов и 985 роботов. Сейчас ищут 663 программиста ...

ООП JSON Добавление

Тема в разделе "Сделайте за меня", создана пользователем Andrew21, 17 ноя 2021.

Метки:
  1. Andrew21

    Andrew21 Новичок

    С нами с:
    1 ноя 2021
    Сообщения:
    55
    Симпатии:
    0
    Изучаю ООП в php и появился вопрос, когда добавляю информацию в файл он просто перезаписывается с нуля, но если прописать всё без использования методов Connect и Write, то всё добавляет прекрасно, почему так происходит, что я не так делаю ???
    Сам скрипт для новых юзеров
    PHP:
    1. <?php
    2. // создание класса юзер
    3. class User
    4. {
    5.     // объект
    6.     public $name;
    7.     public $data;
    8.     // метод для связи с файлом
    9.     public function Connect()
    10.     {
    11.         // чтение файла
    12.         $data = file_get_contents('User.json');
    13.             //декодирование файла из json
    14.         $data = json_decode($data, true);
    15.     }
    16.     // метод для записи в файл
    17.     public function Write($data)
    18.     {
    19.         // кодирование в json формат
    20.         $data = json_encode($data, JSON_PRETTY_PRINT);
    21.         // запись данных в файл
    22.         file_put_contents('User.json', $data);
    23.     }
    24.     public function Create_user($name, $data)
    25.     {
    26.         $this -> Connect();
    27.         $add_arr = array
    28.         (
    29.         'name'.$name => $_POST['name']
    30.         );
    31.         $data[] = $add_arr;
    32.         $this -> Write($data);
    33.     }
    34. }
    35. ?>
    форма для "регистрации" новых юзеров

    PHP:
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4.     <meta charset="utf-8">
    5.     <title>Регистрация</title>
    6. </head>
    7. <?php require_once "Use.php";
    8. //ini_set('display_errors', 1);
    9. //ini_set('display_startup_errors', 1);
    10. //ini_set('error_reporting', E_ALL);
    11. if (isset ($_POST['loginn']))
    12. {
    13.     $user = new User;
    14.     $user -> Create_user($name,$data);
    15. }
    16. ?>
    17. <form action="/Site.php" method = "POST" name="register">
    18. <p><stronh></strong>Введите имя</p>
    19.             <input required type="text" name="name">
    20. <button type="submit" name="loginn">Добавить</button>
    21. </form>
     
  2. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    Обратите внимание на третий параметр функции file_put_contents
     
  3. Andrew21

    Andrew21 Новичок

    С нами с:
    1 ноя 2021
    Сообщения:
    55
    Симпатии:
    0
    Я знаю, что там можно дописать FILE_APPEND но тогда добавляется новый массив а мне нужно, чтобы добавляло в один, который уже есть, зачем мне много массивов? Если писать просто, без этих методов, т.е. напрямую то всё работает и добавляет всё в один массив как и надо, а если описать эти методы, то не работает как надо. И тем более, если дописать FILE_APPEND то уже не будет соблюдаться кодирование json, нужно будет между массивами "Enter" ставить в ручную.
     
  4. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @Andrew21, понятно.
    В классе есть свойства, к которым надо обращаться через псевдопеременную $this.
    Либо возвращать $data из метода Connect() и прочих подобных.
    Если инициализировать $this->data в методе Connect(), то не будет необходимости передавать его в метод Write() как параметр.
    В общем, пересмотрите все моменты, где используете переменную $data.
    --- Добавлено ---
    Файл, кстати, всё равно будет "перезаписываться с нуля"... Только данные, ранее из него прочитанные пропадать не будут :)
    --- Добавлено ---
    PS: это было замечание к формулировке вопроса.
     
  5. Andrew21

    Andrew21 Новичок

    С нами с:
    1 ноя 2021
    Сообщения:
    55
    Симпатии:
    0
    Спасибо, сейчас попробую разобраться )
     
  6. Andrew21

    Andrew21 Новичок

    С нами с:
    1 ноя 2021
    Сообщения:
    55
    Симпатии:
    0
    Не понимаю, перепробовал всё логичное и не логичное, всё равно не выходит ничего :(:mad:
     
  7. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    Для начала, так сказать, логичности:
    PHP:
    1. public function Connect()
    2.     {
    3.         // чтение файла
    4.         $data = file_get_contents('User.json');
    5.             //декодирование файла из json
    6.         $this->data = json_decode($data, true);
    7.     }
     
  8. Andrew21

    Andrew21 Новичок

    С нами с:
    1 ноя 2021
    Сообщения:
    55
    Симпатии:
    0
    Я перепробовал наверное все варианты с $this, я понимаю логику как код должен работать, но я не понимаю логику $this, читал информацию про эту "переменную-свойство" но всё без толку, не могу понять, например там где вы добавили $this, почему тогда в скобках не добавили $this и в остальных свойствах тоже, почему не нужно передавать её, если мы через $this будем определять. Можете объяснить ?
     
  9. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @Andrew21, переменная $data в методе Connect() - локальная для этого метода.
    К свойству $data, описанному в строке 7 (public $data;) из методов доступ осуществляется через $this->data
    --- Добавлено ---
    Потому что это разные элементы.
    Один - локальная переменная, другой - свойство класса.
     
  10. Andrew21

    Andrew21 Новичок

    С нами с:
    1 ноя 2021
    Сообщения:
    55
    Симпатии:
    0
    Тогда, насколько я понял, всё должно быть так:
    PHP:
    1. <?php
    2. // создание класса юзер
    3. class User
    4. {
    5.     // объект
    6.     public $name;
    7.     // метод для связи с файлом
    8.     public function Connect()
    9.     {
    10.         // чтение файла
    11.         $data = file_get_contents('User.json');
    12.             //декодирование файла из json
    13.         $this->$data = json_decode($data, true);
    14.     }
    15.     // метод для записи в файл
    16.     public function Write()
    17.     {
    18.         // кодирование в json формат
    19.         $this -> $data = json_encode($data, JSON_PRETTY_PRINT);
    20.         // запись данных в файл
    21.         file_put_contents('User.json', $data);
    22.     }
    23.     public function Create_user($name)
    24.     {
    25.         $this -> Connect();
    26.         $add_arr=array(
    27.             'name'.$name => $_POST['name']
    28.         );
    29.         $this->$data[] = $add_arr;
    30.         $this -> Write($data);
    31.     }
    32. }
    33. ?>
    Но он не работает, вообще ничего не добавляется
     
  11. Vanchot

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

    С нами с:
    23 мар 2019
    Сообщения:
    104
    Симпатии:
    19
    Адрес:
    Ахерон (LV-426)
    А поле
    PHP:
    1. public $data;
    , что было под $name, куда делось?
    И Ваше
    PHP:
    1. $this->$data
    несколько отличается от предложенного @Sail
    PHP:
    1. $this->data
    Локальные переменные и глобальные лучше называть разными именами.
     
  12. Andrew21

    Andrew21 Новичок

    С нами с:
    1 ноя 2021
    Сообщения:
    55
    Симпатии:
    0
    Я убирал для тестов. Локальные переменные это те , что в методах, а глобальные, то что я $data описал под $name, так ведь ? Я не до конца понимаю где нужно использовать локальную, а где глобальную и в конечном методе какую из переменных мне нужно использовать.
     
  13. Andrew21

    Andrew21 Новичок

    С нами с:
    1 ноя 2021
    Сообщения:
    55
    Симпатии:
    0
    Насколько я понял всё должно быть так:
    PHP:
    1. <?php
    2. // создание класса юзер
    3. class User
    4. {
    5.     // объект
    6.     public $name;
    7.     public $dataa;
    8.     // метод для связи с файлом
    9.     public function Connect()
    10.     {
    11.         // чтение файла
    12.         $data = file_get_contents('User.json');
    13.             //декодирование файла из json
    14.         $this->$dataa = json_decode($data, true);
    15.     }
    16.     // метод для записи в файл
    17.     public function Write()
    18.     {
    19.         // кодирование в json формат
    20.         $dataa = json_encode($data, JSON_PRETTY_PRINT);
    21.         // запись данных в файл
    22.         file_put_contents('User.json', $dataa);
    23.     }
    24.     public function Create_user()
    25.     {
    26.         $this -> Connect();
    27.         $add_arr=array(
    28.             'name'.$name => $_POST['name']
    29.         );
    30.        $dataa[] = $add_arr;
    31.         $this -> Write($dataa);
    32.     }
    33. }
    34. ?>
    Но и так не работает
     
  14. Vanchot

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

    С нами с:
    23 мар 2019
    Сообщения:
    104
    Симпатии:
    19
    Адрес:
    Ахерон (LV-426)
    Ещё раз:
    PHP:
    1. $this->$data;// не так
    2. $this->data;// должно быть так
    3. $this->$dataa;// не так
    4. $this->dataa;// должно быть так
     
  15. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    PHP: Основы - Manual
    Перечитайте. Обратите внимание на синтаксис. Где надо ставить $, где не надо...
    Чем всё-таки отличается свойство класса от переменной?
    Определитесь уже, в какое свойство сохраняете данные, прочитанные из файла - его и дополняйте новым значением и записывайте в файл.
    То-же с именем, получаемым из формы.
    И передавать параметр в метод, который его не ожидает - тоже не надо.
    PS: не надо играть в "угадайку". Надо следовать логике и синтаксису.
     
  16. Vanchot

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

    С нами с:
    23 мар 2019
    Сообщения:
    104
    Симпатии:
    19
    Адрес:
    Ахерон (LV-426)
    Слишком много ошибок. Очень мало шансов, что он когда-то заработает. Тем более с таким небрежным подходом.
    В главном файле создан объект (а на самом деле нет из-за ошибок, но PHP их не выводит). Вызываете функцию
    PHP:
    1. $user -> Create_user($name,$data);
    с какими данными? Откуда они? Подставьте пока хотя бы константы для проверки. Когда заработает, будете усложнять и ловить $_POST.
    Даже если что-то передали из $_POST, не надо в функции класса больше обращаться к этому $_POST, это плохая практика. Всё должно быть переданно через параметры функции. А у Вас Create_user даже и не ловит эти переданные параметры.
     
    #16 Vanchot, 18 ноя 2021
    Последнее редактирование: 18 ноя 2021
  17. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @Andrew21, как-то название раздела формума упустили :)
    Вот пример, который может получиться при минимуме исправлений приведённого кода: песочница.
    PHP:
    1. $foo = ''; // якобы файл
    2. // создание класса юзер
    3. class User
    4. {
    5.   // объект
    6.   public $data;
    7.   // метод для связи с файлом
    8.   public function Connect()
    9.   {
    10.   // чтение файла
    11.   //$data = file_get_contents('User.json');
    12.   // исключительно для теста. "Чтение" якобы файла
    13.   global $foo; $data = $foo;
    14.   // декодирование файла из json
    15.   $this->data = json_decode($data, true);
    16.   }
    17.   // метод для записи в файл
    18.   public function Write()
    19.   {
    20.   // кодирование в json формат
    21.   $data = json_encode($this->data, JSON_PRETTY_PRINT);
    22.   // запись данных в файл
    23.   // file_put_contents('User.json', $data);
    24.   // исключительно для теста "Запись" в якобы файл
    25.   global $foo; $foo = $data;
    26.   }
    27.   public function Create_user($name)
    28.   {
    29.   $this->Connect();
    30.   $add_arr = array(
    31.   'name' => $name
    32.   );
    33.   $this->data[] = $add_arr;
    34.   $this->Write($this->data);
    35.   }
    36. }
    37.  
    38. $aUsers = [
    39.   'UserName1',
    40.   'UserName2',
    41.   'UserName3',
    42.   ];
    43. foreach ($aUsers as $name) {
    44.   $user = new User();
    45.   $user->Create_user($name);
    46.   var_dump($foo);
    47. }
    Но не забывайте, что есть, как минимум, PSR-1: Basic Coding Standard.
     
  18. Andrew21

    Andrew21 Новичок

    С нами с:
    1 ноя 2021
    Сообщения:
    55
    Симпатии:
    0
    Написал так, всё работает, укажите пожалуйста какие ошибки есть, которых я не вижу:

    PHP:
    1. <?php
    2. // создание класса юзер
    3. class User
    4. {
    5.     // объект
    6.     public $name;
    7.     public $dataa;
    8.     // метод для связи с файлом
    9.     public function Connect()
    10.     {
    11.         // чтение файла
    12.         $data = file_get_contents('User.json');
    13.             //декодирование файла из json
    14.         $this->dataa = json_decode($data, true);
    15.        
    16.     }
    17.     // метод для записи в файл
    18.     public function Write()
    19.     {
    20.         // кодирование в json формат
    21.         $this->dataa = json_encode($this->dataa, JSON_PRETTY_PRINT);
    22.         // запись данных в файл
    23.         file_put_contents('User.json', $this->dataa);
    24.     }
    25.     public function Create_user()
    26.     {
    27.         $this -> Connect();
    28.         $add_arr=array(
    29.             'name'.$name => $_POST['name']
    30.         );
    31.         $this->dataa[] = $add_arr;
    32.         $this -> Write();
    33.     }
    34. }
    35. ?>
     
  19. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    Зачем записывать в свойство json-строку? Оно для обычного массива. Тут достаточно простой переменной.
    Что ожидаете получить в индексе элемента массива?
    Как используете свойство $name (строка 6). Для чего оно?
    Из методов класса лучше не обращаться к глобальным переменным ($_POST). Требуемое значение можно передать как аргумент.
    Имя файла, в котором сохраняются данные, тоже можно сделать "настраиваемым".
    Для начала - хотя-бы константой в классе.
     
  20. Andrew21

    Andrew21 Новичок

    С нами с:
    1 ноя 2021
    Сообщения:
    55
    Симпатии:
    0
    первое замечание переделал.
    Второе, ничего не ожидаю, также переделал, т.к. как и вы не вижу в этом смысла.
    $name также убрал потому что не использую это свойство.
    Имя файла, для чего его настраивать ? Он же и так, если такого файла нет, то он создастся с указанным именем.
    У меня появился другой вопрос.
    Как проверить логин и пароль, чтобы пароль соответствовал логину создавшего его юзера, чтобы работа как в sql запросах, если введённый пароль равен паролю введённого логина то true else false ???
    Код (Text):
    1. [
    2.     {
    3.         "login": "zhuro",
    4.         "password": "be1654a2f1ff85ff345ec5768ef086e5",
    5.         "email": "zhko27@gmail.com",
    6.         "name": "\u0410\u043d\u0434\u0440\u0435\u0439"
    7.     },
    8.     {
    9.         "login": "\u0448\u043a\u043e\u043b\u044f\u04402",
    10.         "password": "be1654a2f1ff85ff345ec5768ef086e5",
    11.         "email": "zhav27@gmail.co",
    12.         "name": "\u0410\u043d\u0434\u0440\u0435\u0439"
    13.     }
    14. ]
    У меня есть два пользователя, мне нужно проверить чтобы пароль соответствовал логину вводимого пользователя, как это сделать ?
     
  21. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    В общем случае - слишком накладно будет изменять все места в коде, где используется строка.
    Что касается паролей:
    PHP: Функции хеширования паролей - Manual
    А проверять - пару логин и пароль (хеш пароля). Если в базе найдена запись, у которой поля "логин" и "хеш пароля" соответствуют проверяемым - всё в порядке, если нет - то не соответствуют.
    В случае с массивом - обход массива до нахождения элемента с указанным логином и проверка его пароля (хеша).
    Так как логин должен быть уникальным, и в случае успеха проверки, и в случае её провала - обход массива прекращается.
    Причём в случае несоответствия - не надо в сообщении пользователю уточнять, что имеено не соответствует.
     
  22. Andrew21

    Andrew21 Новичок

    С нами с:
    1 ноя 2021
    Сообщения:
    55
    Симпатии:
    0
     
  23. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    Прочитать из файла в свойство $data(a), попутно преобразовав в массив.
    А дальше - обход массива и проверка его значений.
     
  24. Andrew21

    Andrew21 Новичок

    С нами с:
    1 ноя 2021
    Сообщения:
    55
    Симпатии:
    0
    Это я понимаю, я не понимаю как это кодом написать, можете показать пожалуйста ?
     
  25. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    Например.