$_GET-Paramter vor Übergabe mit isset() prüfen?

Alles, was PHP betrifft, kann hier besprochen werden.

$_GET-Paramter vor Übergabe mit isset() prüfen?

Postby melly » 22. January 2011 23:36

Hallo zusammen,

ich habe eine Frage zu $_GET Parametern.

Ich übergebe in einem Skript sehr viele $_GET-Parameter an verschiedene Funktionen. Muss ich dafür vorher alle $_GET-Parameter im isset() testen, ob sie auch existieren? Oder kann ich die $_GET-Parameter auch ohne Prüfung übergeben?

Beispiel


Variante 1:

Code: Select all
$auto = new Auto();

$auto->neueFarbe ( $_GET['farbe'] , $_GET['muster'] );

Variante 2:

Code: Select all
$auto = new Auto();

if ( isset ($_GET['farbe']) ) {
 $farbe = $_GET['farbe'];

else { 
  $farbe = null; 
}

if ( isset ($_GET['muster']) ) { 
  $muster = $_GET['muster'];

else { 
  $muster = null; 
}

$auto->neueFarbe( $farbe , $muster );

Variante 2 kommt mir aber sehr umständlich vor, weil ich ca. 10 GET-Parameter an Funktionen übergebe und für jeden Parameter die Abfrage und Zuweisung wie in Variante 2 durchführen müsste.


Doch wenn ich die Parameter wie in Variante 1 übergebe bekomme ich eine PHP NOTICE wenn einer der GET-Parameter nicht übergeben wurde. (Einige der Parameter sind optional und werden deshalb nicht immer per GET übergeben)


Hat jemand einen Tip wie man das Problem am besten lösen kann?

Vielen Dank im Voraus,
Grüße Melly
melly
 
Posts: 12
Joined: 14. September 2010 20:35

Re: $_GET-Paramter vor Übergabe mit isset() prüfen?

Postby WilliL » 22. January 2011 23:58

ich würde sogar noch viel weiter gehen und testen, ob $_GET['farbe'] eine erlaubte Frabe ist und nicht "hellrosa mit blauen Punkten" oder "Schraubendreher" oder "<script> HACKERCODE </script>".
d.h. eine whitelist der erlaubten Farben erstellen z.B. $array_erlaubte_farben = 'rot, gelb, grün, blau, ..' und dann den Inhalt von $_GET['farbe'] darauf hin prüfen.
.. und das für JEDEN Parameter, der eingegeben wird.

"Traue nie ungeprüft den Eingaben" :shock:
Willi
WilliL
 
Posts: 621
Joined: 08. January 2010 10:54
XAMPP Version: 5.5.19
Operating System: Win7Home Prem 64 SP1

Re: $_GET-Paramter vor Übergabe mit isset() prüfen?

Postby melly » 23. January 2011 12:11

Hallo,
danke für doe Antwort! Ich prüfe den übergebenen Wert in der Funktion mit Hilfe von regulären Ausdrücken (es werden id's übergeben).

Aber es kommt mir so umständilch vor, jeden Parameter zu Prüfen und einer Variable zuzuweisen:

Code: Select all
if ( isset ($_GET['farbe']) ) {
$farbe = $_GET['farbe'];
}
else {
$farbe = null;
}

if ( isset ($_GET['muster']) ) {
$muster = $_GET['muster'];
}
else {
$muster = null;
}

usw. ........................................



Kann mir jemand sagen, ob es da vielleicht eine bessere Methode gibt?

Irgendwas wie Folgendes:

Code: Select all
$auto->neueFarbe( only_if_isset($_GET['farbe']) );

--> Das der $_GET-Parameter nur übergeben wird, wenn er existiert und ansonsten automatisch NULL übergeben wird? Ohne dass eine PHP-Notice auftritt...

Danke,
Grüße Melly
melly
 
Posts: 12
Joined: 14. September 2010 20:35

Re: $_GET-Paramter vor Übergabe mit isset() prüfen?

Postby Nobbie » 23. January 2011 12:25

melly wrote:--> Das der $_GET-Parameter nur übergeben wird, wenn er existiert und ansonsten automatisch NULL übergeben wird?


Genau so wird sich PHP verhalten.

melly wrote:Ohne dass eine PHP-Notice auftritt...


Eine PHP-Notice wird selbstverständlich ausgegeben, aber das kannst Du ja mit dem error_reporting steuern. Es ist nicht blitzsauber programmiert, aber auch kein Fehler, deswegen eine Notice (Used before set).
Nobbie
 
Posts: 6577
Joined: 09. March 2008 13:04

Re: $_GET-Paramter vor Übergabe mit isset() prüfen?

Postby Altrea » 23. January 2011 13:22

Das prüfen und setzen eines Default Wertes ist mit der Kurzschreibweise ein Einzeiler:
Code: Select all
<?php
//... code
$farbe = !empty( $_GET['farbe'] ) ? $_GET['farbe'] : NULL;
$auto->neueFarbe( $farbe );


Möchte man einen Wert noch weiteren Tests unterziehen (wie, dass nur erlaubte Zeichen drin stehen oder ähnliches), kann man die empty() Funktion auch durch eine eigene Ersetzen, die true oder false zurückgibt.
Ebenso kann man im Erfolgsfall den Übergabewert noch bereinigen oder verharmlosen.

Dabei kommt dann zum Beispiel sowas in der Art raus:
Code: Select all
function valid_string( $string ) {
    //irgendwelche prüfungen, die bei Erfolg true und sonst false zurückgeben
}

//... code

$farbe = valid_string( $_GET['farbe'] ) ? trim( $_GET['farbe'] ) : NULL;
$auto->neueFarbe( $farbe );
We don't provide any support via personal channels like PM, email, Skype, TeamViewer!

It's like porn for programmers 8)
User avatar
Altrea
AF Moderator
 
Posts: 6536
Joined: 17. August 2009 13:05
XAMPP Version: 5.5.19
Operating System: W7Ux64

Re: $_GET-Paramter vor Übergabe mit isset() prüfen?

Postby melly » 23. January 2011 13:36

@Nobbie

Danke für Deine Antwort ;) Möchte aber vermeiden, dass eine PHP-Notice auftritt...

@Altrea

genau sowas habe ich gemeint! Bin von selbst einfach nicht drauf gekommen...

Vielen Dank ;)

Grüße Melly
melly
 
Posts: 12
Joined: 14. September 2010 20:35

Re: $_GET-Paramter vor Übergabe mit isset() prüfen?

Postby Xardas der Dunkle » 24. January 2011 00:13

Altrea wrote:Dabei kommt dann zum Beispiel sowas in der Art raus:
Code: Select all
function valid_string( $string ) {
    //irgendwelche prüfungen, die bei Erfolg true und sonst false zurückgeben
}

//... code

$farbe = valid_string( $_GET['farbe'] ) ? trim( $_GET['farbe'] ) : NULL;
$auto->neueFarbe( $farbe );

Hier muss man aber darauf achten das die Funktion eine Referenz erwarten muss:
function valid_string(&$string) {

sonst gibt es wiederum eine Fehlermeldung wenn die Variable wie in deinem Beispiel angegeben übergeben wird.
Hat allerdings die Folge das ein Aufruf der Funktion mit direkten Werten nicht mehr funktioniert.
Code: Select all
valid_string('test'); // Wird einen Fehler werfen



Eine PHP-Notice wird selbstverständlich ausgegeben, aber das kannst Du ja mit dem error_reporting steuern. Es ist nicht blitzsauber programmiert, aber auch kein Fehler, deswegen eine Notice (Used before set).

Nicht dein ernst ... ich bin froh das sich mittlerweile was das angeht ein Wandel durch die PHP Gemeinde geht ...
Die Notices haben schließlich einen Sinn nämlich das Auffinden von Tippfehlern und ähnlichem.

Nenn mir eine andere Sprache die so einen Mist wie error_reporting mit bringt ... es gibt keine. Selbst bei JavaScript fliegt bei einem Fehler das komplette Script um die Ohren.
User avatar
Xardas der Dunkle
 
Posts: 482
Joined: 09. March 2008 19:40
Location: /var/www

Re: $_GET-Paramter vor Übergabe mit isset() prüfen?

Postby Altrea » 24. January 2011 00:51

Oh, du hast natürlich Recht. empty() kann man nicht einfach ersetzen, da man sonst dennoch eine Notice geschmissen bekommt.
Man kann die Prüfung aber um eine selbst definierte erweitern statt ersetzen.

Zum Beispiel so:
Code: Select all
function valid_color( $string )
{
   $colors = array( 'red', 'green', 'blue' );
   return in_array( $string, $colors );
}

$auto = new Auto();
$farbe = ( !empty( $_GET['farbe'] ) && valid_color( $_GET['farbe'] ) ) ? trim($_GET['farbe']) : NULL;
$auto->neueFarbe( $farbe );


Eine Referenz übergeben kann man sich natürlich immer überlegen. Ich vermeide dies in der Regel, außer ich möchte den Ursprungswert selbst in der Funktion manipulieren (was ich bei GET, POST und ähnlichen Übergabewerten generell nie tun würde).
Aber das soll ja auch nur ein einfaches Beispiel sein.
We don't provide any support via personal channels like PM, email, Skype, TeamViewer!

It's like porn for programmers 8)
User avatar
Altrea
AF Moderator
 
Posts: 6536
Joined: 17. August 2009 13:05
XAMPP Version: 5.5.19
Operating System: W7Ux64

Re: $_GET-Paramter vor Übergabe mit isset() prüfen?

Postby Nobbie » 24. January 2011 09:24

Xardas der Dunkle wrote:Nenn mir eine andere Sprache die so einen Mist wie error_reporting mit bringt ... es gibt keine


Das ist Quatsch, nur weil Du keine Sprache kennst. Bereits die Sprache C (ein richtiger Compiler mit Variablendeklaration) kennt Warninglevels. Man kann von "sehr gesprächig" bis "Halt die Klappe" auch so ziemlich alles einstellen, wenn ich mich recht erinnere, ist das die Commandline-Option "-W" gefolgt von einer Nummer (Warninglevel). Ist genau dasselbe in grün.

Xardas der Dunkle wrote: Selbst bei JavaScript fliegt bei einem Fehler das komplette Script um die Ohren.


Dafür bringen andere Sprachen erst gar keine Fehlermeldung, wenn man eine unbekannte Variable an eine Funktion übergibt. Weil es kein "Fehler" ist - wenn man Speichermüll verarbeiten will, dann soll es so sein. VisualBasic nicht, sowieso nicht alle Sprachen, die auto-initialisierte Variablen anbietet (also keine Typdeklaration benötigt wie Pascal beispielsweise oder Cobol). Wo ist da der Vorteil? Wobei PHP ja sogar auf NULL initialisiert.

Du machst hier offensichtlich den Fehler und verwechselst Warnings (bzw. sogar Notices - das ist nicht einmal eine Warnung, nur ein Hinweis) mit Fehlern (Error, Syntax Error usw.).
Nobbie
 
Posts: 6577
Joined: 09. March 2008 13:04

Re: $_GET-Paramter vor Übergabe mit isset() prüfen?

Postby Xardas der Dunkle » 24. January 2011 18:15

Eine Referenz übergeben kann man sich natürlich immer überlegen. Ich vermeide dies in der Regel, außer ich möchte den Ursprungswert selbst in der Funktion manipulieren (was ich bei GET, POST und ähnlichen Übergabewerten generell nie tun würde).
Aber das soll ja auch nur ein einfaches Beispiel sein.

Halte ich auch für Sinnvoller. Schließlich umbaut man damit die Fehlermeldung auch wiederum nur.

Du machst hier offensichtlich den Fehler und verwechselst Warnings (bzw. sogar Notices - das ist nicht einmal eine Warnung, nur ein Hinweis) mit Fehlern (Error, Syntax Error usw.).

Nein, tue ich nicht. Der Hinweis stößt einem vor dem Kopf das die Variable nicht initialisiert wurde.
Dies ist eben auch bei Tippfehlern o.ä. der Fall.

Code: Select all
<?php
$var = 'a';
echo $varr; // Notice


Dafür bringen andere Sprachen erst gar keine Fehlermeldung, wenn man eine unbekannte Variable an eine Funktion übergibt. Weil es kein "Fehler" ist - wenn man Speichermüll verarbeiten will, dann soll es so sein. VisualBasic nicht, sowieso nicht alle Sprachen, die auto-initialisierte Variablen anbietet (also keine Typdeklaration benötigt wie Pascal beispielsweise oder Cobol). Wo ist da der Vorteil? Wobei PHP ja sogar auf NULL initialisiert.

Ich finde es trotzdem absolut inkonsequent ... Fehler sind dafür da das man sie behebt und sie nicht unterdrückt ...
Und sei es nur ein Hinweis.

Vor allem führt dein Weg dazu, dass wenn man das Error-Level dann doch mal wieder hoch setzt um entsprechende Fehler zu finden man erst mal 20 "Unknown $_GET['bla']" um die Ohren geworfen bekommt.
Das Script vielleicht noch an einem setcookie/header/etc. mit einem Warning abbricht ... weil der Ausgabepuffer bereits geleert wurde.

Besser direkt alles abfangen und Variablen immer initialisieren ...
User avatar
Xardas der Dunkle
 
Posts: 482
Joined: 09. March 2008 19:40
Location: /var/www


Return to PHP

Who is online

Users browsing this forum: No registered users and 7 guests