if und xor - unlogisches Verhalten

dwex

Erfahrenes Mitglied
Hallo Leute,

ich habe ein (für mich) unlogisches Verhalten einer if-Abfrage.
Ich prüfe in einer if-Abfrage ob eine der Bedingungen wahr ist.
Die Abfrage sieht so aus:
PHP:
if($_POST['action'] != 'new' XOR $_POST['action'] != 'change' XOR $_GET['action'] != 'delete') {
	echo "Ungültige Parameterübergabe - das Script wurde aus Sicherheitsgründen angehalten.";
	exit;
}
Das funktioniert einwandfrei!

Jetzt möchte ich das ganze um eine weitere Prüfung erweitern.
Das ganze sieht dann so aus:
PHP:
if($_POST['action'] != 'new' XOR $_POST['action'] != 'change' XOR $_GET['action'] != 'delete' XOR $_GET['action'] != 'deletepicture') {
	echo "Ungültige Parameterübergabe - das Script wurde aus Sicherheitsgründen angehalten.";
	exit;
}
Das funktioniert jetzt nicht mehr!
Egal was ich übergebe meine if Abfrage ist immer wahr und somit wird der echo-Text ausgegeben.

Entweder hab ich Tomaten auf den Augen oder ich bin etwas doof geworden in letzer Zeit.
Kann jemand Helfen?
Vielen Dank im Voraus!
 
Zuletzt bearbeitet:
Hallo dwex,

...

//EDIT

ich glaube, Du solltest dich nochmal mit XOR auseinander setzen.

Wenn Du nur prüfen willst ob eine Bedingung zutrifft reicht OR.

Gruß
 
Zuletzt bearbeitet:
Genau das ist mein Problem mit OR funktioniert es nämlich auch nicht.
Hast du alle XOR durch OR ersetzt oder nur das letzte?

Davon abgesehen würde ich dir auch ganz schwer vom XOR abraten.
Weißt du eigentlich wieviele Möglichkeiten es gäbe damit das Statement true bzw. false zurück gibt?
Hier hast du mal die Wahrheitstabelle dafür:
Code:
 A | B | C | D | ((A ^ B) ^ C) ^ D 
---+---+---+---+-------------------
 0 | 0 | 0 | 0 |     0    0    0   
 0 | 0 | 0 | 1 |     0    0    1   
 0 | 0 | 1 | 0 |     0    1    1   
 0 | 0 | 1 | 1 |     0    1    0   
 0 | 1 | 0 | 0 |     1    1    1   
 0 | 1 | 0 | 1 |     1    1    0   
 0 | 1 | 1 | 0 |     1    0    0   
 0 | 1 | 1 | 1 |     1    0    1   
 1 | 0 | 0 | 0 |     1    1    1   
 1 | 0 | 0 | 1 |     1    1    0   
 1 | 0 | 1 | 0 |     1    0    0   
 1 | 0 | 1 | 1 |     1    0    1   
 1 | 1 | 0 | 0 |     0    0    0   
 1 | 1 | 0 | 1 |     0    0    1   
 1 | 1 | 1 | 0 |     0    1    1   
 1 | 1 | 1 | 1 |     0    1    0
Die letzte Spalte ist das Ergebnis
 
Ich hatte natürlich alle OR durch XOR ersetzt.
Mir ist das mit der Wahrheitstabelle schon klar aber als ich das ursprünglich programmiert habe hat das mit OR auch schon nicht funktioniert - deshalb bin ich auf XOR ausgewichen.
 
Da muss doch auch letztendlich ein and hin und kein or:
PHP:
if(($_POST['action'] !== 'new') && ($_POST['action'] !== 'change') && ($_GET['action'] !== 'delete') && ($_GET['action'] !== 'deletepicture')) {
    echo "Ungültige Parameterübergabe - das Script wurde aus Sicherheitsgründen angehalten.";
    exit;
}
 
das mit and kann doch nicht funktionieren - oder?
Vielleicht probierst du es einfach mal aus?
einfach nur crack hat schon recht.

es können doch nicht alle wahr sein -
Und wieso nicht?
Wenn $_POST['action'] nicht 'new' und nicht 'change' ist und $_GET['action'] nicht 'delete' und nicht 'deletepicture' ist dann (haben wir wohl eine ungültige Parameterübergabe) und die Behauptung ist wahr.
Die Art und Weise wie du prüfst erinnert mich irgendwie an doppelt und dreifache Verneinung.
Warum einfach wenns auch kompliziert geht.
 
Zurück