andere Möglichkeit für Sprungmarke
inspiron
- php
Hallo,
ich weiß nicht weiter und benötige Hilfe um folgendes zu lösen.
Was muß ich verändern damit ich "$sql = "INSERT INTO.......";" nicht zwei mal schreiben muß?
Gruß
if (isset($_POST["eintragen"]))
{
$errors = array();
//variablen auf inhalt prüfen und ggf. den fehler in das array $errors packen
if ($_POST["Schicht"] == "") {
$errors[] = "Schicht";
}
if ($_POST['FEHLERKATEGORIE'] == "") {
$errors[] = "Kategorie";
}
// ist ein fehler aufgetreten?
if (count($errors) > 0) {
//wenn ja, fehler ausgeben
$Meldung_1 = 'Sie müssen folgende Felder ausfüllen!<br />' . implode(', ', $errors);
} else {
//fragen ob "alles i.O." ausgewählt wurde
if ($_POST['FEHLERKATEGORIE'] == "alles i.O.") {
//wenn "alles i.O", weiter machen & Daten speichern
$Meldung_2 = "So,<br> Daten werden in der Datenbank gespeichert!<br>";
.
.
// es gibt keine Sprungmarke, wie weiter?
$sql = "INSERT INTO.......";
} else {
//wenn nicht,fragen ob in Beschreibung etwas drin steht
if ($_POST['BESCHREIBUNG'] == "") {
$Meldung_3 = 'Sie müssen das Feld Beschreibung ausfüllen!<br />';
} else {
//wenn ja, weiter machen & Daten speichern
$Meldung_4 = "So,<br> jetzt kann alles in der Datenbank gespeichert werden!<br>";
.
.
// es gibt keine Sprungmarke, wie weiter?
$sql = "INSERT INTO.......";
}
}
}
}
Hi,
ich weiß nicht weiter und benötige Hilfe um folgendes zu lösen.
Ist der bisherige Code von dir?
Was muß ich verändern damit ich "$sql = "INSERT INTO.......";" nicht zwei mal schreiben muß?
Eine Abfrage, ob ein Fehler aufgetreten ist, bzw. in welcher Anzahl, hast du doch schon drin.
Was hält dich davon ab, nach der gleichen Logik nicht nur mit den ersten Fehlern zu verfahren, sondern auch mit ggf. weiteren, folgenden?
Potentielle Fehler abfragen, Anzahl/Status sammeln - und am Ende ein Mal auswerten, und davon abhängig INSERT oder nicht.
Hast du schon etwas gegen die Problemtaik der SQL Injection unternommen? Wenn nicht, ist das deine nächste Baustelle.
MfG ChrisB
Hi,
ich weiß nicht weiter und benötige Hilfe um folgendes zu lösen.
Ist der bisherige Code von dir?
Nein,
ich möchte nur eine weitere Abfrage einfügen, wenn Selectfeld "FEHLERKATEGORIE" alles andere als "alles i.O." ausgewählt (dort befinden sich ca 15 Fehlerangaben zur Auswahl) dann darf Textfeld "BESCHREIBUNG" nicht leer sein.
Um das so zu machen wie Du vorschlägst, müßte ich dann alle 15 Fehlerangaben vergleichen, oder?
Gruß
Moin!
Hi,
ich weiß nicht weiter und benötige Hilfe um folgendes zu lösen.
Ist der bisherige Code von dir?
Nein,
ich möchte nur eine weitere Abfrage einfügen, wenn Selectfeld "FEHLERKATEGORIE" alles andere als "alles i.O." ausgewählt (dort befinden sich ca 15 Fehlerangaben zur Auswahl) dann darf Textfeld "BESCHREIBUNG" nicht leer sein.Um das so zu machen wie Du vorschlägst, müßte ich dann alle 15 Fehlerangaben vergleichen, oder?
Nö.
if (true
&& (! 'alles i.O.' == $_POST['FEHLERKATEGORIE'])
&& (''==trim($_POST['BESCHREIBUNG']))
) {
beschwerde('Das Textfeld "BESCHREIBUNG" darf nicht leer sein, wenn es Beschwerden gibt.');
}
## irgendwo...
function beschwerde($str) {
die '<p style="color:red">'.$str.'</p>';
}
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix
...ach,
zu gleich gepostet, ich schaue mir das zu Hause mal an.
Danke
Hi fastix.
if (true && [...])
???
Viele Grüße,
der Bademeister
Moin!
if (true && [...])
???
Dient nur der übersichtlichen Notation. Mach ich vor allem dann wenn es mal wieder "ein paar" Bedingungen mehr werden.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix
if (true
&& (! 'alles i.O.' == $_POST['FEHLERKATEGORIE'])
&& (''==trim($_POST['BESCHREIBUNG']))
) {
beschwerde('Das Textfeld "BESCHREIBUNG" darf nicht leer sein, wenn es Beschwerden gibt.');
}
> MFFG (Mit freundlich- friedfertigem Grinsen)
>
> fastix
Hallo,
kannst Du mir das bitte mal übersetzen, was das passiert!
Danke & Gruß
Hi,
kannst Du mir das bitte mal übersetzen, was das passiert!
Frage du bitte konkret, wenn du einzelne Bestandteile nicht verstehst.
Versuche aber bitte vorher, dich selber zu informieren.
MfG ChrisB
Moin!
if (true
wenn wahr wahr ist (... also immer)
dann prüfe ob $_POST['FEHLERKATEGORIE'] auch den String ''alles i.O.' enhält.
&& (! 'alles i.O.' == $_POST['FEHLERKATEGORIE'])
dann prüfe ob auch der getrimmte Inhalt von $_POST['BESCHREIBUNG'] (also das Formularfeld "Beschreibung") ein leerer String ist
&& (''==trim($_POST['BESCHREIBUNG']))
und wenn das alles zutrifft
) {
beschwerde('Das Textfeld "BESCHREIBUNG" darf nicht leer sein, wenn es Beschwerden gibt.');
}
führe die Funktion "beschwerde" mit dem String als Argument aus.
> kannst Du mir das bitte mal übersetzen, was das passiert!
Kann es sein, dass Du noch sehr weit am Anfang des Lernens stehst?
Natürlich lässt sich das als Einzeiler notieren:
`if ('alles i.O.' != $_POST['FEHLERKATEGORIE'] && ''==trim($_POST['BESCHREIBUNG'])){ beschwerde('Das Textfeld "BESCHREIBUNG" darf nicht leer sein, wenn es Beschwerden gibt.');}`{:.language-php}
... ist aber nicht sehr übersichtlich.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix
--
[Des fastix kleines CMS](http://www.fastix.org/fastix-cms/)
Hallo,
aber dann isses doch so wie folgendes, oder?
if ($_POST['FEHLERKATEGORIE'] != "alles i.O." and $_POST['BESCHREIBUNG'] == "" ) {
$errors[] = "Beschreibung";
}
Danke für Deine Bemühungen!
Gruß
Moin!
Hallo,
aber dann isses doch so wie folgendes, oder?
if ($_POST['FEHLERKATEGORIE'] != "alles i.O." and $_POST['BESCHREIBUNG'] == "" ) {
$errors[] = "Beschreibung";
}
>
> Danke für Deine Bemühungen!
Nicht ganz. Der and- Operator und der &&- Operator haben zwei verschiedene Bedeutungen:
if (Bedingung1 and Bedingung2) -> Es werden immer beide Bedingungen geprüft.
if (Bedingung1 && Bedingung2) -> Bedingung2 wird nur geprüft, wenn Bedingung1 erfüllt ist.
Das mag nur wirklich zum Tragen kommen, wenn Bedingung2 eine Funktionsausführung ist, ist aber schon ein wesentlicher Unterschied:
Beispiel mit "&&":
~~~php
if (
isset ($text)
&& '' != $text
&& file_put_contents($datei, $text)
) {
echo "Text wurde nach Datei geschrieben.";
} else {
echo "Es wurde nichts an der Datei verändert.";
}
Hier würde also gar nicht erst versucht $text auf den Inhalt zu prüfen, wenn die Variable nicht besetzt ist.
Nachfolgend würde gar nicht erst versucht den Inhalt von $text in die Datei zu schreiben, wenn dieser leer ist.
also wäre das ein:
if (isset($text)) {
if ('' != $text) {
if (file_put_contents($datei, $text)) {
echo "Text wurde nach Datei geschrieben.";
}
}
}
Beispiel mit "AND":
if (
isset ($text)
and '' != $text
and file_put_contents($datei, $text)
) {
echo "Irgend etwas oder nichts wurde nach Datei geschrieben.";
} else {
echo "Die Datei ist unverändert.";
}
Es würde geprüft ob $text besetzt ist UND es würde geprüft ob $text einen Inhalt hat (also auch die Notiz geworfen, dass $text nicht definiert sei) UND es würde versucht in die Datei zu schreiben.
Das entspricht also Folgendem:
$flag=false;
if (isset($text)) {
$flag=true;
}
if ('' != $text) {
$flag=true;
}
if (file_put_contents($datei, $text)) {
$flag=true;
}
if ($flag) {
echo "Irgend etwas, vielleicht auch nichts, wurde geschrieben."
} else {
echo "Die Datei ist unverändert.";
}
if (''==$text)
ist zwar formal das gleiche wie if ($text=='')
aber es _soll_ so notiert werden, dass er fixe Wert links steht damit man beim Vergessen eines Zeichens if ($text='')
nicht den Inhalt der Variable löscht und - das klappt ja stets sehr gut - immer ein true zurück bekommt. Solche Fehler sind nämlich _sehr_ schwer zu finden, werden ja auch nicht als Typo reklamiert. Wie auch.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix
Hallo,
Der and- Operator und der &&- Operator haben zwei verschiedene Bedeutungen:
if (Bedingung1 and Bedingung2) -> Es werden immer beide Bedingungen geprüft.
if (Bedingung1 && Bedingung2) -> Bedingung2 wird nur geprüft, wenn Bedingung1 erfüllt ist.
woraus liest du das? AFAIK liegt der einzige Unterschied in der Rangfolge/Priorität der Operatoren.
So long,
Martin
Moin!
woraus liest du das?
Verdammt. Falsche Programmiersprache oder schlechtes Lehrbuch... ich weiß es jetzt auch nicht.
Jedenfalls fast Du Recht, wie folgender kleiner Test ergibt:
<?php
error_reporting(E_ALL);
print "\nfalse AND foo()? ";
if (false AND foo()) {;}
print "\n\ntrue AND foo()? ";
if (true AND foo()) {;}
print "\n\nfalse && foo()? ";
if (false && foo()) {;}
print "\n\ntrue && foo()? ";
if (true && foo()) {;}
print "\n\nfalse or foo()? ";
if (false or foo()) {;}
print "\n\ntrue or foo()? ";
if (true or foo()) {;}
print "\n\nfalse || foo()? ";
if (false || foo()) {;}
print "\n\ntrue || foo()? ";
if (true || foo()) {;}
function foo() {
print "foo!";
return true;
}
print "\n\n";
?>
false AND foo()?
true AND foo()? foo!
false && foo()?
true && foo()? foo!
false or foo()? foo!
true or foo()?
false || foo()? foo!
true || foo()?
Das bedeutet - entgegen meiner Irrung - dass der rechte Vergleich nicht mehr stattfindet (foo() nicht ausgeführt wird) wenn die Bedingung erfüllt ist oder nicht mehr erfüllt werden kann.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix
Hi,
ich habe es so gemacht, hat lang gedauert bis es klick gemacht hat! :-)
Es ist noch nicht ganz wie ich es möchte, vielleicht macht es ja nochmal klick.
if ($_POST['FEHLERKATEGORIE'] != "alles i.O." and $_POST['BESCHREIBUNG'] == "" ) {
$errors[] = "Beschreibung";
}
Gruß
ich weiß nicht weiter und benötige Hilfe um folgendes zu lösen.
Was hat dein Problem mit PHP zu tun?
Was hat dein Problem mit "Sprungmarken" (ich vermute Anker) zu tun?
Was muß ich verändern damit ich "$sql = "INSERT INTO.......";" nicht zwei mal schreiben muß?
Hi,
Was hat dein Problem mit PHP zu tun?
Was hat dein Problem mit "Sprungmarken" (ich vermute Anker) zu tun?
Du vermutest falsch - ein GOTO-Statement, wie man es bspw. aus BASIC kennt, war gemeint.
GOTO kennt PHP mittlerweile auch - allerdings ist von der Verwnedung eher abzuraten, weil das zu unsauberer Programmierung verleitet. Mit dem Sammeln von Fehlern und entsprechenden Abfragen bekommt man das auch ohne hin.
MfG ChrisB
GOTO kennt PHP mittlerweile auch - allerdings ist von der Verwnedung eher abzuraten, weil das zu unsauberer Programmierung verleitet.
Das xkcd-Comic am Ende der Dokumentationsseite hast du gesehen? ;)
Refuctoring par excellence :p