PHP Operatos - Logische Abfrage funktioniert nicht

wallcity

New Member
Hallo ich hab ein kleines Problem mit meinem elseif von dem folgendem Script. Ich hab schon sovieles Probiert und nix geht, natürlich könnte man den elseif lang ausschreiben aber ist es nicht möglich, die ganze Abfrage in einem Befehl zu halten?

Also obwohl ich Super Administrator oder Reseller als Userlevel habe, schiebt der mich in elseif immer auf die errors message....

PHP:
if (($include_php == "admserver") || ($include_php == "admradio") || ($include_php == "admuser")) {
    if (($include_php == "admserver") && ($user_level!="Super Administrator")) {
        $include_php = "main";
        $errors[] = "<h2>".$messages["17"]."</h2>";
    }
    elseif ((($include_php == "admradio") || ($include_php == "admuser")) && (($user_level!="Super Administrator") || ($user_level!="Reseller"))) {
            $include_php = "main";
            $errors[] = "<h2>".$messages["17"]."</h2>";
    }            
}

MFG wallcity
 
Last edited by a moderator:
Hallo Joe User,

also hatte noch den nicht ganz korrekten Code drin, also was ich mit dem Code aussagen möchte ist folgendes:

Wenn include_php eines von diese variablen ist, dann:
If include_php == admserver & userlevel != admin dann gib eine fehlermeldung aus
elseif include_php entweder admradio oder admuser und userlevel != admin oder userlevel != reseller dann gib eine fehlermeldung aus...

Hoffe ich konnte es einigermaßen erklären....

MFG wallcity
 
PHP:
(($include_php == "admserver") || ($include_php == "admradio") || ($include_php == "admuser"))

Ich versteh die Abfrage hier nicht? Wieso vergleichst du hier einen Variable mit einem String mit 3 verschiedenen Strings?

Da würde doch reichen
PHP:
if($include_php == "admserver"){ ...
 
userlevel != admin oder userlevel != reseller dann gib eine fehlermeldung aus...
Überlege dir nochmal genau, was hier sinnvoller ist: logisches UND oder logsches ODER.

Es hilft dir sicherlich, wenn du dir genau überlegst, wann dieser Ausdruck WAHR wird…
 
PHP:
(($include_php == "admserver") || ($include_php == "admradio") || ($include_php == "admuser"))

Ich versteh die Abfrage hier nicht? Wieso vergleichst du hier einen Variable mit einem String mit 3 verschiedenen Strings?

Da würde doch reichen
PHP:
if($include_php == "admserver"){ ...

Also entweder eines dieser Values soll diese Variable beinhalten...
 
Ich versteh die Abfrage hier nicht? Wieso vergleichst du hier einen Variable mit einem String mit 3 verschiedenen Strings?
Weil die Variable verschiedene Werte enthalten kann und dieser Code-Zweig ausgeführt werden soll, wenn die Variable einen der angegebenen drei Werte enthält.
 
ah okay dann würd ich das so schreiben:

PHP:
<?php
if ($include_php == "admserver" or  "admradio" or "admradio")
{
    if ($user_level!="Super Administrator") 
    {
        $include_php = "main";
        $errors[] = "<h2>".$messages["17"]."</h2>";
    }
    elseif ($user_level == "Reseller") 
    {
        $include_php = "main";
        $errors[] = "<h2>".$messages["17"]."</h2>";
    }            
}
?>
 
bei meinem Test auf Debian hats funktioniert ;-) beim Rest bin ich mir nicht so sicher.

PHP:
<?php
$include_php = "admradio";
$user_level = "Reseller";
if ($include_php == "admserver" or "admradio" or "admradio")
{
    if ($user_level != "Super Administrator") 
    {
        $include_php = "main";
        $errors[] = "<h2>".$messages["17"]."</h2>";
        echo "a";
    }
    elseif ($user_level == "Reseller") 
    {
        $include_php = "main";
        $errors[] = "<h2>".$messages["17"]."</h2>";
        echo "b";
    }          
var_dump($include_php,$user_level);  
}
?>
 
Du solltest dir wirklich etwas über logische Operatoren anlesen, wenn du sie verwenden willst.

bei meinem Test auf Debian hats funktioniert ;-)
Ja, der Ausdruck wird übrigens auch WAHR, wenn $include_php zum Beispiel (int)1 oder "foobar" enthält.
 
Ja okay vielen Dank wäre trotzdem schön falls man alles in eine Bedingung hineinbekommt....

Habe den Code jetzt so, und naja so ist es ja klar das es funktioniert:

