繁体   English   中英

承诺返回得到500个内部服务器错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM