За последние 24 часа нас посетили 8968 программистов и 470 роботов. Сейчас ищут 225 программистов ...

Не работает вызов метода.

Тема в разделе "PHP для новичков", создана пользователем Anton999, 3 янв 2020.

Метки:
  1. Anton999

    Anton999 Новичок

    С нами с:
    3 янв 2020
    Сообщения:
    16
    Симпатии:
    0
    Привет.
    Хочу написать простую регистрацию, сделал следующий класс
    PHP:
    1. namespace Model\Registration;
    2.  
    3. require_once 'Db.php';
    4. use Model\Database\Db;
    5.  
    6. class Registration {
    7.  
    8.     public $connection;
    9.  
    10.     public function __construct() {
    11.         $this->connection = Db::Connect();
    12.     }
    13.  
    14.     public function Registr() {
    15.         if(isset($_POST['btn'])) {
    16.             if(isset($_POST['email']) !== '' && isset($_POST['login']) !== '' && isset($_POST['password']) !== '') {
    17.                 $dbh = $this->connection;
    18.                 $sql = 'INSERT INTO users(email, login, password) VALUES (:email, :login, :password)';
    19.                 $sqlParams = [':email' => $_POST['email'], ':login' => $_POST['login'], ':password' => $_POST['password']];
    20.                 $sth = $dbh->prepare($sql);
    21.                 $result = $sth->execute($sqlParams);
    22.                 header('Location: /');
    23.             } else {
    24.                 echo 'Заполните все поля <a href="../View/registration.php"><b>Registration</b></a>';
    25.             }
    26.         }
    27.     }
    28.  
    29. }
    Есть lдругой файл, из которого я пытаюсь вызвать метод Registr
    PHP:
    1. require 'Model/Registration.php';
    2. use Model\Registration\Registration;
    3.  
    4. $registration = new Registration();
    5. $registration->Registr();
    6.  
    7. require 'View/index.php';
    Объект класса Registration создаётся, но вызов метода Registr не работает, выводит NULL, но если создать объект и вызвать метод в файле, в котором класс написан, всё исправно работает. Где я накосячил подскажите?
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    6.703
    Симпатии:
    1.060
    Адрес:
    Лень
    :)
    Всегда будет TRUE
     
  3. Anton999

    Anton999 Новичок

    С нами с:
    3 янв 2020
    Сообщения:
    16
    Симпатии:
    0
    Исправил на
    PHP:
    1. if($_POST['email'] !== '' && $_POST['login'] !== '' && $_POST['password'] !== '') {
    У меня не получается вызвать метод из другого файла, объект создается, а метод не работает
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    6.703
    Симпатии:
    1.060
    Адрес:
    Лень
    снова
     
  5. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    7.847
    Симпатии:
    1.543
    Прежде чем гнаться за модными буковками типа MVC, желательно разобраться, что это такое. Чтоб модель не делала редиректы и не выводила сообщения об ошибках....

    Ну и проверка на пустоту должна включать и isset, и !== '', тогда будет правильно.
     
    Roman __construct нравится это.
  6. Anton999

    Anton999 Новичок

    С нами с:
    3 янв 2020
    Сообщения:
    16
    Симпатии:
    0
    Сейчас правильно сделал проверку?
    PHP:
    1. public function Registr() {
    2.         if(isset($_POST['btn'])) {
    3.             if(isset($_POST['email']) !== '' && isset($_POST['login']) !== '' && isset($_POST['password']) !== '') {
    4.                 $dbh = $this->connection;
    5.                 $sql = 'INSERT INTO users(email, login, password) VALUES (:email, :login, :password)';
    6.                 $sqlParams = [':email' => $_POST['email'], ':login' => $_POST['login'], ':password' => $_POST['password']];
    7.                 $sth = $dbh->prepare($sql);
    8.                 $result = $sth->execute($sqlParams);
    9.                 header('Location: /');
    10.             } else {
    11.                 echo 'Заполните все поля <a href="../View/registration.php"><b>Registration</b></a>';
    12.             }
    13.         }
    14.     }
     
  7. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    7.847
    Симпатии:
    1.543
    @Anton999, а нет желания понимать, что пишешь? К примеру, погуглить, что возвращает isset, и обнаружить удивительную вещь - только true или false, и то и другое всегда !== '', о чём уже тебе написал @MouseZver

    PHP:
    1. if(isset($_POST['email']) && $_POST['email'] !== "" /* и т.д. */)
     
  8. Anton999

    Anton999 Новичок

    С нами с:
    3 янв 2020
    Сообщения:
    16
    Симпатии:
    0
    Написал я эти isset'ы, только один фиг null

    PHP:
    1. namespace Model\Registration;
    2.  
    3. require_once 'Db.php';
    4. use Model\Database\Db;
    5.  
    6. class Registration {
    7.  
    8.     public $connection;
    9.  
    10.     public function __construct() {
    11.         $this->connection = Db::Connect();
    12.     }
    13.  
    14.     public function Registr() {
    15.         if(isset($_POST['btn'])) {
    16.             if(isset($_POST['email']) && $_POST['login'] && $_POST['password'] !== "") {
    17.                 $dbh = $this->connection;
    18.                 $sql = 'INSERT INTO users(email, login, password) VALUES (:email, :login, :password)';
    19.                 $sqlParams = [':email' => $_POST['email'], ':login' => $_POST['login'], ':password' => $_POST['password']];
    20.                 $sth = $dbh->prepare($sql);
    21.                 $result = $sth->execute($sqlParams);
    22.             }
    23.         }
    24.     }
    25.  
    26. }
     
  9. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    7.847
    Симпатии:
    1.543
    Отлаживай дальше. Научись сразу XDebug ставить/пользоваться. Кто, что и куда выводит - нифига не понятно
     
    Roman __construct нравится это.
  10. AlexandrS

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

    С нами с:
    30 сен 2017
    Сообщения:
    661
    Симпатии:
    104
    Адрес:
    Краснодар
    А ты уверен в этой строчке?
    PHP:
    1. use Model\Registration\Registration;
    Да и вообще в таковых и в немспейсах?
    На кой они тебе вообще нужны если ты "инклудишь" коды?
    --- Добавлено ---
    Имеем:
    Код (Text):
    1.  
    2. Model/Db.php
    3. Model/Registration.php
    4. View/index.php
    5. script.php
    script.php
    PHP:
    1. <?php
    2.  
    3. require_once 'Model/Registration.php';
    4. $registration = new Registration();
    5. $registration->Registr();
    6. require 'View/index.php';
    7.  
    8. ?>
    Db.php
    PHP:
    1. <?php
    2.  
    3. class Db
    4. {
    5.     public static function connect()
    6.     {
    7.         echo "DB CONNECT!<br>";
    8.     }
    9. }
    10.  
    11. ?>
    Registration.php
    PHP:
    1. <?php
    2.  
    3. require_once 'Db.php';
    4. class Registration {
    5.     public $connection;
    6.     public function __construct()
    7.     {
    8.         $this->connection = Db::Connect();
    9.     }
    10.     public function Registr()
    11.     {
    12.         echo "Registr!";
    13.     }
    14. }
    15.  
    16. ?>
    Всё отрабатывает.
    --- Добавлено ---
    кроме этого непонятно зачем
    PHP:
    1. $result = $sth->execute($sqlParams);
    если ты присваиваешь результат переменной $result, но при этом это у тебя последнее действие в методе и далее по коду эта переменная ни как не используется, для чего она?
    --- Добавлено ---
    так что для начала везде закомментируй строки USE и NAMESPACE
    И что-то мне кажется у тебя где-то отключен вывод ошибок.
     
  11. Anton999

    Anton999 Новичок

    С нами с:
    3 янв 2020
    Сообщения:
    16
    Симпатии:
    0
    Файл Registration.php теперь выглядит так

    PHP:
    1. require 'Db.php';
    2.  
    3. class Registration {
    4.  
    5.     public function Registr() {
    6.         $dbh = DB::getConnect();
    7.         $sql = 'INSERT INTO users (nickname, email, password) VALUES (:nickname, :email, :password)';
    8.         $sqlParams = [':nickname' => $_POST['nickname'], ':email' => $_POST['email'], ':password' => $_POST['password']];
    9.         $sth = $dbh->prepare($sql);
    10.         $sth->execute($sqlParams);
    11.     }
    12.  
    13. }
    Вывод ошибок говорит о неопределенных переменных

    Notice: Undefined index: nickname in C:\PHP\OSPanel\domains\test\Model\Registration.php on line 14
    Notice: Undefined index: email in C:\PHP\OSPanel\domains\test\Model\Registration.php on line 14
    Notice: Undefined index: password in C:\PHP\OSPanel\domains\test\Model\Registration.php on line 14

    Делаю проверку через isset, ошибки пропадают, но метод отрабатывает только тогда, когда создаешь объект и вызов в файле Registration.php, хотя, я же ведь подключаю его к Script.php, он должен из него вызываться, а фиг там.


     
  12. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    6.703
    Симпатии:
    1.060
    Адрес:
    Лень
    покажи где ты там делаешь ?
     
  13. Anton999

    Anton999 Новичок

    С нами с:
    3 янв 2020
    Сообщения:
    16
    Симпатии:
    0
    Вот этот код прекрасно отрабатывает, когда я создаю объект и вызов метода внутри файла, где класс написан.
    Registration.php
    PHP:
    1. require 'Db.php';
    2.  
    3. class Registration {
    4.  
    5.     public function Registr() {
    6.         if(isset($_POST['btn'])) {
    7.             if(isset($_POST['nickname']) && isset($_POST['email']) && isset($_POST['password']) !== '') {
    8.                 $dbh = DB::getConnect();
    9.                 $sql = 'INSERT INTO users (nickname, email, password) VALUES (:nickname, :email, :password)';
    10.                 $sqlParams = [':nickname' => $_POST['nickname'], ':email' => $_POST['email'], ':password' => $_POST['password']];
    11.                 $sth = $dbh->prepare($sql);
    12.                 $sth->execute($sqlParams);
    13.             }
    14.         }
    15.  
    16.     }
    17.  
    18. }
    19.  
    20. $registration = new Registration();
    21. $registration->Registr();
    Подключаю его к другому файлу Index.php

    PHP:
    1. require_once 'Registration.php';
    2.  
    3. $registration = new Registration();
    4. $registration->Registr();
    5.  
    6. require_once 'View/view.php';
    Создаю в index объект, вызываю метод и ничего не происходит
     
  14. AlexandrS

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

    С нами с:
    30 сен 2017
    Сообщения:
    661
    Симпатии:
    104
    Адрес:
    Краснодар
    Происходит запись в таблицу? Или просто код минует то что в условии и поэтому не вылезают ошибки?
    --- Добавлено ---
    А может речь об ИНДЕКСАХ в массиве POST ?
    --- Добавлено ---
    Ты вообще проверяешь, что там приходит?
    Например в теле метода Registr() всё комментируем и пишем такое

    PHP:
    1. echo <pre>;
    2. var_dump($_POST);
    3. echo </pre>;
    либо

    PHP:
    1. echo <pre>;
    2. print_r($_POST);
    3. echo </pre>;
    --- Добавлено ---
    A POST куда обращается? к Index.php или Registration.php
     
  15. AlexandrS

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

    С нами с:
    30 сен 2017
    Сообщения:
    661
    Симпатии:
    104
    Адрес:
    Краснодар
    Я тут немного побаловался:
    Вход "form.html"

    Код (Text):
    1. Model/Db.php
    2. Model/Registration.php
    3. View/index.php
    4. index-main.php
    5. form.html
    Model/Db.php
    PHP:
    1. <?php
    2.  
    3. class DB
    4. {
    5.     public static function connect()
    6.     {
    7.         $db = 'db.txt';
    8.  
    9.         if (!file_exists($db)){
    10.  
    11.             file_put_contents($db, '');
    12.             return false;
    13.         }else{
    14.  
    15.             return $db;
    16.         }  
    17.     }
    18. }
    19.  
    20. ?>
    Model/Registration.php

    PHP:
    1. <?php
    2.  
    3. require_once 'Db.php';
    4.  
    5. class Registration {
    6.     public $connection;
    7.     public function __construct()
    8.     {
    9.         $this->connection = Db::Connect();
    10.     }
    11.     public function Registr()
    12.     {
    13.         if ($this->connection !== false && !empty($_POST)) {
    14.  
    15.             $str = implode('|', $_POST);
    16.             file_put_contents($this->connection, $str."\n", FILE_APPEND);
    17.  
    18.         }else{
    19.  
    20.            echo "Need one more time! <br>";
    21.         }
    22.     }
    23. }
    24.  
    25. ?>
    View/index.php
    PHP:
    1. <?php
    2.  
    3. echo "<a href='./form.html'>Try Again!</a>";
    4.  
    5. ?>
    index-main.php
    PHP:
    1. <?php
    2.  
    3. require_once 'Model/Registration.php';
    4. $registration = new Registration();
    5. $registration->Registr();
    6. require 'View/index.php';
    7.  
    8. ?>
    form.html
    HTML:
    1. <!DOCTYPE html>
    2.   <meta charset="utf-8">
    3.   <title>Registration</title>
    4. </head>
    5.   <form id="registration" action="index-main.php" method="post"></form>
    6.       <p>Nickname: <input name="nickname" form="registration"></p>
    7.       <p>Password :<input type="password" name="password" form="registration"></p>
    8.     <p>E-Mail :<input type="email" name="email" form="registration"></p>
    9.     <p><input type="submit" form="registration"></p>
    10. </body>
    11. </html>
    Всё работает как надо!:D
    --- Добавлено ---
    PS: Так что всё оно работает, тебе просто нужно поэтапно разобраться, что и куда приходит и куда ты из формы (или не из формы, просто отловить тот самый POST) это всё отправляешь!
     
    #15 AlexandrS, 4 янв 2020
    Последнее редактирование: 4 янв 2020
    Anton999 нравится это.
  16. Anton999

    Anton999 Новичок

    С нами с:
    3 янв 2020
    Сообщения:
    16
    Симпатии:
    0
    Вообщем решил проблему благодаря тебе, а проблема была вовсе не в валидации полей, а обычная тупая ошибка во вьюхе, action="index-main.php" вот как надо было его вызывать, а я вызывал Model/Registration.php
     
  17. AlexandrS

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

    С нами с:
    30 сен 2017
    Сообщения:
    661
    Симпатии:
    104
    Адрес:
    Краснодар
    Рад что был полезен.
    Я ведь вот тут как раз и спрашивал:
     
  18. _ne_scaju_

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

    С нами с:
    25 ноя 2016
    Сообщения:
    2.058
    Симпатии:
    117
    зачем растягивать запрос? можно сделать так:
    PHP:
    1. $sth = $this->connection->prepare('INSERT INTO `users` (`email`, `login`, `password`) VALUES (?,?,?)');
    2. $result = $sth->execute([$_POST['email'], $_POST['login'], $_POST['password']]);
    по поводу проверки, может для полей будете проверять через функцию empty()
     
  19. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    7.847
    Симпатии:
    1.543
    С ней только одна проблема:
    PHP:
    1. empty("0") === true
    А потом долго не можешь понять, что у тебя не работает :)
     
    _ne_scaju_ нравится это.
  20. _ne_scaju_

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

    С нами с:
    25 ноя 2016
    Сообщения:
    2.058
    Симпатии:
    117
    ну все же empty для полей лучше?
     
  21. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    325
    @_ne_scaju_, empty не лучше и не хуже, надо использовать то, что требует логика приложения.
     
  22. onderbert

    onderbert Новичок

    С нами с:
    24 мар 2019
    Сообщения:
    18
    Симпатии:
    1
    Привет, поправил чуток класс регистрации. Я так понимаю у тебя это модель. Ее основная задача сохранить данные и вернуть ошибки сохранения если они были.
    PHP:
    1. <?php
    2. namespace Model\Registration;
    3.  
    4. require_once 'Db.php';
    5. use Model\Database\Db;
    6.  
    7. /**
    8. * Class Registration
    9. *
    10. * @package Model\Registration
    11. */
    12. class Registration {
    13.     /**
    14.      * @var \PDO $dbh
    15.      */
    16.     private $dbh;
    17.  
    18.     /**
    19.      * Registration constructor.
    20.      */
    21.     public function __construct()
    22.     {
    23.         $this->dbh = Db::Connect();
    24.     }
    25.  
    26.     /**
    27.      * @param string|null $email
    28.      * @param string|null $login
    29.      * @param string|null $password
    30.      *
    31.      * @return array
    32.      */
    33.     public function register(string $email = null, string $login = null, string $password = null): array
    34.     {
    35.         $errors = [];
    36.         $result = ['success' => false];
    37.         if ($email && $login && $password) {
    38.             $sql = 'INSERT INTO users (email, login, password) VALUES (:email, :login, :password)';
    39.             $sqlParams = [':email' => $email, ':login' => $login, ':password' => $password];
    40.             $stmt = $this->dbh->prepare($sql);
    41.             try {
    42.                 $stmt->execute($sqlParams);
    43.                 $result['success'] = true;
    44.             } catch (\Exception $e) {
    45.                 $errors = $e->getMessage();
    46.             }
    47.         }
    48.         if (!empty($errors )) {
    49.             $result['error'] = $errors ;
    50.         }
    51.         return $result;
    52.     }
    53. }
    1. Проверку на пустоту советую делать в контролере.
    2. Очисти данные перед тем как отдать их модели.
    3. Создай новый обьект и отдай ему данные.
    4. Посмотри что вернет метод registration.
    5. Ошибки валидации и сохранения с контролера передай представлению.
     
    #22 onderbert, 10 янв 2020
    Последнее редактирование: 10 янв 2020
  23. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    6.703
    Симпатии:
    1.060
    Адрес:
    Лень
    @onderbert,

    изучи https://www.php.net/manual/ru/function.spl-autoload-register

    PHP:
    1. <?php
    2.  
    3. declare ( strict_types = 1 );
    4.  
    5. error_reporting ( E_ALL );
    6.  
    7. spl_autoload_register ( function ( $name )
    8. {
    9.     $replaces = [
    10.         '\\' => DIRECTORY_SEPARATOR,
    11.         'Aero\\Database' => 'Lerma\\Database',
    12.         'Aero\\SoulWorker' => 'Neuronet\\SoulWorker',
    13.     ];
    14.  
    15.     require 'src' . DIRECTORY_SEPARATOR . strtr ( $name, $replaces ) . '.php';
    16. } );
    это дно
    --- Добавлено ---
    регистрируем админа
    admin 123
    admin 123
    admin 123
    admin 123
    admin 123
    admin 123
    admin 123
    admin 123
    admin 123
    admin 123
    admin 123
    admin 123
    admin 123
    admin 123
    admin 123
    admin 123
    admin 123
    admin 123
    admin 123
    кого там ловить собрался ? покажи мне логику прохождения, чтобы включился кейтч с message ?
     
  24. onderbert

    onderbert Новичок

    С нами с:
    24 мар 2019
    Сообщения:
    18
    Симпатии:
    1
    Ты же не сразу узнал о автозагрузке, ведь так. Я просто подтолкнул к тому что бы он понял правильный концепт. Да ты прав исключения в данном случае не будет. Но вообще не мешало бы, предохранятся. Возможно измениться структура бд тогда поймаешь. А так я чуток усовершенствовал его класс. Со временем он поймет что такие операции надо делать в прослойке репозитория. И как вообще должна выглядеть модель. Но и ты такие велики когда то писал и я писал, все писали )
     
  25. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    6.703
    Симпатии:
    1.060
    Адрес:
    Лень
    сразу, как начал изучать пространства
     
    Sail нравится это.