• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Boolsche Werte über $_GET

freakXHTML

Mitglied
Hallo zusammen,
ich versuche einen boolschen Wert über das superglobale Array $_GET zu übertragen. Das sieht dann so aus:
PHP:
<a style="float:right;" href="/pages/logout.php?LogoutforwardL=TRUE">Logout</a>

Solch eine Abfrage ist aber nicht möglich, da das "TRUE" als String interpretiert wird:

PHP:
if($_GET["LogoutforwardL"] == TRUE) foo();

Warum wird das als String interpertiert und warum nicht als boolscher Wert. Die richtige Abfrage lautet also:

PHP:
if($_GET["LogoutforwardL"] == 'TRUE') foo();

Vielen Dank
lg, freakXHTML
 
Werbung:
TRUE IST bei dir ein String, du musst also so auswerten:
if($_GET["LogoutforwardL"] == "TRUE") foo();

Boolsche Werte lassen sich nicht als $_GET übergeben, da sie das Ergebnis einer Prüfung sind.
 
Hm, das ist ja auch Sinn der Sache Strings mit $GET zu uebermitteln.

Boolscher Werte per Get uebermitteln macht meinr Meinung nach ueberhaupt keinen Sinn.

Dein erster Code prueft, ob $_GET["LogoutforwardL"] ueberhaupt gesetzt ist. Du koenntest genauso schreiben if(isset($_GET['LogoutforwardL']) foo();
Denn:

"in PHP ist jeder String außer dem leeren und "0" gleich dem booleschen Wert TRUE.
Bei deinem zweiten Codebeispiel muesste LogoutforwardL in der Tat dem String "TRUE" entsprechen.
 
Werbung:
sysop schrieb:
Boolsche Werte lassen sich nicht als $_GET übergeben, da sie das Ergebnis einer Prüfung sind.

Anusha schrieb:
Boolscher Werte per Get uebermitteln macht meinr Meinung nach ueberhaupt keinen Sinn.

Also, noch mal zusammenfassend: Typisierung ist auf Ebene des HTTP-Protokolls schlicht nicht vorgesehen. Die Felder in GET (und auch POST) speichern keine Informationen über den Datentyp (sind untypisiert) und können von der empfangenden Seite deshalb nur als Strings (oder höchstens noch Arrays) angesehen werden. (Inhaltlich kann man sich das "String" an der Stelle wohl als Ausweichdatentyp für "nicht weiter bestimmbare Folge von Bytes" vorstellen.)

Typecasting wäre noch eine Option:

PHP:
<?php

$_GET['LogoutforwardL'] = 'TRUE';
// Schöner:
//$_GET['LogoutforwardL'] = '1';

$_GET['LogoutforwardL'] = (bool) $_GET['LogoutforwardL'];

var_dump($_GET['LogoutforwardL']);
    // bool(true)
 
@freakXHTML
Sehr nett zusammengefasst, aber auch sehr gefährlich.
Stell Dir mal vor, man könnte Wahrheitswerte übergeben, eine Passwortabfrage wäre vollkommen sinnbefreit, da ich einfach ein "Stimmt" mitsende.
 
@sysop: Das hat nichts damit zu tun, ob man per HTTP Bool'sche Werte übertragen kann. Es kommt ja darauf an, was du mit den empfangenen Daten anfängst. Du könntest ja einfach password=stimmt oder password=stimmtnicht übertragen. Das kommt schlussendlich aufs gleiche 'raus. Zudem kann der Client eh nicht entscheiden, ob das Passwort stimmt, also wäre es sinnfrei, die Prüfung darauf aufzubauen.

Man kann allerdings sehr wohl bool'sche Werte mittels GET übertragen.
wert=0 resp. wert=1

"Dank" PHP's loose typing wird Ersteres als false interpretiert, und Letzteres true, wenn du es in if($_GET['wert']) packst, denn der Wert wird implizit in einen Boolean umgewandelt.
 
Werbung:
Üblicherweise weiß eine Serveranwendung ja, welche Felder sie in welchem Format erwartet. Dass die Daten auch passend vorliegen, muss vor der Verarbeitung über Validierung und Filterung sichergestellt werden.

Nehmen wir mal als Beispiel ein Feld $_GET['entriesPerPage'], wie es etwa bei einer Datenbanksuche eingesetzt werden könnte.

Der Inhalt dieses Felds ergibt für eine Verabeitung nur Sinn,
- wenn er überhaupt gesetzt ist,
- wenn er als Ganzzahl (Integer) interpretiert werden kann
- und wenn diese Zahl in einem bestimmten Bereich (z. B. zwischen 5 und 50) liegt.

Eine der einfachsten Möglichkeiten, das sicherzustellen, wäre wohl diese:

PHP:
$_GET['entriesPerPage'] = (isset($_GET['entriesPerPage']))
                        ? (int) $_GET['entriesPerPage']
                        : 20;

if ($_GET['entriesPerPage'] < 5) {
    $_GET['entriesPerPage'] = 5;
} else if ($_GET['entriesPerPage'] > 50) {
    $_GET['entriesPerPage'] = 50;
}

Wenn das Feld gesetzt ist, wird es auf (int) gecastet, wenn nicht, wird es auf den Defaultwert von (int) 20 gesetzt. Dann wird überprüft, ob der Inhalt zwischen 5 und 50 liegt. Nach diesem Abschnitt ist sichergestellt, dass $_GET['entriesPerPage'] existiert und eine Ganzzahl zwischen 5 und 50 enthält.

(Diese Art der Verarbeitung ist allerdings sehr verzeihend, da *jede* Eingabe -- egal wie falsch -- zu einer korrekten Ausgabe führt und der Benutzer niemals eine Fehlermeldung zu sehen bekommt.)

Meiner Ansicht nach ist es sinnvoll, jedes Feld explizit zu typecasten, das nicht als String verarbeitet werden soll[1], da so sichergestellt ist, dass keine Eingaben durch die lose Typisierung gemogelt werden können.

PHP:
<?php

$_GET['entriesPerPage'] = '25 hallo welt';

if ($_GET['entriesPerPage'] < 5) {
    $_GET['entriesPerPage'] = 5;
} else if ($_GET['entriesPerPage'] > 50) {
    $_GET['entriesPerPage'] = 50;
}

echo 'Einträge pro Seite: ' . $_GET['entriesPerPage'];
    // Einträge pro Seite: 25 hallo welt



1: Auch bei Strings müsste im Grunde getypecastet oder auf is_array() geprüft werden, da PHP manche Eingaben automatisch zu Arrays umformt.

PHP:
<?php

$_GET['username'] = array();

$_GET['username'] = (isset($_GET['username']))
                  ? trim($_GET['username'])
                  : '';

// Warning: trim() expects parameter 1 to be string, array given

(string) array() ergibt übrigens den String "Array".

Dasselbe Problem tritt auch bei Prüfungen mit etwa preg_match() ohne vorheriges Typecasting auf:

PHP:
<?php

$_GET['entriesPerPage'] = array();

if (!preg_match('/^[1-9]\d*$/', $_GET['entriesPerPage'])) {
    die('Keine Ganzzahl');
}

// Warning: preg_match() expects parameter 2 to be string, array given

Wegen dieser Feinheiten gibt es fertige Klassen zur Filterung/Validierung.
 
Werbung:
....Zudem kann der Client eh nicht entscheiden, ob das Passwort stimmt, also wäre es sinnfrei, die Prüfung darauf aufzubauen.
....
Übertrüge ich Werte Wie TRUE oder FALSE als Bollschen Wert für ein Passwort, stünden Tür und Tor offen. In $_GET kann ich reinschreiben was ich will, und $_POST it auch kein Hindernis. Ohne weitere Prüfung wäre das ein Debakel sondergleichen.
Natürlich ist es immer eine Frage, was man mit den übergebenen Werten macht,
 
Werbung:
Zurück
Oben