我正试图使我的注册表单在与注册表单相同的页面上显示一条消息,即如果用户名是在提交表单后使用的,则会使用该用户名。
我制作了一个注册表单,将输入内容发布到文件add-user.php中。在我的add-user.php文件中,我有两个功能。 -> nameTaken函数检查数据库中是否已存在用户名,如果未使用名称,则-> insert将名称插入数据库中。只能通过发布请求访问该文件,否则我将收到500个服务器错误以及该错误值为空的错误,请参见下面的路由。
这是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调用为null。在此处将用户名/密码输入到注册表中时,我仅看到有关如何执行此操作的问题,但是我想在提交注册表后显示消息。我该怎么办?
我的承诺ajax请求到php post文件:
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并转到它们。
我在许多注册了网站的网站上看到此信息,提交表格,然后重新加载页面以显示密码/用户名是否被使用或输入不正确,如果有人可以向我显示链接或将我引导至任何地方,我将不胜感激通常是如何完成的。我在youtube https://www.youtube.com/watch?v=DXIIWVR1PLk上找到了此链接,但是在视频中,该用户路由链接可以直接在url中使用get请求进行访问。只能通过发布请求访问用于处理是否使用用户名的页面,然后在没有其他发布请求的情况下将其从访问权限中删除,我无法获取它,否则会收到500服务器错误,而其他null可变错误。和其他例子一样,我刚刚看到了如何在用户输入密码/用户名时显示错误消息,而不是在我想要的表单提交之后。
对此我将不胜感激。
答案 0 :(得分:0)
修改您当前的php并添加此else语句。
if(!$app['database']->nameTaken($_POST['username'])){
$app['database']->insert('users', [
'name' => $_POST['username'],
'password' => $hash
]);
} else {
$_SESSION["error_msg"] = "That Username belongs to someone else."
}
在您的html的某处粘贴此内容。
<?php if (array_key_exists("error_msg", $_SESSION)){
echo $_SESSION["error_msg"];
}