【问题标题】:Convert ajax response array object to javascript array?将ajax响应数组对象转换为javascript数组?
【发布时间】:2014-06-09 21:33:44
【问题描述】:

我正在使用 ajax 在 Yii 中提交登录表单。这是我的ajax函数:

$("#login-form").submit(function() {

        var email = $("#email").val();
        var password = $("#password").val();

        $.ajax({
            url: "<?php echo Yii::app()->request->baseUrl; ?>/site/validatelogin",
            type: "post",
            data: "email=" + email + "&password=" + password,
            success: function(response) {
                if (response === "1") {
                    window.location.href = "<?php echo Yii::app()->getBaseUrl(true); ?>/dashboard";
                }
                else
                {
                    //Dispaly response errors above login form
                }
            },
            error: function() {
                alert("Could not perform the requested operation due to some error.");
                return false;

            }
        });

    });

我的 PHP 控制器函数是 validatelogin 如下:

 $email = $_POST['email'];
    $password = $_POST['password'];


    $model = new LoginForm();

    $model->email = $email;
    $model->password = $password;


    if ($model->validate() && $model->login()) {
        echo "1";
    } else {
        print_r($model->getErrors());
    }

如果用户输入正确的凭据,我会发送 1 作为对视图的响应,并将用户重定向到仪表板。

但是,如果用户输入了错误的凭据,则 ajax 响应中会收到不同的错误,具体取决于错误的类型。

我想通过循环在成功函数的其他部分中显示登录表单上方的这些错误。

但是当我在响应上运行循环时,该数组的长度非常大,例如,如果响应中的错误是“密码错误”,那么响应数组在错误消息中的长度为 18(字符数)。简而言之,响应数组是这样的:

array('I','n','c','o','r','r'....)

而不是

array([0]=>"Incorrect password")

如何转换后一种格式的响应数组并遍历每个索引以在登录表单上方向用户显示错误消息?

【问题讨论】:

  • 一个字符串只是一个字符数组。我希望您正在迭代一个字符串。请 console.log(response);并使用结果编辑问题,并在登录表单上方显示 //Dispaly 响应错误的代码

标签: javascript php ajax arrays yii


【解决方案1】:

将其编码为JSON

在你的 php 中:

echo json_encode($model->getErrors());

在你的 js 中(在 else 中):

var errors = $.parseJSON(response);

编辑:

在您的情况下,最好始终返回 JSON。

你的 JS 可以改成:

var jqxhr = $.post("<?php echo Yii::app()->request->baseUrl; ?>/site/validatelogin", {
    email: email,
    password: password
}, 'json');
jqxhr.done(function(response) {
    if (response.valid) {
        window.location.href = "<?php echo Yii::app()->getBaseUrl(true); ?>/dashboard";
    } else {
        if (response.errors) {
            ...
        }
    }
});
jqxhr.error(function(response) {
    alert("Could not perform the requested operation due to some error.");
});

你的 PHP:

$response = array('valid' => false);
if ($model->validate() && $model->login()) {
    $response['valid'] = true;
} else {
    $response['errors'] = $model->getErrors();
}
header('Content-type: application/json');
echo json_encode($response);

【讨论】:

  • 如果你设置了正确的 json 头,就不需要使用 parseJSON。最好总是发送 json,而不仅仅是错误。例如,echo json_encode(array('success'=&gt;false, 'errors'=&gt;$model-&gt;getErrors()); 表示失败,echo json_encode(array('success'=&gt;true, 'errors'=&gt;''); 表示成功
  • 是的,我同意在这种情况下最好总是返回 JSON。这需要您提供正确的dataType
  • 感谢您的所有回复。我认为当我回到办公室的代码时它会解决问题。谢谢!
【解决方案2】:

除了@sroes 的回答,使用 Yii library for JSON

echo CJSON::encode($response);

而不是

echo json_encode($response);

为什么?

Why use CJSON encode when we have json_encode

【讨论】:

    猜你喜欢
    • 2019-10-22
    • 2021-01-07
    • 1970-01-01
    • 2022-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    相关资源
    最近更新 更多