PHP:
if (($include_php == "admserver") || ($include_php == "admradio") || ($include_php == "admuser")) {
    if (($include_php == "admserver") && ($user_level!="Super Administrator")) {
        $include_php = "main";
        $errors[] = "<h2>".$messages["17"]."</h2>";
    }
    elseif (($include_php == "admradio") || ($include_php == "admuser")) {
        if ($user_level!="Super Administrator") {
            if ($user_level!="Reseller") {
                $include_php = "main";
                $errors[] = "<h2>".$messages["17"]."</h2>";
            }
        }
    }     
}

MFG wallcity
 
Last edited by a moderator:
Die ganzen nested if-Schleifen verkomplizieren das Lesen des Codes ungemein, versuch die aehnlich aufgebaute switch-case Funktion zu benutzen:

PHP:
try {
	switch($include_php) {
		case "admserver":
			if($user_level != "Super Administrator") throw new Exception($messages[17]);
			break;
		case "admradio":
		case "admuser":
			if($user_level != "Super Administrator" && $user_level != "Reseller")  throw new Exception($messages[17]);
			break;
		default:
			throw new Exception("Was soll ich tun?");
	}
}
catch (Exception $e) {
	if($e->getMessage() == $messages[17]) {
		$include_php = "main";
		$errors[] = "<h2>".$e->getMessage()."</h2>";
	}
	else {
		die("Unhandled exception!");
	}
}
(Ich kann die Funktionsfaehigkeit nicht garantieren - dafuer schmerzt mein Kopf zuviel :) )
 
Last edited by a moderator:
Hallo vielen Dank fuer den switch Code, daran hatte ich bis jetzt noch nicht gedacht, werde es mal spaeter ausprobieren, sobald ich nachhause komme..

MFG wallcity
 
Es hilft gerade bei solch einfachen Abfragen ungemein, sich den Code mal in ganze deutsche Sätze zu übersetzen. Mit ein wenig Kenntnis der deutschen Sprache wird einem schnell Vieles klar, unter Anderem auch das, was Roger Wilco und ich bereits bemängelt haben...
 
Hallo also habs jetzt ma einwenig umgeschrieben, hoffentlich versteht dann jeder was gemeint ist, eigentlich hätte ich es auch bei eine recht ausgeschriebenen if abfrage lassen können aber danke nochma für die switch sache, habs jetzt so drin:

p.s. zu meinen deutsch kenntnissen etc., ich wohne seit 3 jahren in den usa hab habe leider dort keinen kontakt zu deutschen, seitdem her verlern ich langsam die deutsche sprache....

PHP:
switch ($include_php) {
    case "admserver":
        if($user_level != "Super Administrator") {
            $include_php = "main";
            $errors[] = "<h2>".$messages["17"]."</h2>";
        }
        break;
    case "admradio":
        if($user_level != "Super Administrator") {
            if ($user_level != "Reseller") {
                $include_php = "main";
                $errors[] = "<h2>".$messages["17"]."</h2>";
            }
        }
        break;
    case "admuser":
        if($user_level != "Super Administrator") {
            if ($user_level != "Reseller") {
                $include_php = "main";
                $errors[] = "<h2>".$messages["17"]."</h2>";
            }
        }
        break;
}
 
Ich hab den Fehler gefunden, juhuuu!!!

Also wenn Userlevel Administrator ist, kann es ja nicht gleichzeitig Reseller sein, d.h. wo ich angegeben habe, user_level!=Admin || user_level!=Reseller angegeben habe, wurden dabei immer beide Bedingungen erfüllt. Man hätte einfach nur && schreiben müssen... Juhu also hier ist der funktionierende if code:

PHP:
if (($include_php == "admserver") || ($include_php == "admradio") || ($include_php == "admuser")) {
    if (($include_php == "admserver") && ($user_level!="Super Administrator")) {
        $include_php = "main";
        $errors[] = "<h2>".$messages["17"]."</h2>";
    }
    elseif ((($include_php == "admradio") || ($include_php == "admuser")) && (($user_level!="Super Administrator") && ($user_level!="Reseller"))) {
        $include_php = "main";
        $errors[] = "<h2>".$messages["17"]."</h2>";
    }     
}

Danke nochma an euch alle!!!
 
p.s. zu meinen deutsch kenntnissen etc., ich wohne seit 3 jahren in den usa hab habe leider dort keinen kontakt zu deutschen, seitdem her verlern ich langsam die deutsche sprache....
Dann halt Englisch, oder Spanisch, oder Französisch, oder... Das Prinzip ist immer das Gleiche.

PS: switch ist eleganter und schneller...
 
Back
Top