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

if else / variablen übergabe fehler?

Status
Für weitere Antworten geschlossen.

lumpi128

Neues Mitglied
Hallo,
Ich habe ein einfaches Formular namens index.html erstellt. Dieses sendet die Daten via method = "get" an die auswert.php. Diese bekommt dann unter anderem folgende Daten übergeben:

Code:
auswert.php?lang=eng&schaltplanerstellung=1

die auswert.php soll dann folgendes mit den Daten anstellen:
PHP:
$lang = $_GET['lang'];

$schaltplanerstellung = $_GET['schaltplanerstellung'];
if ($schaltplanerstellung = "1" && $lang = "deu"){
    $schaltplanerstellung = "Schaltplanerstellung";
}
elseif ($schaltplanerstellung = "1" && $lang = "eng"){
    $schaltplanerstellung = "schematic diagram creation";
}
else {
    $schaltplanerstellung = "";
}

doch anscheind wird dauerhaft die deutsche übersetzung angezeigt. Mir kommt es so vor als wird die Variable $lang in den Bedinungen nicht berücksichtig.

Weiß einer woran das liegt?

MfG
Lumpi128
 
bin mir nicht sicher, aber es könnte daran liegen, dass du hinter der auswert.php mit ? schon GET parameter definiert hast und diese dann vom Formular überschrieben werden.

Probier mal mit einem Hidden Feld die Values übergeben.

also mit type=hidden; name=lang; value=eng; usw.
 
= ist eine zuweisung == ein vergleich und === ein vergleich (typen müssen stimmen)

z.b.

"abc" = 43985738945 // ist true, wenn auch unsinnig
"abc" == 32492343 // ist false
1 == (bool)true // ist true
1 === (bool)true // ist false, da wir einen int und einen bool wert haben
 
= ist eine zuweisung == ein vergleich und === ein vergleich (typen müssen stimmen)

z.b.

"abc" = 43985738945 // ist true, wenn auch unsinnig
"abc" == 32492343 // ist false
1 == (bool)true // ist true
1 === (bool)true // ist false, da wir einen int und einen bool wert haben

um das mal klarer zu machen:

PHP:
$lang = $_GET['lang'];

$schaltplanerstellung = $_GET['schaltplanerstellung'];
if (($schaltplanerstellung == "1") && ($lang == "deu")){
    $schaltplanerstellung = "Schaltplanerstellung";
}
elseif (($schaltplanerstellung == "1") && ($lang == "eng")){
    $schaltplanerstellung = "schematic diagram creation";
}
else {
    $schaltplanerstellung = "";
}
 
er wird es nie lernen, wenn man ihn keine fehler machen lässt, sondern direkt den richtigen code postet.
 
Abend,

noch eine Anmerkung zu freaks131 Beispielen:
PHP:
"abc" = 43985738945 // ist true, wenn auch unsinnig
ist keine zulässige Anweisung. Auf der linken Seite einer Zuweisung muss immer eine Variable stehen.

Allgemein ergibt
PHP:
$a = foo;
auch nicht immer true.

PHP:
// $a = ... wird in if zu true
echo $a = 'foo'; // Ausgabe: foo
echo $a = 123; // Ausgabe: 123

// $a = ... wird in if zu false
echo $a = 0; // Ausgabe: 0
echo $a = ""; // Ausgabe:
Setzt man die Zuweisung als Bedingung in eine if-Abfrage ein, wird ein Type-Cast durchgeführt. Dabei werden 'foo' und 123 in true umgewandelt und 0 und "" in false.


N43
 
Allgemein ergibt
PHP:
$a = foo;
auch nicht immer true.
Erstmal wird nach der Kontante foo gesucht, falls diese nicht existiert wird (ich finde es grauenhaft) der string foo eingesetzt und der variable a zugewiesen.


$a = "";
in diesem falle existiert die variable zwar, wird aber als false "abgestempelt", lediglich ein isset würde true ergeben. ich finde dies sehr traurig gelöst.

noch schlimmer ist dieses beispiel:
$a = 0;
nun ist a gesetzt und wird als false (bool) deklariert.

aber selbst wenn ich nach (int)$a frage, wird der boolische wert false genommen, anscheinent ist php egal ob ich bool 0 oder int 0 benutze.
grauenhaft.

Ganz gruselige Probleme kann es bei der funktion array_flip geben.

Hier auch noch ein Fall der ab und zu passiert:
PHP:
$a = 'foo2';
if($a == 'foo');
{ echo 'true'; }

durch das ; am if wird der Funktionsblock als beendet angesehen, der Block wird also ohne zu zögern ausgeführt, da keine bedingung mehr daran geknüpft ist. erst bei einem else würder der parser einen fehler ausgeben.

Besten Gruß, Tim
 
Erstmal wird nach der Kontante foo gesucht, falls diese nicht existiert wird (ich finde es grauenhaft) der string foo eingesetzt und der variable a zugewiesen.
Daran hatte ich gar nicht gedacht, meinte foo für irgendwas. Du hast aber vollkommen recht. Bei so Sachen bin ich sogar der Meinung, dass man die in einem neuen Major Release (am besten gleich in PHP 6) abschafft oder wenigstens das Verhalten über die php.ini deaktivieren kann.

freak131 schrieb:
$a = "";
in diesem falle existiert die variable zwar, wird aber als false "abgestempelt", lediglich ein isset würde true ergeben. ich finde dies sehr traurig gelöst.
Das ist in der Tat traurig gelöst. Allgemein sollte man einen impliziten Type-Cast von String nach Integer komplett verbieten. Das ganze gipfelt in
PHP:
if (($a = "0") == false) echo "true";
Es findet intern (vermute ich) ein Type-Cast zu (int)0 und davon ein Type-Cast zu (bool)false statt. Vl. castet PHP auch direkt zu (bool)false.

