【问题标题】:Json object returned from PHP with json_encode() , but then invalid json object in my javascript使用 json_encode() 从 PHP 返回的 Json 对象,但随后在我的 javascript 中无效的 json 对象
【发布时间】:2015-05-07 08:47:19
【问题描述】:

我将从 mySQL 表读取的简单关联数组回显到我的 jquery b.m.o json_encode($array) 方法。但是,我的 .ajax 调用在 jquery 中失败了,这似乎是由于该对象不是有效的 json 对象。我在 chrome 中进行了一些调试,并在网络选项卡下验证了响应预览-确实看起来是完美的 json 格式:

{"用户名":"DehanL","UserPassword":"admin","UserEmail":"dehan@rocketmail.com"}

这是我的 php:

<html>
<body>

<?php



$servername = "localhost";
$username = "root";
$password = "";
$dbName ="dbPodiumPro";

$inUsername = $_POST["name"];
$inPassword = $_POST["password"];


// Create connection
$conn = new mysqli($servername, $username, $password, $dbName);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

//Use the dbPodiumPro
mysqli_select_db($conn,"dbPodiumPro");


$sql = "SELECT * FROM users WHERE UserName='$inUsername' AND UserPassword ='$inPassword' ";

$result = mysqli_query($conn,$sql);

// Fetch one row
$row=mysqli_fetch_assoc($result);

//Check to see if the username and password combo exists
if(!empty($row['UserName']) AND !empty($row['UserPassword'])) 
    { 

    //$_SESSION['UserName'] = $row['UserPassword']; 
    //echo $_SESSION; 

    echo json_encode($row);

    } 

else { echo "Be gone imposter!"; }


$conn->close();


?>

</body>
</html>

然后是jquery:

$.ajax({
        type: 'POST', // define the type of HTTP verb we want to use (POST for our form)
        url: 'php/loginrequest.php', // the url where we want to POST
        data: formData, // our data object
        dataType: 'json' // what type of data do we expect back from the server

    })
    // using the done promise callback
    .done(function (data) {
        console.log("ajax done callback");
    })
    .fail(function (data) {
        console.log(data, "ajax failed callback");

        var IS_JSON = true;
        try {
            var json = $.parseJSON(data);
        } catch (err) {
            IS_JSON = false;
        }
        console.log(IS_JSON);
    });

【问题讨论】:

  • 你在服务器上使用Content-Type: application/json了吗?否则,即使文本格式正确,客户端也可能认为它不是有效的 JSON
  • 危险:你很容易受到SQL injection attacks的影响,你需要defend你自己。
  • 危险:“根本没有散列”是an unsuitable hashing algorithm;您需要take better care 的用户密码。
  • 您的代码可以注入 SQL,但这与您的问题无关。请注意,您可能会使用' OR 1 OR ''=' 或类似密码登录。还要对密码使用散列!
  • 您是否将密码编码为 md5 如果是,请检查此stackoverflow.com/a/30097151/2536812

标签: javascript php jquery json


【解决方案1】:

你的 PHP 是这样开始的:

<html>
<body>

此后无论它输出什么,它都不是有效的 JSON。

我在 chrome 中进行了一些调试,并在网络选项卡下验证了响应预览

查看原始预览。您似乎正在查看 呈现的 HTML 预览。

【讨论】:

  • 这确实是问题所在。错误地假设 php 需要包装在我看到的示例中的这些标签中。解决了。​​
【解决方案2】:

当您在 AJAX 中将 dataType 添加为 JSON 选项时,您不需要 parseJSON

ajax 完成后得到的data 已经是 JSON 格式了。

“json”:将响应评估为 JSON 并返回一个 JavaScript 对象。 JSON数据被严格解析;任何格式错误的 JSON 都会被拒绝并引发解析错误。从 jQuery 1.9 开始,空响应也会被拒绝;服务器应该返回 null 或 {} 的响应。 (有关正确的 JSON 格式的更多信息,请参阅 json.org。)

文档:http://api.jquery.com/jQuery.ajax/

fail 方法中的 data 不是您从服务器传递的。它是与请求相关的信息。

【讨论】:

  • Tushar,parseJSON 部分只是按照其他成员的建议检查 json 对象的有效性。所以是的@devnull69,问题是为什么当调试信息显示正确的响应时它会进入 .fail 。我听说过失败循环中的数据。 .done 中的数据将是我的 ajax 调用返回的数据,然后是 Tushar?
【解决方案3】:

如果您使用 MD5 等对密码进行编码,Json 不会编码您可以选择从您的数组中取消设置密码或定义您要从数据库中选择的列,不包括密码列。

【讨论】:

    【解决方案4】:

    把你的ajax改成

    $.ajax({
            type:"POST",
            url: 'php/loginrequest.php',
            data:$("#form_id").serialize(),
            dataType:"json",
            success: function(data)
            {
                alert(data.UserName);
            }
        });
    

    您可以同时使用data:formDatadata:$("#form_id").serialize(),

    如果您收到警报消息,则一切正常

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      相关资源
      最近更新 更多