我有一个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(); });
}
但是,data
和jqXHR.responseText
都是空字符串。我知道PHP代码正在运行,因为我把它放在一个基本的test.php
页面中,并将预期的字符串echo
编辑到屏幕上。
为什么结果不能回到.done
函数?
答案 0 :(得分:1)
您需要输出该值,就像非AJAX网页内容一样。
如果您想将结构化/类型化数据传达给客户端(而不是某些文本或HTML),您应该使用JSON 。 PHP附带了一个方便的json_encode
function来将PHP值序列化为JSON。
输出的方式可能会有所不同,具体取决于您的框架以及您是否认为这应该算作“视图”,但一种简单的方法就是只需echo
您希望传递给客户端的内容从控制器方法开始。
您还应该将Content-type
header设置为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);
}
答案 1 :(得分:0)
尝试添加选项“dataType:'string'”,默认情况下,$ .ajax尝试猜测响应的内容,也许这次错了。
但是,正如Matt Kantor所建议的那样,最佳做法是使用JSON或XML等结构化协议对响应进行编码。