1

CakePHPでグーグルグループが答えを得られなかったので、ここでこの質問をします。私は次のパイプラインを持っています:CakePHPベースのアプリケーションがあります。それはsave_resultsと呼ばれるアクションを持つコントローラーを持っています。アクションは3つの引数を受け入れるメソッドであるため、次のようになります。

function save_results($data,$rawdataset,$status){

 ///stub///
   return "all the data received";
}

CakePHPアプリのほかに、AMF形式を使用してFlashアプリケーションと通信するために使用するWebOrb(PHP)があります。FlashアプリケーションはデータをWebOrbサービスに送信し、WebOrbサービスは上記のCakeで説明したアクションに送信します。Flashアプリから受信します。私がケーキメソッド(save_results)に渡すパラメータに一致する3つのオブジェクト:オブジェクトの配列型のデータ。rawdataset-xmlオブジェクトを含む文字列型。status-unsigned integer 0または1。WebOrbサービスでは、Flashから受信したデータは問題ありません。しかし、CakePHPにさらに送信しようとすると、データは通過しません。私はこのようにします(WebOrbクラスで):

public function sendToCake($data,$rawdataset,$status){


    $encodedData=urlencode($data);
    $encodedRawData=urlencode($rawdataset);

    $destinationURL="http://localhost/mycakeapp/resultscontroller/save_results  /".$encodedData."/". $encodedRawData."/".$status;

   return file_get_contents( $destinationURL);

}

ケーキのurlに渡されたパラメーターは文字間にスペースを入れることができないことがわかりました。したがって、urlencode()を使用します。これは「Helloworld」のような単純な文字列で機能します。しかし、xml文字列($ rawdatasetオブジェクト)のようなより複雑な文字列を渡すとケーキはそのような呼び出しを受け取りません。rawurlencode()も試しましたが、それでも結果がありません。ケーキがhttp呼び出しを介して渡されたときにxml構造化文字列を処理する方法を知らない可能性はありますか?この問題に関するヘルプやアドバイスは大歓迎です。

4

2 に答える 2

1

WebOrb クラスについては、代わりにHttpRequestを使用するように変更します。

public function sendToCake($data,$rawdataset,$status){
    $url = 'http://localhost/mycakeapp/resultscontroller/save_results';
    $r = new HttpRequest($url, HttpRequest::METH_GET);
    $r->addQueryData(array('data' => $data, 'rawdata' => $rawdata, 'status' => $status));

    try {
        $r->send();
        return $r->getResponseData();
    } catch (HttpException $ex) {
        return $ex;
    }    
}

^^ あなたが望むものを正確に返すために、少し調整する必要があるかもしれません. CakePHP コントローラ/アクションの場合、その内部でParameters 属性を介して get リクエストにアクセスできます。

function save_results(){
    $data = $this->params[];
    //do stuff to my data;
    return $data;
}

それが役立つことを願っています!

于 2011-08-18T10:19:14.370 に答える
0

質問は CakePHP と WebORb に特に関連するものではありませんが、特殊文字を含むクエリ文字列を使用して URL に対して HTTP GET を実行する方法に関する一般的な質問です。サーバー リターン コード 500 は、MVC フレームワークがサーバー エラーを返していることを示しています。これは、要求の形式が正しくなかったことを示しています。将来的には - fwiw - コード 500 の背後でどのようなエラーがスローされたかを確認するために、Apache エラー ログのスナップショップを作成することをお勧めします。

これが起こっているはずです:

プログラムが url/controller/action/query_string に対して HTTP GET を実行したい

query_string は url_encoded である必要がありますが、さらに、クエリ文字列には文字列を分割する引用符とアンパサンドが含まれている可能性があるため、htmlentities でも​​処理する必要があります。

Michael の場合、次のようなクエリ文字列を構成する $data、$rawdataset、$status の 3 つのパラメータがあります: service/controller/action/data/rawdataset/status

動作するはずの PHP コード スニペットを次に示します。

$query_string = urlencode($data) . '/' . urlencode($rawdataset).'/'.urlencode($status);

次に http_get( 'service/' . htmlentities($query_string) ) を実行すると、http_get は HTTP 応答を返します。

HTTP POST にも同様の戦略を採用できます。

一般に、クエリ文字列が整数でない限り、これを行う必要があります。

そのクエリ文字列を実際に処理する CakePHP Controller アクション内で、次のように Sanitize クラスを静的に呼び出すことができます。

App::import('サニタイズ');

class Service extends AppController { ... ... }

AFAIK - 生の SQL の代わりに CakePHP の ORM メソッド (find() や save() など) と適切な配列表記 (つまり、array('field' => $value)) を使用する場合、コントローラー アクションは既に SQL インジェクションから保護されています。脆弱性。データ パラメーターがコントローラー アクションにヒットしたら、手作りの SQL を実行する必要はありません。

いずれにしても、これは CakePHP、RoR、Django などの MVC フレームワークでのベスト プラクティスです。

仕組みを教えて ダニー

于 2011-08-18T20:32:44.923 に答える