Изучаю ООП в php и появился вопрос, когда добавляю информацию в файл он просто перезаписывается с нуля, но если прописать всё без использования методов Connect и Write, то всё добавляет прекрасно, почему так происходит, что я не так делаю ??? Сам скрипт для новых юзеров PHP: <?php // создание класса юзер class User { // объект public $name; public $data; // метод для связи с файлом public function Connect() { // чтение файла $data = file_get_contents('User.json'); //декодирование файла из json $data = json_decode($data, true); } // метод для записи в файл public function Write($data) { // кодирование в json формат $data = json_encode($data, JSON_PRETTY_PRINT); // запись данных в файл file_put_contents('User.json', $data); } public function Create_user($name, $data) { $this -> Connect(); $add_arr = array ( 'name'.$name => $_POST['name'] ); $data[] = $add_arr; $this -> Write($data); } } ?> форма для "регистрации" новых юзеров PHP: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Регистрация</title> </head> <?php require_once "Use.php"; //ini_set('display_errors', 1); //ini_set('display_startup_errors', 1); //ini_set('error_reporting', E_ALL); if (isset ($_POST['loginn'])) { $user = new User; $user -> Create_user($name,$data); } ?> <form action="/Site.php" method = "POST" name="register"> <p><stronh></strong>Введите имя</p> <input required type="text" name="name"> <button type="submit" name="loginn">Добавить</button> </form>
Я знаю, что там можно дописать FILE_APPEND но тогда добавляется новый массив а мне нужно, чтобы добавляло в один, который уже есть, зачем мне много массивов? Если писать просто, без этих методов, т.е. напрямую то всё работает и добавляет всё в один массив как и надо, а если описать эти методы, то не работает как надо. И тем более, если дописать FILE_APPEND то уже не будет соблюдаться кодирование json, нужно будет между массивами "Enter" ставить в ручную.
@Andrew21, понятно. В классе есть свойства, к которым надо обращаться через псевдопеременную $this. Либо возвращать $data из метода Connect() и прочих подобных. Если инициализировать $this->data в методе Connect(), то не будет необходимости передавать его в метод Write() как параметр. В общем, пересмотрите все моменты, где используете переменную $data. --- Добавлено --- Файл, кстати, всё равно будет "перезаписываться с нуля"... Только данные, ранее из него прочитанные пропадать не будут --- Добавлено --- PS: это было замечание к формулировке вопроса.
Для начала, так сказать, логичности: PHP: public function Connect() { // чтение файла $data = file_get_contents('User.json'); //декодирование файла из json $this->data = json_decode($data, true); }
Я перепробовал наверное все варианты с $this, я понимаю логику как код должен работать, но я не понимаю логику $this, читал информацию про эту "переменную-свойство" но всё без толку, не могу понять, например там где вы добавили $this, почему тогда в скобках не добавили $this и в остальных свойствах тоже, почему не нужно передавать её, если мы через $this будем определять. Можете объяснить ?
@Andrew21, переменная $data в методе Connect() - локальная для этого метода. К свойству $data, описанному в строке 7 (public $data из методов доступ осуществляется через $this->data --- Добавлено --- Потому что это разные элементы. Один - локальная переменная, другой - свойство класса.
Тогда, насколько я понял, всё должно быть так: PHP: <?php // создание класса юзер class User { // объект public $name; // метод для связи с файлом public function Connect() { // чтение файла $data = file_get_contents('User.json'); //декодирование файла из json $this->$data = json_decode($data, true); } // метод для записи в файл public function Write() { // кодирование в json формат $this -> $data = json_encode($data, JSON_PRETTY_PRINT); // запись данных в файл file_put_contents('User.json', $data); } public function Create_user($name) { $this -> Connect(); $add_arr=array( 'name'.$name => $_POST['name'] ); $this->$data[] = $add_arr; $this -> Write($data); } } ?> Но он не работает, вообще ничего не добавляется
А поле PHP: public $data; , что было под $name, куда делось? И Ваше PHP: $this->$data несколько отличается от предложенного @Sail PHP: $this->data Локальные переменные и глобальные лучше называть разными именами.
Я убирал для тестов. Локальные переменные это те , что в методах, а глобальные, то что я $data описал под $name, так ведь ? Я не до конца понимаю где нужно использовать локальную, а где глобальную и в конечном методе какую из переменных мне нужно использовать.
Насколько я понял всё должно быть так: PHP: <?php // создание класса юзер class User { // объект public $name; public $dataa; // метод для связи с файлом public function Connect() { // чтение файла $data = file_get_contents('User.json'); //декодирование файла из json $this->$dataa = json_decode($data, true); } // метод для записи в файл public function Write() { // кодирование в json формат $dataa = json_encode($data, JSON_PRETTY_PRINT); // запись данных в файл file_put_contents('User.json', $dataa); } public function Create_user() { $this -> Connect(); $add_arr=array( 'name'.$name => $_POST['name'] ); $dataa[] = $add_arr; $this -> Write($dataa); } } ?> Но и так не работает
Ещё раз: PHP: $this->$data;// не так $this->data;// должно быть так $this->$dataa;// не так $this->dataa;// должно быть так
PHP: Основы - Manual Перечитайте. Обратите внимание на синтаксис. Где надо ставить $, где не надо... Чем всё-таки отличается свойство класса от переменной? Определитесь уже, в какое свойство сохраняете данные, прочитанные из файла - его и дополняйте новым значением и записывайте в файл. То-же с именем, получаемым из формы. И передавать параметр в метод, который его не ожидает - тоже не надо. PS: не надо играть в "угадайку". Надо следовать логике и синтаксису.
Слишком много ошибок. Очень мало шансов, что он когда-то заработает. Тем более с таким небрежным подходом. В главном файле создан объект (а на самом деле нет из-за ошибок, но PHP их не выводит). Вызываете функцию PHP: $user -> Create_user($name,$data); с какими данными? Откуда они? Подставьте пока хотя бы константы для проверки. Когда заработает, будете усложнять и ловить $_POST. Даже если что-то передали из $_POST, не надо в функции класса больше обращаться к этому $_POST, это плохая практика. Всё должно быть переданно через параметры функции. А у Вас Create_user даже и не ловит эти переданные параметры.
@Andrew21, как-то название раздела формума упустили Вот пример, который может получиться при минимуме исправлений приведённого кода: песочница. Спойлер PHP: $foo = ''; // якобы файл // создание класса юзер class User { // объект public $data; // метод для связи с файлом public function Connect() { // чтение файла //$data = file_get_contents('User.json'); // исключительно для теста. "Чтение" якобы файла global $foo; $data = $foo; // декодирование файла из json $this->data = json_decode($data, true); } // метод для записи в файл public function Write() { // кодирование в json формат $data = json_encode($this->data, JSON_PRETTY_PRINT); // запись данных в файл // file_put_contents('User.json', $data); // исключительно для теста "Запись" в якобы файл global $foo; $foo = $data; } public function Create_user($name) { $this->Connect(); $add_arr = array( 'name' => $name ); $this->data[] = $add_arr; $this->Write($this->data); } } $aUsers = [ 'UserName1', 'UserName2', 'UserName3', ]; foreach ($aUsers as $name) { $user = new User(); $user->Create_user($name); var_dump($foo); } Но не забывайте, что есть, как минимум, PSR-1: Basic Coding Standard.
Написал так, всё работает, укажите пожалуйста какие ошибки есть, которых я не вижу: PHP: <?php // создание класса юзер class User { // объект public $name; public $dataa; // метод для связи с файлом public function Connect() { // чтение файла $data = file_get_contents('User.json'); //декодирование файла из json $this->dataa = json_decode($data, true); } // метод для записи в файл public function Write() { // кодирование в json формат $this->dataa = json_encode($this->dataa, JSON_PRETTY_PRINT); // запись данных в файл file_put_contents('User.json', $this->dataa); } public function Create_user() { $this -> Connect(); $add_arr=array( 'name'.$name => $_POST['name'] ); $this->dataa[] = $add_arr; $this -> Write(); } } ?>
Зачем записывать в свойство json-строку? Оно для обычного массива. Тут достаточно простой переменной. Что ожидаете получить в индексе элемента массива? Как используете свойство $name (строка 6). Для чего оно? Из методов класса лучше не обращаться к глобальным переменным ($_POST). Требуемое значение можно передать как аргумент. Имя файла, в котором сохраняются данные, тоже можно сделать "настраиваемым". Для начала - хотя-бы константой в классе.
первое замечание переделал. Второе, ничего не ожидаю, также переделал, т.к. как и вы не вижу в этом смысла. $name также убрал потому что не использую это свойство. Имя файла, для чего его настраивать ? Он же и так, если такого файла нет, то он создастся с указанным именем. У меня появился другой вопрос. Как проверить логин и пароль, чтобы пароль соответствовал логину создавшего его юзера, чтобы работа как в sql запросах, если введённый пароль равен паролю введённого логина то true else false ??? Код (Text): [ { "login": "zhuro", "password": "be1654a2f1ff85ff345ec5768ef086e5", "email": "zhko27@gmail.com", "name": "\u0410\u043d\u0434\u0440\u0435\u0439" }, { "login": "\u0448\u043a\u043e\u043b\u044f\u04402", "password": "be1654a2f1ff85ff345ec5768ef086e5", "email": "zhav27@gmail.co", "name": "\u0410\u043d\u0434\u0440\u0435\u0439" } ] У меня есть два пользователя, мне нужно проверить чтобы пароль соответствовал логину вводимого пользователя, как это сделать ?
В общем случае - слишком накладно будет изменять все места в коде, где используется строка. Что касается паролей: PHP: Функции хеширования паролей - Manual А проверять - пару логин и пароль (хеш пароля). Если в базе найдена запись, у которой поля "логин" и "хеш пароля" соответствуют проверяемым - всё в порядке, если нет - то не соответствуют. В случае с массивом - обход массива до нахождения элемента с указанным логином и проверка его пароля (хеша). Так как логин должен быть уникальным, и в случае успеха проверки, и в случае её провала - обход массива прекращается. Причём в случае несоответствия - не надо в сообщении пользователю уточнять, что имеено не соответствует.
Прочитать из файла в свойство $data(a), попутно преобразовав в массив. А дальше - обход массива и проверка его значений.