1

我有一个 PHP 函数服务器端,如下所示:

function isHandleAvailable($displayname) {
    $res = user::getRow(
        "SELECT `id` FROM `users` WHERE `displayname` = :displayname",
        array(':displayname' => $displayname)
    );
    if ($res) {
        $res = 'Got a row!';
    } else {
        $res = 'No row :(';
    }

    echo $res;
}

它用于确定网站上是否已使用显示名称。此函数由以下 JavaScript 调用:

function checkHandleAvailability(displayName, callback) {
    $.ajax({
        type: 'POST',
        url: '/users/isHandleAvailable',
        data: { displayname: displayName }
    })
        .done(function(data, textStatus, jqXHR) {
            isHandleAvailable = data;
        })
        .fail(function() {
            isHandleAvailable = false;
        })
        .always(function() { callback(); });
}

但是,dataandjqXHR.responseText都是空字符串。我知道 PHP 代码正在工作,因为我将它放入基本test.php页面并将预期的字符串echo编辑到屏幕上。

为什么结果没有返回到.done函数中?

4

2 回答 2

1

您需要输出该值,就像非 AJAX 网页内容一样。

如果您想将结构化/类型化的数据传达给客户端(而不是一些文本或 HTML),您可能应该使用JSON。PHP 带有一个方便的json_encode函数来将 PHP 值序列化为 JSON。

执行输出的方式可能会有所不同,具体取决于您的框架以及您是否认为这应该算作“视图”,但一种简单的方法是echo直接从控制器方法将您想要传递给客户端的内容。

您还应该将Content-type标头设置application/json为让客户端知道您正在通过网络发送 JSON。同样,你应该在哪里/如何做的细节取决于你的框架和架构偏好。简单但可能不太易于维护的方法是在控制器方法中设置标题。

所以,把所有这些放在一起,试试这个:

function isHandleAvailable($displayname) {
    $handleIsAvailable = user::getRow(
        "SELECT `id` FROM `users` WHERE `displayname` = :displayname",
        array(':displayname' => $displayname)
    ) == null;

    // This has to happen before any output.
    header('Content-type: application/json');

    echo json_encode($handleIsAvailable);
}
于 2013-05-04T03:31:34.597 回答
0

尝试添加选项“dataType: 'string'”,默认 $.ajax 尝试猜测响应的内容,也许这次是错误的。

但是,正如 Matt Kantor 所建议的,最佳实践是使用 JSON 或 XML 等结构化协议对您的响应进行编码。

于 2013-05-04T08:10:41.903 回答