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

"false" und "0"

rapid10

Mitglied
Hallo,

eine kurze Frage: ich möchte einen Steuersatz in der Datenbank speichern. Es wird geprüft, ob der eingegebene String korrekt ist. Falls er falsch ist, wird das Feld rot umrandet. Gibt man aber nun 0 ein, wird zwar problemlos gespeichert, aber das Feld wird rot umrandet.

Warum nur? Anscheinend interpretiert PHP 0 ebenfalls als false. Habe schon probiert, mit Konvertierung zu arbeiten, hat aber leider nicht funktioniert.

PHP:
#Zuerst wird geprüft…
if(!$VALIDATE->checkNumber($_POST['taxrateEdit'], 'Steuersatz'))
{
	$taxrate = false;
}

#…dann ggf. rot umrandet
if($taxrate === false)
{
	$style['3'] = "style='border-color: #900;'";
}
Hat da jemand eine Ahnung, warum das so abläuft? Wenn man z.B. "19" eingibt, läuft das alles ohne Probleme.

Was mir noch einfällt, ich prüfe in einer Methode, ob der eingegebene Wert größer 0 ist, vielleicht hängt das ja damit zusammen, aber speichern tut er brav, aber eben mit Umrandung.

Danke für euere Hilfe!
 
Werbung:
Ich hätte gerne mal die Methode checkNumber gesehen. Und natürlich würde die Prüfung auf größer 0 erklären wieso es mit 0 nicht funktioniert ;)
 
Werbung:
Ah, danke! Habe es jetzt mal schnell gepatcht das Problem.
Ob das Feld ausgefüllt wurde, wird so geprüft:
PHP:
#vorher
if(strlen($value) > 0)

#nachher
if(strlen((string) $value) > 0)
Ist das unschön? Aber anders kann man anscheinend PHP nicht mitteilen, dass auch 0 ein Zeichen ist. :)
 
Könntest du das vielleicht mal von vorne bis hinten posten? Das sind irgendwie (mal wieder ;)) nur so zusammenhangslose Schnippsel, die uns nicht wirklich genug verraten, um dir sinnvoll helfen zu können.

Es fängt mit $_POST-Daten an, vermute ich?
 
Hast dus schon mal probiert mit einfach == ''
Also ob der string leer ist

Wenn du nen int ins if schmeist ist alles true auser 0
Das kannst du umgehen wenn du auch auf type($var=== false) checkst, aber ein leerer string wird da dann auch true ergeben
Probier das obere und gib bescheid wenns nicht funktioniert, so ist das in allen meinen Abfragen ;)


Gruss
 
Werbung:
Natürlich :). Obwohl ich dachte, dass das reicht. ;) Danke für euere Hilfe!
PHP:
#die Methode checkNumber()…
public function checkNumber($value, $label)
{
	self::clean($value);
	self::injection($value, $label);
	if(strlen($value) > 0)
	{
		if(preg_match($this->pattern_number, $value))
		{
			return $value;
		}
		else
		{
			$this->input_error[$label] = self::INPUT_ERROR_FORMAT;
			return false;
		}
	}
	else
	{
		$this->input_error[$label] = self::INPUT_ERROR_EMPTY;
		return false;
	}
}

#Steuersatz checken
if(!$VALIDATE->checkNumber($_POST['taxrateEdit'], 'Steuersatz'))
{
	$taxrate = false;
}

#Umrahmung erstellen
if($taxrate === false)
{
	$style['3'] = "style='border-color: #900;'";
}
EDIT: Wenn ich in der Methode checkNumber() $value als string definiere, funktioniert es bestens.
 
Also: Du hast eine Eingabe, die du darauf überprüfen möchtest, ob sie numerisch ist. Dazu willst du eine Methode schreiben, die true zurückgibt, wenn die Eingabe numerisch ist, ansonsten false.

Dazu stellt PHP beispielsweise diese Funktion bereit: PHP: is_numeric - Manual

(Eventuell auch filter_var: PHP: Validate filters - Manual)

Deine bestehende Methode macht mehrere Dinge, die eigentlich nichts damit zu tun haben, zu prüfen, ob ein Wert eine Zahl ist.

PHP:
self::clean($value);
self::injection($value, $label);
 
Oh doch und zwar:
PHP:
#Suchmuster für Zahlen
protected $pattern_number = "/^\d+$/";

if(preg_match($this->pattern_number, $value))
{
     return $value;
}
Hatte ich vergessen zu posten, sorry.
 
Werbung:
Ich meinte explizit diese beiden Aufrufe:

PHP:
self::clean($value);
self::injection($value, $label);

Die haben nichts mit der Frage zu tun, ob eine Eingabe eine Nummer ist.

Was tun die beiden Methoden denn? Das hängt immer noch alles sehr in der Luft.
 
Mit diesen Methoden wird die Eingabe auf Injections untersucht (und bereinigt) bzw. wird die Eingabe getrimmt.
Wenn kein Fehler aufgetreten ist, wird der eingegebene Wert zurückgegeben und ich kann diesen verarbeiten.
 
