【问题标题】:Jquery ajax wont send POST variables to phpJquery ajax不会将POST变量发送到php
【发布时间】:2020-03-16 09:38:46
【问题描述】:

编辑:我现在明白,为了重定向,我需要使用 ajax,这取决于我从 php 获得的响应,这要归功于 ADyson。最佳答案,谢谢老兄,谢谢大家的帮助。

我一直在尝试在 PHP 上制作一个简单的登录表单,将 POST 请求变量发送到 PHP 并使用 MySQL 进行身份验证。我已经尝试了所有方法,例如配置 xampp,将 htaccess 文件放在同一个文件夹中,尝试了各种 ajax 语法,但它仍然无法正常工作。我把它做得很简单,所以我可以轻松调试。问题是成功函数正在触发,但未将帖子变量发送到位置标头不会转到 register.php。这是代码:

PHP

<?php
    require_once 'dbconnect.php';

    if (isset($_POST['nickname']) && !empty($_POST['nickname'])) {
        $nickname = $_POST['nickname'];
    }

    if (isset($_POST['password']) && !empty($_POST['password'])) {
        $password = $_POST['password'];
    }

    $sql = "SELECT nickname,password FROM users WHERE nickname = '$nickname' and password = '$password'";

    $result = mysqli_query($mysqli, $sql);
    $count = mysqli_num_rows($result);

    if ($count == 1) {

        header('location:register.php');

    } else {
        header("HTTP/1.1 500 Internal Server Error");
    }
?>

JS

$("#submitBtn").on("click",function(){
    $.ajax({
        type:"POST",
        url:"dologin.php", 
        data:{nickname:"alex",password:"123"},
        success:function(){
        alert("skata");
    }});
});

【问题讨论】:

  • 如果你想重定向用户,你为什么使用ajax而不是简单的表单提交?
  • “所以位置标头不会转到 register.php” - 即使您的 PHP 脚本 确实 发出了正确的位置标头,这也不会重定向您的前端 - 因为您正在发出后台请求。如果有的话,您必须将一些信息发送回 JS 部分,以便 that 可以决定在客户端的其他位置导航。
  • “post 变量没有被发送,因此位置标头不会转到 register.php”......正如 CBroe 所暗示的那样,这两件事是不相关的。您确定 POST 值真的没有被发送吗?你是如何验证的,究竟是什么?所有这部分都可以成功,但它仍然不会重定向您,因为您无法从 AJAX 请求重定向。事实上,AJAX 的全部意义 是允许您停留在同一页面上,而不需要重定向。如果要进行重定向,请使用普通形式的回发而不是 AJAX。
  • 警告:您的代码容易受到 SQL 注入攻击。您应该使用参数化查询和准备好的语句来帮助防止攻击者通过使用恶意输入值来破坏您的数据库。 bobby-tables.com 给出了风险解释,以及如何使用 PHP / mysqli 安全地编写查询的一些示例。 切勿将未经处理的数据直接插入您的 SQL 中。按照您现在编写代码的方式,有人可以轻松窃取、错误更改甚至删除您的数据。
  • @mike510a 情况并非如此,如果它是关键字或其他一些要求(例如空格),您只需要一个字符串作为名称(您为什么要这样做?)

标签: php jquery mysql ajax


【解决方案1】:

* 警告 *

在将此答案视为实现登录页面的好方法之前,您应该考虑一个事实,即您尚未实施任何方法来保护所述页面免受各种攻击,其中许多攻击将允许黑客和机器人使用 XSS 在您的数据库和/或网站的其他部分执行任意代码。

黑客所要做的就是将“密码”定义为修改数据库的 SQL 注入,您就有可能向黑客泄露整个数据库的内容。

另外,明文密码不是存储登录数据的好方法,而是使用密码哈希。

您还可以考虑使用 nonce 来防止 XSRF 攻击,并且某种暴力密码黑客/DoS 保护机制也是明智的。


话虽如此,这里有一种方法可以让您的密码表单发挥作用

您不能将重定向作为 ajax 请求的一部分,该请求可以与发出 ajax 调用的请求进行交互。这两种情况是不同的。

可以做的是从 PHP 脚本返回一个值,如下所示:

   <?php 
       require_once 'dbconnect.php';

    if(isset($_POST['nickname']) && !empty($_POST['nickname'])) { $nickname =  $_POST['nickname']; }

    if(isset($_POST['password']) && !empty($_POST['password'])) { $password = $_POST['password']; }

    $sql = "SELECT nickname,password FROM users WHERE nickname = '$nickname' and password = '$password'";

    $result = mysqli_query($mysqli,$sql); $count = mysqli_num_rows($result);

    if($count==1){
         print_r("true");
    } else{
        print_r("false");   
     } ?>

结合一种解析输出的方式

$("#submitBtn").on("click",function(){
    $.ajax({
        type:"POST",
        url:"dologin.php", 
        data:{nickname:"alex",password:"123"},
        success:function(result){
            if (result == "true") {
                window.location.href = "register.php";
            }

    }});
});

【讨论】:

    【解决方案2】:

    你可以做的是从 php 文件中获取数据

    success:function(data){ console.log(data); }

    还请检查查询是否准确地返回了一行?我也不知道你的 dbconnect.php 是否有效。

    【讨论】:

    • 由于 PHP 从不回显任何内容,这将没有用处。需要更多的改动。此外,您完全错过了有关重定向和 AJAX 的要点。这篇文章更像是调试建议,而不是问题的实际解决方案。一旦你有 50 声望,你就可以发布 cmets。在此之前,请勿使用 Answers 功能发布建议(而不是解决方案)。
    猜你喜欢
    • 1970-01-01
    • 2013-10-25
    • 2016-02-05
    • 2019-01-22
    • 2014-01-30
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多