freak131 schrieb:
noch schlimmer ist dieses beispiel:
$a = 0;
nun ist a gesetzt und wird als false (bool) deklariert.

aber selbst wenn ich nach (int)$a frage, wird der boolische wert false genommen, anscheinent ist php egal ob ich bool 0 oder int 0 benutze.
grauenhaft.
Nicht ganz:
PHP:
if ((int)0 == (bool)0) echo "true"; // liefert true
if ((int)0 === (bool)0) echo "true"; // liefert false
Bei Zahlen kann ich das Verhalten von PHP noch nachvollziehen. Das ganze stammt aus C, wo es den Datentyp bool noch gar nicht gab. Es galt die Konvention (die auch heute noch gilt) 0 bedeutet false und alles andere true.


Um den Zuweisungs-Operator in Bedingungen nicht ganz zu verteufeln: Er wird z.B. ganz gerne bei MySQL-Abfragen genutzt
PHP:
while ($row = mysql_fetch_object (...)) {
   //$row verarbeiten
}
und erhält damit auch seine Daseinsberechtigung für solche Fälle.


N43
 
ich meine dies:
PHP:
<?php
$a = 0;
echo gettype($a).'<br \>'; // returns int
if((int)$a) .... //returns false
?>
Hier wird ganz klar ein intger überprüft und kein boolischer wert, PHP ist dies egal. Wenn man eine 2 einträgt ist es true.
C(pp) übrigends auch ....

int foo = 0;
if(foo)
{ cout << "true"; }
else
{ cout << "false"; }
demnach liegt der "fehler" wohl im C core von PHP.
ein beweis dafür:
PHP:
$a = 0;
if($a !== false) // returns true
d.h. php entscheidet zwischen bool und int, der core (C) tut dies aber nicht, demnach wird bei der interpretation von C der fehler gemacht.

als workarround für if() bietet sich dies hier an:
PHP:
function type($var=false)
{    return (is_bool($var)?$var:true);    }

$a = 0;
if(type($a)) // returns the true
in diesem falle werden boolische werte zugelassen, andernfalls wird true zurück gegeben, demnach bei verlgleichen unangebracht.
isset würde auch bei "false" true zurück geben und ist demnach hier zwar eine möglichkeit, beschränkt aber, jedoch müssen wir hier aufpassen bei variablen die nicht existieren oder leer sind, diese sind true, dies zu beseitigen bedarf aber nur ein paar sekunden.
 
Hallo,

ich meine dies:
PHP:
<?php
$a = 0;
echo gettype($a).'<br \>'; // returns int
if((int)$a) .... //returns false
?>
Hier wird ganz klar ein intger überprüft und kein boolischer wert, PHP ist dies egal. Wenn man eine 2 einträgt ist es true.
Nein, das ist ein Trugschluss. PHP macht hieraus
PHP:
if ((bool)((int)$a))
Es wird implizit ein Type-Cast ausgeführt.

C(pp) übrigends auch ....

demnach liegt der "fehler" wohl im C core von PHP.
ein beweis dafür:
PHP:
$a = 0;
if($a !== false) // returns true
d.h. php entscheidet zwischen bool und int, der core (C) tut dies aber nicht, demnach wird bei der interpretation von C der fehler gemacht.
Das ist von PHP durchaus so gewollt und kein Fehler.


als workarround für if() bietet sich dies hier an:
PHP:
function type($var=false)
{    return (is_bool($var)?$var:true);    }

$a = 0;
if(type($a)) // returns the true
in diesem falle werden boolische werte zugelassen, andernfalls wird true zurück gegeben, demnach bei verlgleichen unangebracht.
isset würde auch bei "false" true zurück geben und ist demnach hier zwar eine möglichkeit, beschränkt aber, jedoch müssen wir hier aufpassen bei variablen die nicht existieren oder leer sind, diese sind true, dies zu beseitigen bedarf aber nur ein paar sekunden.
Das nimmt explizit true für alles != false an, was in der Terminologie der Informatik nicht gerade gut ist. 0 (= Signal Low) ist in (positiver) Logik false. In gewissen Fällen ist die Interpretation von PHP irritierend, aber auf Grund der Casting Regeln kein Fehler. Wenn man sicherstellen will, dass kein unerwünschter Type-Cast ausgeführt wird, sollte man den === Operator verwenden.

Also für deinen Fall:
PHP:
if ($a === false)
//bzw.
if ($a !== false)
Das ist für jeden, der den Code liest, eindeutig und er muss nicht erst nachschauen, was type() macht.


N43
 
Hallo,

Nein, das ist ein Trugschluss. PHP macht hieraus
PHP:
if ((bool)((int)$a))

N43

natürlich, weil if ein bolischen wert erwartet, macht sinn.
schade das ich nicht darauf gekomme bin.

nun stellt sich nur die die frage was switch erwartet.
hier wird zwischen 0 und false nicht so einfach unterschieden.

ich finde es schon ein wenig traurig realisiert und würde mir eine striktere typenordnung wünschen.

traurig ist, dass 0.0 auch false entspricht, dies hat wohl damit zutun, dass der ascii wert niedriger ist als false, und demnach der stärkere typ gewinnt.

ich denke wenn man sich damit genauer beschäftigt findet man auch die antworten & gründe.
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben