提交表单发布表单后,如果只能通过发布访问文件,如何将消息发送到html / javascript?发布请求

时间:2018-08-16 23:59:06

标签: javascript php ajax forms post

我正试图使我的注册表单在与注册表单相同的页面上显示一条消息,即如果用户名是在提交表单后使用的,则会使用该用户名。

我制作了一个注册表单,将输入内容发布到文件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可变错误。和其他例子一样,我刚刚看到了如何在用户输入密码/用户名时显示错误消息,而不是在我想要的表单提交之后。

对此我将不胜感激。

1 个答案:

答案 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"];
}