php - 我怎样才能使这个 AJAX/PHP 工作?

标签 php javascript html ajax

所以我是 AJAX 的新手(不是 PHP 的新手),我正在尝试使用 AJAX 创建登录以查询 PHP 文件。所以,这是我要使用的代码。

我有三个文件。第一个是 login_form.php。它包含登录表单...

<html>
    <head>
        <title>Log In</title>
        <script language="javascript" src="loginsender.js" />
    </head>
    <body>
        <form method="post" name="loginfrm" onsubmit="formValidator()">
            <p id="hint"></p>
            <label for="username">Username:</label><input type="text" name="username" id="username" />
            <label for="password">Password:</label><input type="password" name="password" id="password" />
            <input type="submit" name="submit" value="Log In" />
        </form>
    </body>
</html>

下一个loginsender.js。这是我用来发送到 PHP 脚本的 JavaScript/AJAX 文件...

function formValidator()
{
    if (document.loginfrm.username.value.length < 3 || loginfrm.password.value.length < 3)
    {
        msg = "Please enter a valid username/password."
        document.getElementById("hint").innerHTML=msg;
    }
    else
    {
        if (window.XMLHttpRequest)
        {
            xmlhttp = new XMLHttpRequest();
        }
        else
        {
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }

        xmlhttp.onreadystatechange = function()
        {
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
            {
                document.getElementById("hint").innerHTML = xmlhttp.responseText;
            }
        }
    }

    var params = "username=" + document.loginfrm.username.value + "&password=" + document.loginfrm.password.value;
    xmlhttp.open("post", "login.php", true);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlhttp.setRequestHeader("Content-length", params.length);
    xmlhttp.setRequestHeader("Connection", "close");
    xmlhttp.send(params);
}

最后一个是 login.php,这是我用来处理实际登录的...

<?php
session_start();

require_once("includes/mysql.inc.php");
require_once("includes/functions.inc.php");

$username = sanitize($_POST['username'], true);
$password = sanitize($_POST['password'], true);

$query = "SELECT * FROM users WHERE username = '$username'";
$result = mysql_query($query);
if (mysql_num_rows($result) != 1) // no such user exists
{
    echo 'Sorry, no such user exists';
    logout();
    die();
}
$userData = mysql_fetch_assoc($result);
$hash = hash('sha256', $userData['salt'] . hash('sha256', $password));

if ($hash == $userData['password'] && $username == $userData['username']) // successful log in
{
    validateUser($userData['username']); // set session data
    echo '<meta http-equiv="refresh" content="2; url=index.php" />';
}
else
{
    echo 'Sorry, but you entered an incorrect username/password.';
    logout();
    die();
}

?>

总而言之,目标是让用户在 login_form.php 中输入他们的用户名和密码组合并提交,触发 loginsender.js(和 formValidator() 方法)。然后这将查询 PHP 登录脚本,该脚本将测试有效的用户/密码组合,然后在 session 中设置它(如果登录失败,则不设置)。问题是,无论我输入什么组合,都没有任何反应,页面会在点击提交时刷新,但仅此而已。

**更新 1: 我已经编辑了我的 login_form 页面,我只是将 formValidator 函数放入脚本开始,这样我更容易查看而不是在文档之间切换。

我还实现了一些提出的建议。

这里是:

<html>
    <head>
        <title>Log In</title>
        <script type="text/javascript" language="javascript">
        function formValidator()
        {
            if (document.loginfrm.username.value.length < 3 || loginfrm.password.value.length < 3)
            {
                msg = "Please enter a valid username/password."
                document.getElementById("hint").innerHTML=msg;
            }
            else
            {
                if (window.XMLHttpRequest)
                {
                    xmlhttp = new XMLHttpRequest();
                }
                else
                {
                    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
                }

                xmlhttp.onreadystatechange = function()
                {
                    if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
                    {
                        document.getElementById("hint").innerHTML = xmlhttp.responseText;
                    }
                }
            }

            var params = "username=" + document.loginfrm.username.value + "&password=" + document.loginfrm.password.value;
            xmlhttp.open("post", "login.php", true);
            xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            xmlhttp.setRequestHeader("Content-length", params.length);
            xmlhttp.setRequestHeader("Connection", "close");
            xmlhttp.send(params);
        }
        </script>
    </head>
    <body>
        <p id="hint"></p>
        <form method="post" name="loginfrm" onsubmit="formValidator(); return false;">
            <label for="username">Username:</label><input type="text" name="username" id="username" />
            <label for="password">Password:</label><input type="password" name="password" id="password" />
            <input type="submit" name="submit" value="Log In" />
        </form>
    </body>
</html>

最佳答案

看起来您并没有阻止默认的“提交”操作发生,因为您还没有为表单定义 action 只是 POST 回当前页面.

将您的表单 html 行更改为:

<form method="post" name="loginfrm" onsubmit="formValidator(); return false;">

return false; 告诉它不要为那个 Action 做任何它打算做的事情。

关于php - 我怎样才能使这个 AJAX/PHP 工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7593744/

相关文章:

javascript - 使用javascript保存div内容的HTML按钮

java - 在 JQuery 中使用 ajax 方法 .get() 和 .post() 来添加到购物车

PHP foreach 行作为 $var,行名和行号重复

php - 如何修复 Zend 中的 "Cannot send headers; headers already sent"?

Javascript、Lodash、Underscore 改变数组的值

javascript - 类似于 Wufoo 的 Web 界面(可拖动元素、记住状态)

html - 图片 srcset 和同位素网格在单击时更改图像宽度而不是视口(viewport)

php - 在单个语句中多次调用存储过程时出现错误 1064

php - 如何在 codeigniter 日历中显示事件文本?

javascript - 对象的属性在放入本地存储时不会修改元素的值