0

質問

AJAX によって要求されたページによって呼び出される PHP コールバックを使用して、AJAX 経由で渡される PHP コールバックを実装するにはどうすればよいですか?

セットアップ

コメントは AJAX 経由で投稿され、パラメーターはシリアル化されて暗号化されて渡されます (そのため、転送中に変更したり、コメント システムを悪用するために慎重に作成された AJAX 要求を作成したりすることはできません)。問題は、コメント自体とは異なる mysql テーブル (コメントが使用されるすべての場所で変更される) のフィールドを更新するために、新しい総コメント量が必要なことです。

誰かがフォーラム トピックにコメントを残した場合、そのトピックはコメントの総数を知る必要があります (これを知る必要があるたびにコメント テーブルをクエリする必要はありません)。問題は、コメントが AJAX 経由で投稿された場​​合、テーブルが何を更新するのか、どのフィールドが更新されるのかなどがわからず、追加のコードを実行する必要があることです (コメントを残したすべてのメンバーのログも記録するなど)。特定のトピックについて)。

解決

コメント ウィジェットを宣言するときに、クロージャを使用して 2 つの PHP コールバックを追加することを考えました。これらの 2 つのコールバック (onSuccess() onFailure()) は、コメントの総数を数えたり、特定のフォーラム トピックのコメントの総数を更新したりするなど、必要なすべての作業を行うことができます。次に、シリアル化して暗号化し、ajax を介してパラメーターとして渡し、次に PHP でコールバックを復号化およびシリアル化解除して実行します。

ソリューションが壊れる理由

クロージャーはシリアライズできないからです!また、誰かが提案する前に、私は eval を使用していません。

再び質問

AJAX によって要求されたページによって呼び出される PHP コールバックを使用して、AJAX 経由で渡される PHP コールバックを実装するにはどうすればよいですか?

アップデート

一部の人は、質問全体を読んでおらず、コールバックが PHP で行われるべきであることを理解していないようです - javascript (AJAX コールバックを使用) ではありません。AJAX は、投稿されたコメントを転送するためだけに使用されます。処理は行われません (これが PHP の機能であり、問​​題となるコールバックが発生する場所です)。

4

4 に答える 4

1

コールバックである関数を作成し、ajax を介して関数名を渡し、次のように呼び出します。

$callback = 'callback_function_name'; $callback($params...);
于 2012-10-31T13:41:43.710 に答える
0

あなたが何をしようとしているのか理解できないかもしれませんが、次のようなことをしていただけませんか。

window.myappstuff={}

window.myappstuff.onSuccess=function(){
   //Do some stuff here.
}

window.myappstuff.onFailure=function(){
   //Do some different stuff here.
}

次に、php コールバックでwindow.myappstuff.onSuccessorを呼び出すことができますwindow.myappstuff.onFailure。代わりにランダムな関数名を使用することもできます。

于 2012-10-31T13:43:39.953 に答える
0

コールバックを渡す代わりに、サーバー上で事前に関数を作成し、実行する関数の名前と、それを渡す引数のリストを渡します。


また、使い始める場所はここですangular.js。このようにして、クライアント側で更新forum topicするフィールドを持つ のクライアント側モデルがposts_count作成され、angluar のバインディングは、このモデルからのデータを使用するたびにビューを更新します。

于 2012-11-21T11:50:02.717 に答える
0

全体として、再考をお勧めします。セキュリティ上の理由から、リモートでコードのようなものを ajax 経由で送信することは、悪い習慣と見なされています。たとえば、firebug などを使用して応答を「傍受」し、コードを変更することができます。
関数名と引数を送っていただければ、変更できます。スクリプトがユーザー入力を検証すると仮定すると、ajax 呼び出しが存在しない関数を返すようにすることができます。スクリプトは失敗し、すべての形式の入力検証がなくなります。
完全な関数定義を文字列として送信すると、さらに先に進むことができます。

人々が次のようなことをしているのを見たことがあるかもしれません:

echo 'function(argument){ console.log(argument);}("something"));';

これはプレーンテキストであり、JSON ではありません。次に、JS で、人道に対する罪と見なされるべきことを行います。

//readystatechange callback:
if (this.readyState === 4 && this.status === 200)
{
    return eval(this.responseText);//<=== EVIL - EVIL - EVIL
}

これは非常識です。悪です。これを見てもいけません。ある種
の簡単な修正としてできることは、汎用onreadystatechange関数を作成することです。

//readystatechange
if (this.readyState === 4 && this.status === 200)
{
    var returnObj = JSON.parse(this.responseText);
    switch(returnObj.actionType)
    {
        case 'DomAction':
            return domSwitch(returnObject.data);//<-- based on data domSwitch will decide what to do
        case 'setVar':
            return varSwitch(returnObjcet.data);
        default:
            return educatedGuess(returnObject);//<-- desperate
    }
}

しかし、繰り返しになりますが、リクエストを送信する場合、通常、返されるデータの種類とそのデータで何をしたいかについて一定の期待があるためreadystatechange、各 ajax リクエストに対してその場でハンドラーを作成できます。その特定の呼び出しに対処します。

于 2012-10-31T14:00:12.493 に答える