PHP HEREDOC: If-Abfrage

WulfmanGER

Commander
Registriert
Juli 2005
Beiträge
2.272
Hallo miteinander,

ich hab ein kleines Problem. Ich finde die HEREDOC-Form um HTML in PHP zu nutzen ganz praktisch (templates ist mir hierfür zu aufwendig). Das ganze klappt auch eigentlich recht gut. Jetzt hab ich aber eine nicht gesetzte Variable (weil die DB-Abfrage negativ war hab ich die nicht gesetzt - warum auch) - die müsste ich abfragen - eine Lösung hab ich dafür gefunden ... trotzdem parsed php einfach ALLES und somit auch ein Fehler...

Code:
$if = function($condition, $true, $false) { return $condition ? $true : $false; };

$var = "irgendwas";
echo >>>BLABLA
{$if(isset($var), "yes", "no")}
BLABLA;
Ausgabe: yes

setze ich $var nicht - Ausgabe no.
Diese Funktion klappt also Grundsätzlich. Minimal verwerten kann ich das auch - aber mein Problem ist folgendes:

Code:
[kurzform: wenn datenbank min 1 treffer: true -> $var = "blablaba" | false -> mach nichts - also keine variable]
 
$if = function($condition, $true, $false) { return $condition ? $true : $false; };
echo >>>BLABLA
{$if(isset($var), "<b>Folgende Treffer</b>: {$var}", "")}
BLABLA;
Ist die Variable $var nicht gesetzt, soll also NICHTS ausgeben werden.

Folgendes passiert:
Ist die Variable gesetzt ist die Ausgabe: blablabla
Ist die Variable NICHT gesetzt bekomme ich einen Undefined variable: var
Nur soll die ja eigentlich nicht geparsed werden - ist ja nicht da :)

Als Workaround könnte ich den ganzen HTML-Code natürlich in eine zweite Variable stecken
Code:
true: $varHTML = "<b>Folgende Treffer</b>: ". $var;
false: $varHTML ="";
.....
{$if(isset($var), "{$varHTML}", "")}

$var ist gesetzt, also wird $varHTML angezeigt. Selbst wenn $var nicht gesetzt ist, $varHTML ist IMMER gesetzt.

Finde die Variante aber irgendwie unschön. Kann man hier irgendwas machen damit
Code:
{$if(isset($var), "<b>Folgende Treffer</b>: {$var}", "")}
bei $var nicht gesetzt, KEINEN Fehler auswirft? Übersehe ich hier was?

Danke schon mal :)
 
Ich kenne mich mit PHP überhaupt nicht aus, aber wenn du eine Methode mit Parametern aufrufst, dann werden die natürlich ausgewertet. Du übergibst die ja erst und erst dann wird dein Elvis-Operator ausgewertet. Das kannst du so nicht abfackeln, wie du dir das vorstellst.
 
Ich glaub wir reden an meinem Problem vorbei?

Fehlermeldungen ausblenden halte ich nichts von ... dadurch verschwindet der Fehler ja nicht - wird nur nicht mehr angezeigt ... wie auch andere Fehler die dann, für mich, kritischer sind ...

Der zweite Link hilft auch nicht wirklich .

"Declare your variables, for example when you try to append a string to an undefined variable. Or use isset() / !empty() to check if they are declared before referencing them, as in: " <- das ist ja gar nicht das Thema. Die Spielregeln kenne ich - nutze ich - aber ich hab hier eine andere Ausgangslage. HEREDOC definiert eigentlich das nur, in meinem Fall, HTML ausgegeben wird - mitten im php - ohne php zu "verlassen" ( php ?>html <? php ). Man kann hier aber bequem über geschweifte Klammern mit php-Variablen arbeiten. Die, wie überall, gesetzt werden müssen.

Mit der Funktion die ich da gefunden habe, ist es möglich, auch in diesem heredoc-Bereich eine Abfrage reinzubauen ... hier mache ich ja auch ein isset($var) ... wenn $var nicht gesetzt ist, wird auf FALSE gesprungen -> alles richtig. Aber ich kann die Variable nicht in TRUE reinhauen, wenn isset FALSE ausgibt. Innerhalb reinen PHP ist das ja möglich.

Code:
if (isset($var)) { echo $var; } else { echo "nicht gesetzt"; }
$var nicht gesetzt: keine Fehlermeldung - "true" wird ignoriert - "else"/false wird ausgegeben.

Das
Code:
{$if(isset($var), "yes", "no")}
[/quote]
ist das heredoc-Equivalent ... mit dem unterschied das bei true/yes im FALSE-Fall die nicht gesetzte Variable nicht stehen darf.

Bisher ist es also am besten mit einem Workaround zu arbeiten:
$varHTML ist IMMER gesetzt. und steht bei "yes". $var wird abgefragt: existiert diese, wird $varHTML aufgerufen, existiert diese nicht, geht es in "no" - aber bricht nicht ab, weil $varHTML gesetzt ist (in dem fall mit "" bzw.)

Und da ist einfach die Frage ob ich hier einen Anwendungsfehler habe und $var einbauen kann auch OHNE das es gesetzt ist.
Ergänzung ()

Hab es gelöst bekommen ... die Lösung ist nicht das gesetzt? abfragen sondern den Inhalt ...

Code:
# hier die $row ... SQL-Abfrage
$text = $row[0];
ich fülle einfach $text; wenn SQL kein Treffer gibt, ist $text trotzdem gesetzt - mit ""

Code:
$if = function($condition, $true, $false) { return $condition ? $true : $false; };
echo <<<HTML
{$if(strlen($text)>1, "<b>Beschreibung</b>:<br> {$text}", "")}
HTML;

ich prüfe einfach die Länge von der Variable. In dem Fall sollte Text drin steht ... alles über 1 Zeichen = Text - passt ;). Ich hab dann noch Variablen wo nur 0/1 drin steht - das kann ich mit $var == 1 abfragen.
 
Zuletzt bearbeitet: (Lösung)
Das Verhalten von isset ist richtig. Denn ist deine Variable gesetzt, in dem Fall eine leere Zeichenkette, existiert die Variable ja. In deinem Fall wäre die Funktion empty sinniger gewesen und bewirkt genau das, was Du willst.

Das die Meldung undefined erscheint, ist auch richtig. Denn die Variable hat keine Zuweisung. Das ist in anderen Programmiersprachen genau so. Entweder es wird der Variable eine leere Zeichenkette, NULL oder was auch immer zugewiesen. Andernfalls erhältst Du die besagte Meldung.

Ich persönlich würde auch nicht einfach Variablen „nicht zugewiesen“ stehen lassen. Damit beugst du sowieso am ehesten Fehler vor oder eben genau diese und musst keine Eselsbrücken bauen...
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: psYcho-edgE und Nase
Zurück
Oben