Diese beiden Bedingungen geben jedenfalls beide true zurück.

PHP:
$value = "0";

var_dump(strlen($value) > 0);

var_dump(strlen((string) $value) > 0);

Das Problem liegt also anderswo.
 
Werbung:
Wenn dann müsste das doch so lauten, oder?
PHP:
$value = 0;

var_dump(strlen($value) > 0);

var_dump(strlen((string) $value) > 0);
Und dann kommt sicherlich nicht das selbe raus.

EDIT: Eine Frage an dich: wie würdest du das denn lösen? Eine Klasse, die sich um die Sicherheit kümmert, also escapen, auf Injections prüfen, usw. oder lieber direkt in der SQL-Abfrage escapen, … Würdest du meine Variante, also zentral alles prüfen bevorzugen? Deshalb gebe ich ja nicht true zurück, wenn bspw. eine Zahl also ok befunden wurde, sondern $value, den Wert der eingegeben wurde. Danke für deine Hilfe!
 
Zuletzt bearbeitet:
POST-Felder enthalten keine Integer, sie enthalten nur Strings oder Arrays. Wenn du da (int) 0 statt (string) "0" in der Variablen hast, liegt das an einem Stück Code, das du bisher noch nicht gezeigt hast.

wie würdest du das denn lösen?

Ich würde die Zuständigkeiten trennen, also nicht an derselben Stelle die Eingabe validieren („ja, wir haben eine Zahl“) und sie für das Einsetzen in eine SQL-Query aufbereiten. Letzteres würde ich erst direkt beim Generieren des Query-Strings erledigen.

Hintergrund ist auch, dass du mit dem Wert ja vielleicht in der Anwendung noch etwas anderes tun willst, als ihn in eine SQL-Query einzusetzen. Dann müsstest du etwaiges Escaping für SQL wieder rückgängig machen.
 
Ja, muss ich dir recht geben. :) Blöd von mir.

Das zweite sehe ich auch ein. Klingt logisch. Und wo sollte ich trimmen? Also die Leerzeichen am Anfang und Ende entfernen? Ich hätte es auch in der SQL-Anweisung gemacht.
 
Werbung:
Glaube, darüber lässt sich streiten. Ich schneide Whitespace vorne und hinten meist im Zuge der Validierung „aus Kulanz“ weg und tue so, als sei die Eingabe ohne den Whitespace gesendet worden.
 
Gut, werde mir anschauen, wie das am besten zu lösen ist. Danke!
Leider habe ich noch immer das Problem mit 0 und false. Das ist hier meine Methode mit der ich prüfe und bereinige:
PHP:
#Suchmuster für Zahlen
	protected $pattern_number = "/^\d+$/";

#Suchmuster für zu bereinigende Variabeln
	protected $clean_pattern = array( 	"/(\r\n)|(\r)/m",
										"/(\n){3,}/m",
										"/\s{3,}/m",
										"/(.)\\1{15,}/im" );
											  
	#Ersatz für zu bereinigende Variabeln
	protected $clean_replace = array(	"\n",
										"\n\n",
										" ",
										"\\1" );

private function clean($value)
	{
		if(get_magic_quotes_gpc())
		{
			$value = stripslashes($value); 
		}
		$value = trim($value);
		$value = preg_replace($this->clean_pattern, $this->clean_replace, $value);
		$value = wordwrap($value, 45, " ", true);
		return $value;
	}

public function checkNumber($value, $label, $empty = false)
	{
		self::clean($value);
		if($empty === true)
		{
			return true;
		}
		if(strlen($value) > 0)
		{
			if(preg_match($this->pattern_number, $value))
			{
				return $value;
			}
			else
			{
				$this->input_error[$label] = self::INPUT_ERROR_FORMAT;
				return false;
			}
		}
		else
		{
			$this->input_error[$label] = self::INPUT_ERROR_EMPTY;
			return false;
		}
	}
Hoffe es hilft ein wenig. Das mit (string) davor hilft wirklich nichts. Hast du aber eh schon vorher bemerkt. Danke!
 
Versuch mal bitte möglichst komplett in Worten zu formulieren, was checkNumber('0', 'demo'); machen soll.
 
Werbung:
Werde ich machen.

Also, checkNumber('0', 'demo') soll prüfen, ob der eingegebene Wert ('0') eine gültige Zahl ist. Eine gültige Zahl darf nur eine ganzzahlige Zahl sein (also kein 10.5 bspw.). Dies ist in pattern_number angegeben. Wenn dem nicht so ist, wird eine vordefinierte Fehlermeldung und false zurückgegeben. Ist die Zahl korrekt, wird die Zahl – bereinigt (private Methode "clean") – zurückgegeben. Also wird in dem Fall "0" als Wert zurückgegeben.

Prüfen tue ich das dann so:
PHP:
if(!$VALIDATE->checkNumber('0', 'demo'))
{
	$demo = false;
}
 
Gnpf, falsche Taste, sorry
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben