web-dev-qa-db-ja.com

$ _REQUESTの配列フィールドに関する情報はどこで入手できますか?

私はPHPを学び始め、WordPressで物事をやるようになりましたが、Codexの情報について少し混乱しています。コーデックスが私が必要とするすべての情報を得たが、私はそれで立ち往生したと言われました。

WordPressの$_REQUESTにはどのような配列フィールドがありますか? コーデックスでそれを見つけることができません。

例:人々は$my_contact = $_REQUEST['contact'];を使います
$_REQUEST'contact'フィールドを持っていることをどうやって知るのですか?

Codexに記述されていない変数に関する情報を見つけるためのワークフローはありますか?どのフィールドが内側にあるかを確認するために、すべての配列をプリントアウトする必要がありますか?

グーグルは私を助けてくれない。

6
Rafal

これはほとんど純粋なPHPですが、WordPressツイストがあります。

PHPには、現在のリクエストに関連する情報を含む superglobal変数 があります。それらのうち:

  • $_GETにはURLからの情報が含まれています(HTTP GETリクエスト)
  • $_POSTフォーム送信からの情報(HTTP POSTリクエスト)
  • $_COOKIES Cookieセットについて
  • および$_REQUESTは上記の組み合わせです(ドキュメントによると、$_COOKIESは一般的に、セキュリティを向上させるためにスキップするように設定できます)

ただし、WPは独自のロジックを適用します-ロードプロセス中に wp_magic_quotes() はエミュレートする変数を処理します マジッククォート$_REQUESTを設定し、$_GET$_POST、PHPの設定に関係なく。

したがって、WordPress環境では、GETおよび/またはPOST要求データが含まれます。正確にどのデータであるかは、あなたがどのページにいて、何が起こっているかに完全に依存します。

10
Rarst

$_REQUESTについてのメモ:コードでこれを見るたびに、それが初心者によって書かれていることを知っています。 @Rarstが説明したように、それは複数の情報源の組み合わせです。しかし、実際にGETごとに送信されるのであれば、POST only ごとに送信されるデータを処理したいのはなぜでしょうか。

以前に宣言していない入力ストリームからデータを受け取らないでください。 GETが必要な場合は$_GETを、POSTが必要な場合は$_POSTを使用してください。他に何もない。

WordPressの介入なしにPOSTされたデータにアクセスするには、入力ストリームラッパー php://input を使用してください。
では、代わりに…

// already changed by WordPress when you get it
$data = $_POST; 

… つかいます …

// Doesn’t work with 'enctype="multipart/form-data"'
$data = file_get_contents( 'php://input' ); 

そして データ検証 を忘れないでください。

4
fuxia

あなたは配列を印刷することを述べたので、あなたはすでにこれをする方法を知っているかもしれません。 print_r($_REQUEST);を実行すると、PHPの配列のすべての要素を見ることができます。これにより、各ページが$ _REQUESTからアクセスできる正確な情報が得られます。

ここでの注意点は、各ページに異なるキーが設定されている可能性があることです。また、本番環境にあるかどうかによっては、これを一時ログファイルに書き込むことが有益な場合もあります。あなたはあなたの訪問者がこのアウトプットを見たくないでしょう。

1
Styler

私はテストのためだけにそれを必要としていました。あなたがアドバイスしたように、すべてのフィールドをファイルに書き、コメントが投稿された直後に$ _REQUESTが確実にデータを持つようにフック 'comment_post'を使いました。

function rj_comment() {
   // sprint_r as print_r   
   function sprint_r($var) {
    ob_start();
    print_r($var);
    $output=ob_get_contents();
    ob_end_clean();
    return $output;
}   
global $_REQUEST;

$stringData = sprint_r($_REQUEST);

$myFile = "c:/s_request_fiels.txt"; #file name
$fh = fopen($myFile, 'w') or die("can't open file");    
fwrite($fh, $stringData);
fclose($fh);    
};

add_action ('comment_post','rj_comment');
0
Rafal

あなたのこの次の質問に答えるには:

彼らは$ _REQUESTに 'contact'フィールドがあることをどのように知っていますか?

私の答えはこれです:

彼らは この隠された入力フィールドを(最初の入力フィールドとして)<form>の内側に書いた 以下のように持っているので知っています:

<input type="hidden" name="contact" value="advanced">

functions.php に次のコードを書くことで、デフォルトの search.php の代わりにカスタム検索テンプレートを有効にすることもできます。

<?php
function wpse_load_custom_search_template(){
    if( isset($_REQUEST['contact']) == 'advanced' ) {
        require('advanced-search-result.php');
        die();
    }
}
add_action('init','wpse_load_custom_search_template');
?>

$_REQUESTがどんなフィールドを持っているのかを彼らがどのように知っているのかという事実をあなたが理解するのに役立つことを願っています。

0
Subhasish Nath