![](/img/trans.png)
[英]Uncaught (in promise) 500 (Internal Server Error) BadMethodCallException
[英]Promise returning get 500 internal server error
我制作了一個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文件加載后,如何重定向到“ /”頁面,我如何才能履行承諾?
我只是發現了煩惱,並使用了它們。 這是我在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變量(如果已設置),然后取消會話設置以及其工作方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.