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(); });
}

ただし、datajqXHR.responseTextは両方とも空の文字列です。test.php基本的なページに配置し、期待される文字列echoを画面に表示したため、PHP コードが機能していることはわかっています。

.done結果が関数に戻らないのはなぜですか?

4

2 に答える 2

1

非 AJAX Web ページ コンテンツと同様に、値を出力する必要があります。

(テキストや HTML ではなく) 構造化/型指定されたデータをクライアントに伝えたい場合は、おそらくJSONを使用する必要があります。PHP には、 PHP の値を JSON にシリアル化する便利なjson_encode関数が付属しています。

出力を行う方法は、フレームワークと、これを「ビュー」としてカウントする必要があるかどうかによって異なる場合がありますが、簡単な方法はecho、コントローラー メソッドから直接クライアントに渡したいものだけにすることです。

また、ネットワーク経由で JSON を送信していることをクライアントに知らせるために、Content-typeヘッダーをに設定する必要があります。application/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 に答える