prüfen ob variable zeichen enthält...
selma
- php
0 ichen0 Götz0 Tom
0 Tom0 Viennamade0 Tom0 Viennamade0 Tom
0 Tom
hallo!
ich schreibe mir gerade ein gästebuch script auf .txt-datei basis. ich habe aber hier folgendes problem: es gibt pflicht und optionale felder. wenn ich ein pflichtfeld nicht ausfüll soll eine fehlermeldung ausgegeben werden. - das passiert auch, aber es werden die daten der eingegebenen fehler trotzdem in eine .txt gespeichert und das obwohl mind. eine variable nicht 'existiert'... - weiß jemand von euch wie ich das problem lösen kann, dass wenn ein feld nicht ausgefüllt wurde es einfach abbricht?
ich hatte es mit einer do while schleife so probiert:
if(sendebtn gedrückt) {
do {
$name = $_POST['name'] //variablenübergabe
...
echo 'Füll alle mit * markierten Felder aus!';
}
while(!isset($pflichtvar) || !isset($pflichtvar) || !isset($pflichtvar));
was mach ich falsch?
mlg
selma
Moin!
schreibe es doch so:
if(submit_gedrückt){
if(empty($pflichtvar1)){
echo "fehler";
} elseif (empty($pflichtvar1)){
echo "fehler";
} else {
//schreibe daten in .txt-datei
}
}
tschüss ichen
Hallo selma!
[...] dass wenn ein feld nicht ausgefüllt wurde es einfach abbricht?
if(sendebtn gedrückt) {
do {
$name = $_POST['name'] //variablenübergabe
...
echo 'Füll alle mit * markierten Felder aus!';
}
while(!isset($pflichtvar) || !isset($pflichtvar) || !isset($pflichtvar));
Ich würd einfach folgendes schreiben:
if (sendbutton-bla && isset($pflichtvar1) && !empty($pflichtvar1) && isset($pflichtvar2) && !empty($pflichtvar2) && ...) {
// alle Felder ausgefuellt -> Datei schreiben
} else {
// Fehler -> Datei nicht schreiben -> Fehlermeldung ausgeben
}
Sollte eigentlich problemlos klappen.
MfG
Götz
Hello,
Ich würd einfach folgendes schreiben:
if (sendbutton-bla && isset($pflichtvar1) && !empty($pflichtvar1) && isset($pflichtvar2) && !empty($pflichtvar2) && ...) {
// alle Felder ausgefuellt -> Datei schreiben
} else {
// Fehler -> Datei nicht schreiben -> Fehlermeldung ausgeben
}
Lieber Götz, dann empfehle ich Dir auch nochmal das Manual ;-))
siehe mein Posting
Empty() beinhaltet die Prüfung auf isset() außerdem.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hello,
while(!isset($pflichtvar) || !isset($pflichtvar) || !isset($pflichtvar));
was mach ich falsch?
Du liest das Manual nicht aufmerksam genug ;-))
isset() prüft, ob eine Variable in der Variablentabelle gelistet ist, also angelegt wurde.
Nur dann darf man "ungestraft" darauf zugreifen. Die Variable enthält entweder
den Initialisierungswert, NULL oder false.
Wenn man nun etwas hineinschreibt, kann man das mit
empty() prüfen. Die Funktion empty() liefert nämlich nur solange true, wie
- die Variable nicht vohanden ist ( isset() ist also inclusiv *gg*)
- Die Variable '' enthält
- Die Variable NULL enthält
- Die Variable false enthält
- ACHTUNG: die Variable 0 enthält.
Empty() ist also nicht geeignet, numerische Variablen zu überprüfen, die als gültigen Wert
auch die 0 haben!
strlen() prüft die Länge der in der Variablen vorhandenen Daten.
aber Achtung: Leerzeichen sind auch Zeichen und mindestens in Textareas werden
die auch übertragen
(isset($var) and strlen(trim($var))>0) ist die einzige mit bekannte vernünftige Methode,
um auf das Vorhandensein "sichtbarer Zeichen" zu prüfen.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo Tom!
Die Funktion empty() liefert nämlich nur solange true, wie
- die Variable nicht vohanden ist ( isset() ist also inclusiv *gg*)
- Die Variable '' enthält
- Die Variable NULL enthält
- Die Variable false enthält <------
- ACHTUNG: die Variable 0 enthält.Empty() ist also nicht geeignet, numerische Variablen zu überprüfen, die als gültigen Wert
auch die 0 haben!
--> Ich begebe mich jetzt in unsicheres Terrain, aber ich frage ja auch nicht, um darüber weiterzudiskutieren, sondern um etwas zu verstehen!
Ist das nicht ein Designfehler, daß empty bei false ein true liefert? Ist false in php nur der Ziffer 0 gleichwertig (also boolean kein "richtiger" Datentyp)?
Also bis jetzt hätte ich false als Wert angesehen und wundere mich daß empty dazu true sagt. Denn ein Boolean ist doch ein Wahrheitswert - und kann, so sah ich das bis jetzt, nie empty sein.
Beste Grüße
Viennamade
Hello,
Die Funktion empty() liefert nämlich nur solange true, wie
- die Variable nicht vohanden ist ( isset() ist also inclusiv *gg*)
- Die Variable '' enthält
- Die Variable NULL enthält
- Die Variable false enthält <------
- ACHTUNG: die Variable 0 enthält.Empty() ist also nicht geeignet, numerische Variablen zu überprüfen, die als gültigen Wert
auch die 0 haben!--> Ich begebe mich jetzt in unsicheres Terrain, aber ich frage ja auch nicht, um darüber weiterzudiskutieren, sondern um etwas zu verstehen!
Ist das nicht ein Designfehler, daß empty bei false ein true liefert? Ist false in php nur der Ziffer 0 gleichwertig (also boolean kein "richtiger" Datentyp)?
Also bis jetzt hätte ich false als Wert angesehen und wundere mich daß empty dazu true sagt. Denn ein Boolean ist doch ein Wahrheitswert - und kann, so sah ich das bis jetzt, nie empty sein.
Mmmh: wie fang ich an?
Der boolesche Rückgabewert einer Funktion sollte erstmal von ihrem Namen abhängen, der tunlichst die Aufgabe der Funktion mnemonisch beschreiben sollte. Es würde dann in etwa gelten
___________
empty($var) = filled($var)
oder
____________
empty($var) = filled($var)
In PHP haben logische Variablen immer drei Zustände
dementsprechend haben skalare auch mehrere Eigenschaften
Man kann nun auch unterschiedliche Typen miteinander vergleichen
$logischerWert == $StringVariable
Der Operator == scheut hier nur nach, ob im String ein Wert > nichts, oder 0 vohanden ist und vergleicht das mit dem Eintrag im logischen Wert.
es gilt also
1 == 'inhalt' ==> true
Wenn man nun die automatische Typumwandlung ausschaltet und dadurch die übereinstimmung der Typen in die Überprüfung einbezieht, ergibt der obige Vergleich false. Das gescheiht durch Wechsel des Operators automatisch
1 === 'inhalt' ==> false
Darum muss man ja auch beispielsesie beim Scannen eines Verzeichnisses
while (false !== ($filename = readdir($dh)))
schreiben. Anderennfalls (while $filename = readdir($dh)) würde die Datei mjit dem Namen '0' die Schleife beenden.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo!
Danke für Deine Ausführungen!
Die Funktion empty() liefert nämlich nur solange true, wie
- die Variable nicht vohanden ist ( isset() ist also inclusiv *gg*)
- Die Variable '' enthält
- Die Variable NULL enthält
- Die Variable false enthält <------
- ACHTUNG: die Variable 0 enthält.Empty() ist also nicht geeignet, numerische Variablen zu überprüfen, die als gültigen Wert
auch die 0 haben!
Ist das nicht ein Designfehler, daß empty bei false ein true liefert? Ist false in php nur der Ziffer 0 gleichwertig (also boolean kein "richtiger" Datentyp)?
Also bis jetzt hätte ich false als Wert angesehen und wundere mich daß empty dazu true sagt. Denn ein Boolean ist doch ein Wahrheitswert - und kann, so sah ich das bis jetzt, nie empty sein.In PHP haben logische Variablen immer drei Zustände
- True
- False
- nicht benutzt (NULL)
Na schön, ich akzeptiere ;-) es halt, daß PHP für Booleans 3 Zustände kennt. Also hatte derjenige, der sagte »Die Wahrheit ist eine Tochter der Zeit« doch recht.
Beste Grüße
Viennamade
Hello,
Na schön, ich akzeptiere ;-) es halt, daß PHP für Booleans 3 Zustände kennt. Also hatte derjenige, der sagte »Die Wahrheit ist eine Tochter der Zeit« doch recht.
Das ist bei vielen Script-Sprachen so.
Access (also VBA) macht das ähnlich.
Eine funktional aufgebaute Hochsprache, die zudem noch sehr maschinennah ist, kann das nicht. Das geht erst in objektorientierten Modellen abzubilden.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo Tom!
Na schön, ich akzeptiere ;-) es halt, daß PHP für Booleans 3 Zustände kennt. Also hatte derjenige, der sagte »Die Wahrheit ist eine Tochter der Zeit« doch recht.
Das ist bei vielen Script-Sprachen so.
Access (also VBA) macht das ähnlich.
Eine funktional aufgebaute Hochsprache, die zudem noch sehr maschinennah ist, kann das nicht. Das geht erst in objektorientierten Modellen abzubilden.
Danke für die Info, da wird mir einiges klarer.
Beste Grüße
Viennamade
Hello Selma,
noch was am rande bemerkt:
Schreib mal in alle Deiner Scripte ganz oben
<?php
error_reporting(E_ALL);
ini_set('track_errors','1');
#...
?>
rein. Dann werden Dir (wenn der Provider nicht alle Einstellugen verkurbelt hat) alle Fehler und auch Hinweise angezeigt. Das track_errors führt dazu, dass im Fehlerfall bei I/O-Operationen die Variable $php_errormsg mit einer Klartext-Fehlermeldung gefüllt wird.
Die kann man dann mit
(if isset($php_errormsg) and strlen($php_errormsg)>0) echo $php_errormsg;
abfragen.
Das kann ganz sinnvoll sein.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Lieber Tom!
(if isset($php_errormsg) and strlen($php_errormsg)>0) echo $php_errormsg;
Das ergibt leider, logischerweise, einen Parse Error ("Parse error: parse error, unexpected T_IF").
Du solltest also noch ein wenig an der Klammersetzung arbeiten ;)
(Also, da prüf ich doch lieber doppelt, bevor mir ein Parse Error unter kommt *g*)
MfG
Götz
Hello,
(if isset($php_errormsg) and strlen($php_errormsg)>0) echo $php_errormsg;
Das ergibt leider, logischerweise, einen Parse Error ("Parse error: parse error, unexpected T_IF").
Du solltest also noch ein wenig an der Klammersetzung arbeiten ;)
Erwischt! Dammi nochmal! mach ich aber gerne, diese Klammern beim If vornme oder hinten zu vergessen. Zum Glück habe ich ja bei mir während der Entwicklung immer alle Fehlermeldungen eingeschaltet und bekomme vom Parser auf die Finger.
Ich ahbe heute wieder festgestellt, dass die PHP-Fehlerbearbeitung wirklich klasse funktioniert (seit meinem Update auf 4.3.8) Das einzige, was ich doof finde, sit der Bug mit $php_errormsg.
Manchmal bleibt die vorher explizit deklarierte Var erhalten und manchmal wird die von der Operation, die keinen fehler verurschat, einfach gelöscht (unset()).
Und ich würd eine eindeutige Fehlernummer bei I/O-Operationen begrüßen, damit man z.B. einfach ein fopen() durchführen kann, ohne Angst haben zu müssen, dass vielelicht jemand anderes gerade die Datei gelöscht hat nach meinem file_exists() und is_readable() und is_writable(), aber vor meinem fopen(). Die drei Abfragefunktionen benutze ich sowieso nicht gerne...
Harzliche Grüße aus http://www.annerschbarrich.de
Tom