0

我正在尝试创建一个非常简单的登录表单,使用 AJAX 进行服务器通信,并将 PHP 作为服务器端脚本。作为一个起点,我只是试图通过 JSON 将登录数据发送到服务器,但它已经给我带来了问题。

问题是,当我在 AJAX 中使用 POST 请求发送数据时,我的服务器似乎没有得到任何东西并且根本没有返回任何数据。这是请求的 HTML:

<!DOCTYPE HTML>
<html>
<head>
<title> Login experiment </title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script>

$(document).ready(function AjaxJSON() {
    $("form#loginForm").submit(function() {
        var username = $('#username').val();
        var password = $('#password').val();
        var jsonlogin = "{\"username\" : \"" + username + "\" , \"password\" : \"" + password + "\"}";
        var str = 'json=' + jsonlogin;
        $.ajax({
            type: 'POST',
            url: 'login.php',
            // URL of my PHP script
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            data: str,
            success: function(data) {
                alert("Data received!" + data);
            }
        });
        // ajax
        })
    })

</script>
</head>

<body>
<h1> LOGIN: </h1>
<form id="loginForm" name="loginForm" method="post" action="">
<input type="text" id="username" name="username"> USERNAME <br>
<input type="password" id="password" name="password"> PASSWORD <br>
<input type="submit" class="button positive">
</form>
</body>
</html>

此 HTML 代码应简单地将 JSON 字符串编码的请求表单(用户名+密码)发送到 PHP 脚本。脚本是这样的:

<?php
$result = json_decode($_POST['json']);
echo $result->username;
echo " ";
echo $result->password;
?>

为什么它不显示任何回复?预先感谢您的帮助 :)

4

1 回答 1

0

您的主要问题是您声称您正在发送application/json; charset=utf-8. 这是一个问题,原因有两个:

  1. PHP 没有任何内置方法来处理 JSON 编码的 POST 数据,因此$_POST不会被填充
  2. 您的数据不是 JSON。它是(不正确转义的)application/x-www-form-urlencoded数据(其中包括一串(不正确转义的)JSON 作为其数据片段之一)

如果要发送 JSON,则:

  • JSON.stringfy使用不通过将字符串混合在一起来构建它
  • 不要粘json=在它的前面
  • 根据此问题从 POST 正文中获取数据

如果您不依赖 JSON,那么只需使用标准方法对表单数据进行编码:

  • 忘记jsonlogin线
  • 不要覆盖默认值contentType
  • 将数据对象传递给 data 参数:data: { username: username, password: password }

您的下一个问题是您在说dataType: 'json'但您的 PHP 正在返回(无效)HTML(PHP 也容易受到 XSS 攻击)。

于 2013-08-31T21:43:51.603 回答