使用触发 javascript 验证的 POST 表单和 AJAX 登录到 PHP 文件。无法将数据存储到 PHP

Posted

技术标签:

【中文标题】使用触发 javascript 验证的 POST 表单和 AJAX 登录到 PHP 文件。无法将数据存储到 PHP【英文标题】:Login with POST Form, which trigger a javascript validation, and AJAX to a PHP file. Trouble storing data to PHP 【发布时间】:2017-02-17 03:05:37 【问题描述】:

简介

我现在陷入了 AJAX 的一部分,因为我现在知道如何从 AJAX 部分中提取数据并放入 php 变量中,以便以后可以访问它并使用它。它也不会将我重定向到另一个页面(“Map.php”)。

我尝试在网上寻找答案,但无济于事。请有经验的人帮忙。另外,我不确定我的做法是否正确,请让我知道我做错了什么。

详细介绍

我想做一个“Login.php”,它将使用一个表单来获取用户的电子邮件和密码。表单上将有一个“登录”按钮,该按钮将触发 javascript 以进行验证。

验证后,我将使用 AJAX 调用另一个名为“Auth.php”的 php 文件,该文件将与 mysql 数据库建立连接,以搜索该特定用户验证用户。

“Auth.php”然后将返回用户详细信息的 json 数据,我打算在“Login.php”页面中使用该数据,并与 $_SESSION[] 开始会话> php 的变量。我还希望页面在成功登录后将用户重定向到另一个页面(“Map.php”)。

以下是我在“Login.php”和“Auth.php”中的部分代码。

Login.php

<form name="myForm" action="Map.php" method="post" onsubmit="return validateForm()">
    <fieldset>
        <div class="form-group">
            <input class="form-control" placeholder="E-mail" name="email" type="email" autofocus value="<?php echo isset($_POST["email"])? $_POST["email"]: ""; ?>">
        </div>
        <div class="form-group">
            <input class="form-control" placeholder="Password" name="password" type="password" value="<?php echo isset($_POST["password"])? $_POST["password"]: ""; ?>">
        </div>
        <input type="submit" value="Login" class="btn btn-lg btn-success btn-block"/>
    </fieldset>
</form>

<script>
function validateForm() 
    //event.preventDefault();
    var email = document.forms["myForm"]["email"].value;
    var password = document.forms["myForm"]["password"].value;
    var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]1,3\.[0-9]1,3\.[0-9]1,3\.[0-9]1,3])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]2,))$/;

    if (email == null || email == "") 
        alert("Email must be filled.");
        return false;
    

    if (password == null || password == "") 
        alert("Password must be filled.");
        return false;
    

    if(re.test(email)) 
        var data = 
            "email": email,
            "password": password
        ;
        data = $(this).serialize() + "&" + $.param(data);
        $.ajax(
            type: "GET",
            dataType: "json",
            url: "auth.php", 
            data: data,
            success: function(data) 
                alert("You have successfully logged in!");
                // TODO store user details in session
                return true; // return true to form, so will proceed to "Map.php"
            
        );
        return false;
    
    else 
        alert("You have entered an invalid email address!");
        return false;
    
    return false;

</script>

Auth.php

$connection = mysqli_connect("localhost", "root", "", "bluesky");

// Test if connection succeeded
if(mysqli_connect_errno()) 
    die("Database connection failed: " . mysqli_connect_error() . " (" . mysqli_connect_errno() . ") " . 
    "<br>Please retry your last action. Please retry your last action. " . 
    "<br>If problem persist, please follow strictly to the instruction manual and restart the system.");


$valid=true;

if (isset($_GET['email']) && isset($_GET['password'])) 
    $email = addslashes($_GET['email']);
    $password = addslashes($_GET['password']);
 else 
    $valid = false;
    $arr=array('success'=>0,'message'=>"No username or password!");
    echo json_encode($arr);


if($valid == true)
    $query = "SELECT * FROM user WHERE email='$email' and password='$password'";
    $result = mysqli_query($connection, $query);
    if(mysqli_num_rows($result) == 1)
        $row = mysqli_fetch_assoc($result);
        $arr=array('success'=>1,'type'=>$row['type'],'user_id'=>$row['id'],'email'=>$row['email'],'name'=>$row['name'],'phone'=>$row['phone'],'notification'=>$row['notification']);
        echo json_encode($arr);
    else
        $arr=array('success'=>0,'message'=>"Login failed");
        echo json_encode($arr);
    


// close the connection that was established with MySQL for the SQL Query
mysqli_close($connection);

【问题讨论】:

为了验证,有几个插件.. 要在任何页面上使用会话,您必须通过session_start() 启动会话。 您可以使用javascript调用“map.php”,成功返回ajax。可以写在成功部分的alert语句之后。 @SonuBamniya 是的,我知道启动会话,但我的主要问题是不知道如何将数据从 ajax 传递到 php。 还要将 AJAX 调用的类型从 GET 更改为 POST,因为您正尝试将电子邮件和密码发送到 auth.php @AmitJha 这意味着我现在必须使用“发布表单”,所以我只有在 javascript 中验证后才会重定向? 【参考方案1】:

你的 ajax 调用应该是这样的:

data = $(this).serialize() + "&" + $.param(data)
$.post('auth.php', data, function(response)
  console.log(response);
);

您必须使用 post 方法,因为您正在获取密码和电子邮件,所以这不是一个好习惯。为了验证,有许多jQuery 插件。

【讨论】:

谢谢。这为我减少了很多代码行。但是,如何访问 php 中的数据?特别是,我想使用代码“json_decode($json); 这只是 ajax 调用的不同语法,并建议使用 post 来保证安全性,虽然是个好主意,但两者都没有尝试回答实际问题

以上是关于使用触发 javascript 验证的 POST 表单和 AJAX 登录到 PHP 文件。无法将数据存储到 PHP的主要内容,如果未能解决你的问题,请参考以下文章

使用 Javascript 发出 HTTP POST 身份验证基本请求

如何设置可以通过 JavaScript onclick 事件触发的 PHP Curl POST 请求?

如何从 JavaScript 触发 ASP.NET Core 客户端验证

javascript LRM ::触发操作用户登录/注册后(未经验证)

触发动作表单提交JavaScript的HTML

从 jQuery 或 vanilla javascript 事件触发合成 ExtJS 事件