我制作了一个PHP函数,该函数在提交表单后回显JSON,我想与一个Promise请求进行交互。我不断收到500个内部服务器错误,我也不知道为什么。
这是我的文件-这是registerFail.js,应该在提交表单后获取JSON,以便我可以提醒消息,它位于主目录中:
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/add-user.php').then((name) => {
console.log(name);
});
});
}
这是我的控制器php类,位于目录/controllers/add-user.php中,这是registerFail.js中的promise应该从中获取json的地方
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
]);
};
header('Location: /');
-> nameTaken函数是JSON的回显。
这是位于不同目录和文件中的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
return false;
}
}
在我的服务器上,我收到以下消息:
[Thu Aug 16 12:16:18 2018] 127.0.0.1:44906 [200]: /
[Thu Aug 16 12:16:18 2018] 127.0.0.1:44910 [200]: /registerFail.js
[Thu Aug 16 12:16:22 2018] PHP Notice: Undefined index: password in /home/orpheus/Practice_dev/imagePoster/controllers/add-user.php on line 5
[Thu Aug 16 12:16:22 2018] PHP Notice: Undefined variable: app in /home/orpheus/Practice_dev/imagePoster/controllers/add-user.php on line 7
[Thu Aug 16 12:16:22 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 12:16:22 2018] 127.0.0.1:44996 [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 12:16:22 2018] 127.0.0.1:45000 [200]: /users
看来我的诺言正在执行,并试图在php文件加载之前获取json,所以没有json,并且我得到这些错误的未定义变量。我在加载/ users(/controllers/add-user.php)php json文件之前一瞬间看到了500错误,并在服务器中看到了上面所有的错误,但是当php文件从表单,它们都可以正常工作,并且我可以看到正确的json,但是当我重定向回“ /”主文件时,将清除控制台,而我的承诺也不会console.log json。
所以我认为我的问题是,单击我的提交按钮后,promise会立即执行,但是我需要在php json文件加载后执行,所以我不会在控制台中看到500服务器错误,并且上面显示的来自我的终端的服务器错误。
如何在加载php文件并将我重定向回“ /”页面后履行承诺?
答案 0 :(得分:0)
我刚刚发现了烦恼,并使用了它们。这是我在add-user.php
中的代码<?php
session_start();
$hash = password_hash($_POST['password'], PASSWORD_BCRYPT);
if(!$app['database']->nameTaken($_POST['username'])){
$app['database']->insert('users', [
'name' => $_POST['username'],
'password' => $hash
]);
} else {
$_SESSION['error'] = 'Username is taken';
}
header("location:/");
然后,我将会话设为表单形式的页面的控制器类中的变量
session_start();
$error = $_SESSION['error'];
,然后我在表单页面中创建了一个if语句,以显示$ error变量(如果已设置),然后取消设置会话并按照我的期望进行工作。