Я пытаюсь заставить мою регистрационную форму показывать сообщение на той же странице, что и регистрационная форма, о том, что имя пользователя используется, если оно было принято после отправки формы.
Я сделал регистрационную форму, которая отправляет информацию в файл add-user.php. внутри моего файла add-user.php у меня есть две функции. -> nameTaken functions проверяет, есть ли имя пользователя в базе данных, и -> insert вставляет имена в базу данных, если они не взяты.
Вот код файла add-user.php:
<?php
header('Content-type: text/javascript');
$hash = password_hash($_POST['password'], PASSWORD_BCRYPT);
if(!$app['database']->nameTaken($_POST['username'])){
$app['database']->insert('users', [
'name' => $_POST['username'],
'password' => $hash
]);
};
вот функция nameTaken, которая находится в другом файле:
public function nameTaken($username){
$statement = $this->pdo->prepare('SELECT count(*) FROM users WHERE name = :name');
$statement->execute(array('name' => $username));
$res = $statement->fetch(PDO::FETCH_NUM);
$exists = array_pop($res);
if ($exists > 0) {
$json = array(
'success' => false
);
echo json_encode($json);
return true;
} else {
//the name can be made
$json = array(
'success' => true
);
echo json_encode($json);
return false;
}
}
Это работает правильно, но я не знаю, как отправить эту информацию в мой HTML, когда я перенаправлен обратно в файл с моей формой, чтобы он мог показать сообщение, если регистрация прошла успешно или не удалось, потому что имя пользователя уже занято.
Я попытался сделать вывод json для этого и получить его с обещанием, но сразу после отправки формы я перенаправлен на страницу формы, и вызов ajax пуст. Я только видел вопросы о том, как это сделать, пока имя пользователя / пароль вводятся в регистрационную форму здесь, но я хочу показать сообщение после отправки регистрационной формы. Как бы я это сделал?
мое обещание ajax запрос к файлу поста php:
window.onload = function(){
function get(url) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open("GET", url);
xhr.onload = () => resolve(xhr.responseText);
xhr.onerror = () => reject(xhr.statusText);
xhr.send();
});
}
document.getElementById('register').addEventListener('submit', () => {
let promise = get('/controllers/contact.php').then((name) => {
console.log(name);
});
});
}
Я не могу использовать этот javascript, потому что он выполняется до загрузки php-файла, а затем после загрузки php-файла и перенаправления на страницу с моей формой, все в php-файле стирается, и мой обещанный ajax-запрос имеет уже был казнен.
мой HTML:
<form method='POST' action='/users' id='register'>
Username<input type='text' name='username' required>
Password<input type='password' name='password' required>
<button type='submit'>Submit</button>
</form>
Это ошибки, которые я получаю на своем сервере
[Thu Aug 16 17:38:07 2018] 127.0.0.1:36690 [200]: /
[Thu Aug 16 17:38:07 2018] 127.0.0.1:36694 [200]: /registerFail.js
[Thu Aug 16 17:38:10 2018] PHP Notice: Undefined index: password in /home/orpheus/Practice_dev/imagePoster/controllers/add-user.php on line 5
[Thu Aug 16 17:38:11 2018] PHP Notice: Undefined variable: app in /home/orpheus/Practice_dev/imagePoster/controllers/add-user.php on line 7
[Thu Aug 16 17:38:11 2018] PHP Fatal error: Uncaught Error: Call to a member function nameTaken() on null in /home/orpheus/Practice_dev/imagePoster/controllers/add-user.php:7
Stack trace:
#0 {main}
thrown in /home/orpheus/Practice_dev/imagePoster/controllers/add-user.php on line 7
[Thu Aug 16 17:38:11 2018] 127.0.0.1:36734 [500]: /controllers/add-user.php - Uncaught Error: Call to a member function nameTaken() on null in /home/orpheus/Practice_dev/imagePoster/controllers/add-user.php:7
Stack trace:
#0 {main}
thrown in /home/orpheus/Practice_dev/imagePoster/controllers/add-user.php on line 7
[Thu Aug 16 17:38:11 2018] 127.0.0.1:36738 [302]: /users
[Thu Aug 16 17:38:11 2018] 127.0.0.1:36744 [200]: /
[Thu Aug 16 17:38:11 2018] 127.0.0.1:36750 [200]: /registerFail.js
Сначала я на главной странице ‘/’. Сразу же, когда я отправляю свою форму, запрос ajax запускается до загрузки php-файла, поэтому все не определено, затем, когда мой php-файл загружается и проверяет имя пользователя, все работает нормально, и имя пользователя либо отклоняется, либо помещается в мою базу данных. Затем я перенаправлен обратно в каталог ‘/’ с моей формой. Я не могу показать сообщение об ошибке, потому что ajax выполняется до загрузки php-файла, и я не знаю, как это исправить. Я хочу показать сообщение об ошибке при перенаправлении обратно на страницу формы после загрузки файла. Как будет выглядеть код для меня?
<?php
$router->get('', 'controllers/index.php');
$router->get('about', 'controllers/about.php');
$router->get('contact', 'controllers/contact.php');
$router->post('users', 'controllers/add-user.php');
$router->post('login', 'controllers/login.php');
Это мой роутер. controllers / add-user.php не существует, если я не отправлю ему запрос на публикацию. В других местах я могу просто ввести URL-адрес и перейти к ним.
Задача ещё не решена.
Других решений пока нет …