Wert soll nicht "" oder " " sein. O_ó

LRK

Erfahrenes Mitglied
Ahoi.
Ich bin doof und finde den Fehler nicht - Hilfe. Ich möchte eigentlich nur abfragen ob ein vom Nutzer eingegebener Wert entweder = "" oder = " " und damit ungültig ist. Sollte eigentlich einfach sein aber aus irgendeinem Grund finde ich nicht herraus, warum es in meinem Konstrukt nicht richtig funktioniert...

Etwas mehr Kontext:
Gegeben seien ein zweidimensionales Array folgender Machart:
Code:
$produkte=array
	(
	"Visitenkarte"=>array("Breite"=>85,"Höhe"=>55,"Preis"=>0.10),
	"Flugblatt"=>array("Breite"=>210,"Höhe"=>297,"Preis"=>0.70),
	"Plakat"=>array("Breite"=>297,"Höhe"=>420,"Preis"=>1.50),
	"Postkarte"=>array("Breite"=>120,"Höhe"=>80,"Preis"=>0.40),
	"Aufkleber"=>array("Breite"=>200,"Höhe"=>50,"Preis"=>0.85),
	);
?>
Der Nutzer soll im späteren Verlauf über ein Formular weitere Produkte hinzufügen können. Dabei soll eben schon direkt zu anfang darauf geachtet werden, dass er als Bezeichnung nicht aus Versehen "" oder " " angibt.

Die Abfrage schaut so aus:
Code:
if(isset($_POST["submit"]) and isset($_POST["produkt"]))
	{
	echo'<script>alert("submit und produkt sind vorhanden (Toi toi toi).")</script>';
	if($_POST["produkt"]!="" or $_POST["produkt"]!=" ")
		{
			echo'<script>alert("produkt ist ungleich LEER oder ungleich LEERZEICHEN.")</script>';
			$alles_ok=true;
			foreach($produkte as $key=>$value)
				{
				if($_POST["produkt"]==$key)
					{
					echo'Der Artikel "'.$_POST["produkt"].'" ist schon in der Liste enthalten.';
					$alles_ok=false;
					}
					else
					{
					//tu nichts
					}
				}
			if($alles_ok==true)
				{
				echo'<script>alert("alles_ok ist auf true.")</script>';
				echo'Der Wert "'.$_POST["produkt"].'" kann hinzugefügt werden.';
				}
				else
				{
				echo'<script>alert("alles_ok ist auf false.")</script>';
				}
		}
		else
		{
		echo'Der Wert vom Bezeichner ist leer oder nur ein Leerzeichen. Bitte abändern.';
		}
	}
	else
	{
	echo'Um ein Produkt zu verändern oder ein neues Produkt hinzuzufügen füllen Sie bitte die Felder aus.';
	}
So, jemand eine Idee was da schiefläuft? Wäre cool wenn das endlich weiterginge...
 
Was auch immer das Fehlverhalten ist, filter_input() währe eine elegante Lösung
PHP:
//Filterargument definieren
//Der RegExp \s*\S+\s*: http://stackoverflow.com/a/6208406
$filArgProduct = array('options'=>array('regexp'=>'\s*\S+\s*'));
//Filter anwenden. Im True-Fall ist in $produkt der Usereintrag
if($product=filter_input(INPUT_POST,'product',FILTER_VALIDATE_REGEXP,$filArgProduct)){
    //TODO: gültiges Product
    echo $product;
}else{
    echo 'ungültig';
}
}
 
Hallo LRK

FYI:
PHP:
if($_POST["produkt"]!="" or $_POST["produkt"]!=" ")

Diese Abfrage ist immer true. Wenn es "" ist, dann ist der erste falsch aber der zweite richtig, wenn es " " ist ist der erste Teil richitig, der zweite falsch. Was du eigentlich wolltest war ein 'and' und nicht ein 'or'. Es muss ja beides erfüllt sein und nicht nur eines davon.

Viele Grüsse
Cromon
 
Hab dein Script nochmals angeschaut.
Mit einem CALLBACK-Filter kannst du gleich alle Bedinungen einfach einpacken
PHP:
if($product=filter_input(INPUT_POST,'product',FILTER_CALLBACK,array('options'=>'filterProduct'))){
    //TODO: gültiges Product
    echo $product;
}else{
    echo 'ungültig';
}

function filterProduct($iProduct){
    //Auf Leerzeichen prüfen
    if(preg_match ('\s*\S+\s*' , $iProduct)===0) return false ;
    //Gegen die Keys von $products prüfen
    if(in_array($iProduct, array_keys($GLOBALS['products']))) return false;
    //Gültig, ergo das Produkt zurückgeben:
    return $iProduct;
}
 
Sieht interessant aus. Solche Filter wären im PHP-Kurs sicher sinnvoll gewesen. Danke soweit.
 
Hallo LRK

FYI:
PHP:
if($_POST["produkt"]!="" or $_POST["produkt"]!=" ")

Diese Abfrage ist immer true. Wenn es "" ist, dann ist der erste falsch aber der zweite richtig, wenn es " " ist ist der erste Teil richitig, der zweite falsch. Was du eigentlich wolltest war ein 'and' und nicht ein 'or'. Es muss ja beides erfüllt sein und nicht nur eines davon.

Viele Grüsse
Cromon

Ah, vielen Dank. Ich hatte eigentlich gehofft solche Semantik-Fehler nicht mehr zu machen. ^^'
Geil. Danke.
 
Angenommen, der "Produktname" hat sowieso keine Leerzeichen, sprich es ist ein Wort, höchstens ein Bindestrich. Dann könntest Du auch vor dem Vergleich alle Leerzeichen löschen (str_replace()) und die Abfrage minimiert sich eh auf ""

(Was aber in Anbetracht des Fachbereichs eher unelegant ist, da kommen auch Produkte wie "DIN A4 quer" etc pp) Ist vielleicht Stringlänge unter 4 eine Möglichkeit?
 
Eigentlich ist eine Prüfung auf Leerzeichen nicht notwendig, da anschließend offenbar nur die Eingabe angenommen wird, für die es ein Gegenstück in einem Array von Produkten gibt. Wenn es keine Elemente nur mit Leerzeichen im Array gibt, genügt die Prüfung, ob die Eingabe als Element im Array existiert. IMHO.
 
Zurück