【问题标题】:Json returns undifinedJson 返回未定义
【发布时间】:2017-10-05 23:51:58
【问题描述】:

大家好,我有以下登录页面。我从我的视图页面使用 ajax 访问它。当我尝试在 ajax 上显示时返回的数据的问题我在控制台上收到错误。

login.js:35 Uncaught TypeError: Cannot read property 'success' of 不明确的 在 Object.success (login.js:35) 在我 (jquery-2.2.0.min.js:2) 在 Object.fireWith [as resolveWith] (jquery-2.2.0.min.js:2) 在 z (jquery-2.2.0.min.js:4) 在 XMLHttpRequest。 (jquery-2.2.0.min.js:4)

<?php
ob_start();

function __autoload($classname)
{

    require_once("../../database/$classname.php");
}


class userlogin extends database
{

    private $errors = array();
    private $message = array();
    private $redirect = array();
    private $data = array();
    private $username;
    private $password;

    function login()
    {

        if (empty($_POST['username']) || empty($_POST['password'])) {

            $this->message['error'] = "Please enter username and password";
        } else {

            $this->username = $_POST['username'];
            $this->password = $_POST['password'];


            try {
                $this->stmt = $this->dbh->prepare("SELECT adminID,adminEmail,adminPassword,admintype FROM admin where adminEmail = ? ");

                $this->stmt->execute(array(
                    $this->username
                ));

                $this->results = $this->stmt->fetchall();

                if (count($this->results) > 0) {
                    foreach ($this->results as $key => $row) {
                        if (password_verify($this->password, $row['adminPassword'])) {
                            $_SESSION['user']  = $row['adminID'];
                            $_SESSION['email'] = $this->username;
                            $_SESSION['usertype'] = $row['admintype'];

                            switch ($row['admintype']) {
                                case 's':
                                    $this->redirect['redirect'] = "seo/index.php?route=home";
                                    break;
                                case 'a':
                                    $this->redirect['redirect'] = "admin/index.php?route=home";
                                    break;
                            }

                            $this->message['success'] = "ok";

                        } else {

                            $this->message['error'] = "Username and password does not match";
                        }

                    }

                } else {

                    $this->message['error'] = "Username does not exist";
                }

            }
            catch (PDOException $pdo) {

                $this->error = $pdo->getMessage();

                error_log($this->error);
            }

            $this->data['message']  = $this->message;
            $this->data['redirects'] = $this->redirect;

            ob_end_clean();

            echo json_encode($this->data);

        }  

    }


}

if ($_SERVER['REQUEST_METHOD'] == "POST") {

    $login = new userlogin();
    $login->login();
}
?>

还有我的 js

function proccessLogin(){

        var username = $('input[type="email"][name="email"]').val();
        var password = $('input[type="password"][name="upass"]').val();
        $.ajax({

            type : "POST",
            data : {username:username,password:password},
            url  : "controller/login.php",
            beforeSend : function(){
            $('button').html('Checking...');

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

                 if(data.message.success == "ok"){
                    $('#results').removeClass('error');
                    $('#results').addClass('success');
                    $('#results').html('login Success, loading user data..');
                    $('button').html('Loading Profile.. i class="fa fa-spinner fa-pulse fa-1x fa-fw"></i>');
                        var redirectUrl = JSON.stringify(data.redirects);
                        redirectUrl = redirectUrl.replace(/[{"":}]/g, '');
                        var url = redirectUrl.replace('redirect','');
                        setTimeout(' window.location.href = "'+ url + '"; ', 6000);
                }else{

                    $('button').html("Sign in");
                    $('#results').removeClass('success');
                    $('#results').addClass('error');
                    $('#results').html(data.message.error);
                }
            },
            error : function(xhr){

                console.log('Error : ' + xhr);
            }
        });
    return false;   
    }

控制台日志结果:

{"message":{"success":"ok"},"redirects":{"redirect":"seo\/index.php?route=home"}}

如果成功,我希望能够显示来自 json 数组的消息,我将显示客户消息,否则显示来自响应的内容。问题是属性未定义。

第 35 行:

if(data.message.success == "ok"){

【问题讨论】:

  • 您的错误消息表明错误位于第 35 行。这与您发布的代码不匹配。 login.js 中的内容是否比您显示的更多?如果是这样,要么显示它(如果它是相关的)或者特别指出你的代码中的哪一行是第 35 行。
  • @PatrickQ 第 35 行:if(data.message.success == "ok"){
  • jQuery/Javascript 应该足够聪明,知道响应是 json,但以防万一遇到问题,请尝试在 ajax 设置中添加 dataType: "json",跨度>
  • @PatrickQ 也添加了:encode : true

标签: php json ajax


【解决方案1】:

我认为响应数据是字符串,你需要调用

$.parseJSON(data);

在您可以访问消息之前,然后成功

=============

如果您想使用 dataType: "json",您需要使用 PHP 的 header() 函数将 JSON 发送为 JSON:

/* Send as JSON */
header("Content-Type: application/json", true);

/* Return JSON */
echo json_encode($json);

/* Stop Execution */
exit;

【讨论】:

  • 我使用了数据类型并且还在 ajax 上添加了 encode : true 。无需在 php 中设置标题,它可以工作
猜你喜欢
  • 2016-09-20
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多