Привет. Хочу написать простую регистрацию, сделал следующий класс PHP: namespace Model\Registration; require_once 'Db.php'; use Model\Database\Db; class Registration { public $connection; public function __construct() { $this->connection = Db::Connect(); } public function Registr() { if(isset($_POST['btn'])) { if(isset($_POST['email']) !== '' && isset($_POST['login']) !== '' && isset($_POST['password']) !== '') { $dbh = $this->connection; $sql = 'INSERT INTO users(email, login, password) VALUES (:email, :login, :password)'; $sqlParams = [':email' => $_POST['email'], ':login' => $_POST['login'], ':password' => $_POST['password']]; $sth = $dbh->prepare($sql); $result = $sth->execute($sqlParams); header('Location: /'); } else { echo 'Заполните все поля <a href="../View/registration.php"><b>Registration</b></a>'; } } } } Есть lдругой файл, из которого я пытаюсь вызвать метод Registr PHP: require 'Model/Registration.php'; use Model\Registration\Registration; $registration = new Registration(); $registration->Registr(); require 'View/index.php'; Объект класса Registration создаётся, но вызов метода Registr не работает, выводит NULL, но если создать объект и вызвать метод в файле, в котором класс написан, всё исправно работает. Где я накосячил подскажите?
Исправил на PHP: if($_POST['email'] !== '' && $_POST['login'] !== '' && $_POST['password'] !== '') { У меня не получается вызвать метод из другого файла, объект создается, а метод не работает
Прежде чем гнаться за модными буковками типа MVC, желательно разобраться, что это такое. Чтоб модель не делала редиректы и не выводила сообщения об ошибках.... Ну и проверка на пустоту должна включать и isset, и !== '', тогда будет правильно.
Сейчас правильно сделал проверку? PHP: public function Registr() { if(isset($_POST['btn'])) { if(isset($_POST['email']) !== '' && isset($_POST['login']) !== '' && isset($_POST['password']) !== '') { $dbh = $this->connection; $sql = 'INSERT INTO users(email, login, password) VALUES (:email, :login, :password)'; $sqlParams = [':email' => $_POST['email'], ':login' => $_POST['login'], ':password' => $_POST['password']]; $sth = $dbh->prepare($sql); $result = $sth->execute($sqlParams); header('Location: /'); } else { echo 'Заполните все поля <a href="../View/registration.php"><b>Registration</b></a>'; } } }
@Anton999, а нет желания понимать, что пишешь? К примеру, погуглить, что возвращает isset, и обнаружить удивительную вещь - только true или false, и то и другое всегда !== '', о чём уже тебе написал @MouseZver PHP: if(isset($_POST['email']) && $_POST['email'] !== "" /* и т.д. */)
Написал я эти isset'ы, только один фиг null PHP: namespace Model\Registration; require_once 'Db.php'; use Model\Database\Db; class Registration { public $connection; public function __construct() { $this->connection = Db::Connect(); } public function Registr() { if(isset($_POST['btn'])) { if(isset($_POST['email']) && $_POST['login'] && $_POST['password'] !== "") { $dbh = $this->connection; $sql = 'INSERT INTO users(email, login, password) VALUES (:email, :login, :password)'; $sqlParams = [':email' => $_POST['email'], ':login' => $_POST['login'], ':password' => $_POST['password']]; $sth = $dbh->prepare($sql); $result = $sth->execute($sqlParams); } } } }
Отлаживай дальше. Научись сразу XDebug ставить/пользоваться. Кто, что и куда выводит - нифига не понятно
А ты уверен в этой строчке? PHP: use Model\Registration\Registration; Да и вообще в таковых и в немспейсах? На кой они тебе вообще нужны если ты "инклудишь" коды? --- Добавлено --- Имеем: Код (Text): Model/Db.php Model/Registration.php View/index.php script.php script.php PHP: <?php require_once 'Model/Registration.php'; $registration = new Registration(); $registration->Registr(); require 'View/index.php'; ?> Db.php PHP: <?php class Db { public static function connect() { echo "DB CONNECT!<br>"; } } ?> Registration.php PHP: <?php require_once 'Db.php'; class Registration { public $connection; public function __construct() { $this->connection = Db::Connect(); } public function Registr() { echo "Registr!"; } } ?> Всё отрабатывает. --- Добавлено --- кроме этого непонятно зачем PHP: $result = $sth->execute($sqlParams); если ты присваиваешь результат переменной $result, но при этом это у тебя последнее действие в методе и далее по коду эта переменная ни как не используется, для чего она? --- Добавлено --- так что для начала везде закомментируй строки USE и NAMESPACE И что-то мне кажется у тебя где-то отключен вывод ошибок.
Файл Registration.php теперь выглядит так PHP: require 'Db.php'; class Registration { public function Registr() { $dbh = DB::getConnect(); $sql = 'INSERT INTO users (nickname, email, password) VALUES (:nickname, :email, :password)'; $sqlParams = [':nickname' => $_POST['nickname'], ':email' => $_POST['email'], ':password' => $_POST['password']]; $sth = $dbh->prepare($sql); $sth->execute($sqlParams); } } Вывод ошибок говорит о неопределенных переменных 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, он должен из него вызываться, а фиг там.
Вот этот код прекрасно отрабатывает, когда я создаю объект и вызов метода внутри файла, где класс написан. Registration.php PHP: require 'Db.php'; class Registration { public function Registr() { if(isset($_POST['btn'])) { if(isset($_POST['nickname']) && isset($_POST['email']) && isset($_POST['password']) !== '') { $dbh = DB::getConnect(); $sql = 'INSERT INTO users (nickname, email, password) VALUES (:nickname, :email, :password)'; $sqlParams = [':nickname' => $_POST['nickname'], ':email' => $_POST['email'], ':password' => $_POST['password']]; $sth = $dbh->prepare($sql); $sth->execute($sqlParams); } } } } $registration = new Registration(); $registration->Registr(); Подключаю его к другому файлу Index.php PHP: require_once 'Registration.php'; $registration = new Registration(); $registration->Registr(); require_once 'View/view.php'; Создаю в index объект, вызываю метод и ничего не происходит
Происходит запись в таблицу? Или просто код минует то что в условии и поэтому не вылезают ошибки? --- Добавлено --- А может речь об ИНДЕКСАХ в массиве POST ? --- Добавлено --- Ты вообще проверяешь, что там приходит? Например в теле метода Registr() всё комментируем и пишем такое PHP: echo <pre>; var_dump($_POST); echo </pre>; либо PHP: echo <pre>; print_r($_POST); echo </pre>; --- Добавлено --- A POST куда обращается? к Index.php или Registration.php
Я тут немного побаловался: Вход "form.html" Код (Text): Model/Db.php Model/Registration.php View/index.php index-main.php form.html Model/Db.php PHP: <?php class DB { public static function connect() { $db = 'db.txt'; if (!file_exists($db)){ file_put_contents($db, ''); return false; }else{ return $db; } } } ?> Model/Registration.php PHP: <?php require_once 'Db.php'; class Registration { public $connection; public function __construct() { $this->connection = Db::Connect(); } public function Registr() { if ($this->connection !== false && !empty($_POST)) { $str = implode('|', $_POST); file_put_contents($this->connection, $str."\n", FILE_APPEND); }else{ echo "Need one more time! <br>"; } } } ?> View/index.php PHP: <?php echo "<a href='./form.html'>Try Again!</a>"; ?> index-main.php PHP: <?php require_once 'Model/Registration.php'; $registration = new Registration(); $registration->Registr(); require 'View/index.php'; ?> form.html HTML: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Registration</title> </head> <body> <form id="registration" action="index-main.php" method="post"></form> <p>Nickname: <input name="nickname" form="registration"></p> <p>Password :<input type="password" name="password" form="registration"></p> <p>E-Mail :<input type="email" name="email" form="registration"></p> <p><input type="submit" form="registration"></p> </body> </html> Всё работает как надо! --- Добавлено --- PS: Так что всё оно работает, тебе просто нужно поэтапно разобраться, что и куда приходит и куда ты из формы (или не из формы, просто отловить тот самый POST) это всё отправляешь!
Вообщем решил проблему благодаря тебе, а проблема была вовсе не в валидации полей, а обычная тупая ошибка во вьюхе, action="index-main.php" вот как надо было его вызывать, а я вызывал Model/Registration.php
зачем растягивать запрос? можно сделать так: PHP: $sth = $this->connection->prepare('INSERT INTO `users` (`email`, `login`, `password`) VALUES (?,?,?)'); $result = $sth->execute([$_POST['email'], $_POST['login'], $_POST['password']]); по поводу проверки, может для полей будете проверять через функцию empty()
С ней только одна проблема: PHP: empty("0") === true А потом долго не можешь понять, что у тебя не работает
Привет, поправил чуток класс регистрации. Я так понимаю у тебя это модель. Ее основная задача сохранить данные и вернуть ошибки сохранения если они были. PHP: <?php namespace Model\Registration; require_once 'Db.php'; use Model\Database\Db; /** * Class Registration * * @package Model\Registration */ class Registration { /** * @var \PDO $dbh */ private $dbh; /** * Registration constructor. */ public function __construct() { $this->dbh = Db::Connect(); } /** * @param string|null $email * @param string|null $login * @param string|null $password * * @return array */ public function register(string $email = null, string $login = null, string $password = null): array { $errors = []; $result = ['success' => false]; if ($email && $login && $password) { $sql = 'INSERT INTO users (email, login, password) VALUES (:email, :login, :password)'; $sqlParams = [':email' => $email, ':login' => $login, ':password' => $password]; $stmt = $this->dbh->prepare($sql); try { $stmt->execute($sqlParams); $result['success'] = true; } catch (\Exception $e) { $errors = $e->getMessage(); } } if (!empty($errors )) { $result['error'] = $errors ; } return $result; } } 1. Проверку на пустоту советую делать в контролере. 2. Очисти данные перед тем как отдать их модели. 3. Создай новый обьект и отдай ему данные. 4. Посмотри что вернет метод registration. 5. Ошибки валидации и сохранения с контролера передай представлению.
@onderbert, изучи https://www.php.net/manual/ru/function.spl-autoload-register PHP: <?php declare ( strict_types = 1 ); error_reporting ( E_ALL ); spl_autoload_register ( function ( $name ) { $replaces = [ '\\' => DIRECTORY_SEPARATOR, 'Aero\\Database' => 'Lerma\\Database', 'Aero\\SoulWorker' => 'Neuronet\\SoulWorker', ]; require 'src' . DIRECTORY_SEPARATOR . strtr ( $name, $replaces ) . '.php'; } ); это дно --- Добавлено --- регистрируем админа 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 ?
Ты же не сразу узнал о автозагрузке, ведь так. Я просто подтолкнул к тому что бы он понял правильный концепт. Да ты прав исключения в данном случае не будет. Но вообще не мешало бы, предохранятся. Возможно измениться структура бд тогда поймаешь. А так я чуток усовершенствовал его класс. Со временем он поймет что такие операции надо делать в прослойке репозитория. И как вообще должна выглядеть модель. Но и ты такие велики когда то писал и я писал, все писали )