wake-up-neo.com

Woher bekomme ich Informationen über Array-Felder in $ _REQUEST?

Ich habe gerade angefangen, PHP zu lernen und Dinge mit WordPress zu tun, und ich bin ein bisschen verwirrt über Informationen in Codex. Mir wurde gesagt, dass Codex alle Informationen hat, die ich brauchte, aber ich blieb dabei.

Welche Array-Felder sind in $_REQUEST in WordPress? Kann es im Codex nicht finden.

Zum Beispiel: Leute benutzen $my_contact = $_REQUEST['contact'];
Woher wissen sie, dass $_REQUEST ein 'contact'-Feld hat?

Gibt es einen Workflow, um Informationen zu Variablen zu finden, die nicht im Codex beschrieben sind? Soll ich das gesamte Array ausdrucken, um zu sehen, welche Felder sich darin befinden?

Google hilft mir nicht .. über $ _REQUEST.

6
Rafal

Das ist meistens reines PHP, aber es hat einen WordPress-Twist.

PHP hat eine Anzahl von superglobalen Variablen , die Informationen enthalten, die für die aktuelle Anfrage relevant sind. Aus diesen:

  • $_GET enthält Informationen von URL (HTTP-GET-Anforderung)
  • $_POST info from form Submission (HTTP POST request)
  • $_COOKIES über Cookies gesetzt
  • und $_REQUEST ist eine Kombination der oben genannten Optionen (laut Dokumentation kann $_COOKIES häufig so konfiguriert werden, dass er aus Sicherheitsgründen übersprungen wird).

Jedoch erzwingt WP seine eigene Logik - während des Ladeprozesses wp_magic_quotes() verarbeitet Variablen zum Emulieren magische Anführungszeichen Setzen und erzwingt, dass $_REQUEST eine Kombination aus $_GET und $_POST enthält, egal welches PHP Konfiguration sagt.

In einer WordPress-Umgebung enthält es also GET- und/oder POST Anforderungsdaten. Welche Daten genau das sind, hängt ganz davon ab, auf welcher Seite Sie sich befinden und was darauf geschieht.

10
Rarst

Nur eine Anmerkung zu $_REQUEST: Wann immer Sie dies in einem Code sehen, wissen Sie, dass er von einem Anfänger geschrieben wurde. Wie @Rarst erklärte, handelt es sich um eine Kombination mehrerer Quellen. Aber warum sollte jemand Daten verarbeiten wollen, die per POST nur gesendet werden sollen, wenn sie tatsächlich per GET gesendet werden?

Akzeptieren Sie keine Daten aus einem Eingabestream, den Sie zuvor nicht deklariert haben. Verwenden Sie $_GET, wenn Sie GET möchten, und $_POST, wenn Sie POST möchten. Nichts anderes.

Verwenden Sie den Eingabestream-Wrapper php://input , um auf POST-Daten zuzugreifen, ohne dass WordPress eingreift.
Also, anstatt ...

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

… benutzen …

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

Und vergessen Sie nicht Datenvalidierung .

4
fuxia

Sie haben erwähnt, dass Sie das Array ausdrucken müssen, damit Sie bereits wissen, wie Sie dies tun können. Sie können alle Elemente eines Arrays in PHP anzeigen, indem Sie print_r($_REQUEST); ausführen. Auf diese Weise erhalten Sie die genauen Informationen, auf die jede Seite von $ _REQUEST aus Zugriff hat.

Die Einschränkung hierbei ist jedoch, dass auf jeder Seite möglicherweise andere Schlüssel festgelegt sind. Es kann auch von Vorteil sein, dies in eine temporäre Protokolldatei zu schreiben, je nachdem, ob Sie in der Produktion sind. Sie möchten nicht, dass Ihre Besucher diese Ausgabe sehen.

1
Styler

Ich brauchte es nur für den Test. Haben Sie, wie empfohlen, alle Dateien in eine Datei geschrieben und den Haken 'comment _post' verwendet, um sicherzustellen, dass $ _REQUEST unmittelbar nach dem Veröffentlichen eines Kommentars Daten enthält.

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

Um diese folgende Frage zu beantworten:

Woher wissen sie, dass $ _REQUEST das Feld 'contact' hat?

Meine Antwort lautet:

Sie wissen, weil Sie dieses versteckte Eingabefeld in den <form> (als erstes Eingabefeld) geschrieben haben wie unten:

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

Sie können auch ihre benutzerdefinierte Suchvorlage anstelle der Standardvorlage search.php aktivieren, indem Sie den folgenden Code in functions.php schreiben.

<?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');
?>

Hoffe, es hilft Ihnen zu verstehen, woher sie wissen, welches Feld $_REQUEST hat.

0
Subhasish Nath