Werte aus Formular überprüfen

Vielleicht wirkt meine Methode etwas Anfängermäßig,
Folgende Ausführung soll nicht beleidigend oder herablassend sein sondern dich über mögliche Konsequenzen aufklären, die deine Methode nach sich ziehen kann :)

PHP:
$sql = mysql_query("SELECT kw FROM `deineTab` WHERE kw='".$_POST['kw']."'") or die(mysql_error());

// zum Verständnis:
$sql = (mysql_query("SELECT kw FROM `deineTab` WHERE kw='".$_POST['kw']."'") || die(mysql_error()));
$sql müsste laut deinem Beispiel eigentlich vom Typ Boolean sein, da es eine Evaluierung einer logischen Verknüpfung ist. Korrekter wäre daher die Schreibweise
PHP:
($sql = mysql_query("SELECT kw FROM `deineTab` WHERE kw='".$_POST['kw']."'")) || die(mysql_error());

Ein Problem dabei ist, dass $_POST['kw'] völlig ungeprüft an MySQL übergeben wird. Was ist, wenn der Clientuser ein "'" eingesetzt hat? Weitergesponnen: Es geht um die Auflistung von Benutzerdaten... Was wäre, wenn der Clientuser durch ein solches Query verarbeitet wird:
SQL:
SELECT *
FROM `user`
WHERE `username` = '{$_POST['username']}' AND `password` = '{$_POST['password']}'
Nun könnte ein böser Wille folgende Eingabe produzieren:
Code:
username = Max Mustermann
password = ' OR `password` != ';

Und schon haben wir das hier:
SQL:
SELECT *
FROM `user`
WHERE `username` = 'Max Mustermann' AND `password` = '' OR `password` != '';

Und das schlimmste ist: Niemand bekommt etwas mit, da das Query funktioniert! Sollte jedoch jemand wenige böse Absichten haben und dennoch nicht gewünschte / falsche Daten eingeben, liefert das Query einen Fehler zurück, was nach deinem Script in einer vorzeitig beendeten Ausgabe endet. Was haben wir davon? Eine Fehlernummer, die niemandem außer versierten Leuten etwas bringt und ansonsten den Umstand, dass der Clientuser von sich aus falsche Werte korrigieren muss.
Eine Speicherung des Fehlers und eine benutzerfreundliche Ausgabe, à la "Deine Daten konnten leider nicht verarbeitet werden auf Grund einer fehlerhaften Eingabe" ist sowieso viel netter ;)

Es gibt diese netten Funktionen [phpf]mysql_real_escape_string[/phpf] und [phpf]mysql_escape_string[/phpf], die einem sämtliche Arbeit in der Hinsicht abnehmen können^^

Und zur Vollständigkeit und Performance sei noch gesagt: [phpf]mysql_num_rows[/phpf] muss wirklich nur dann verwendet werden, wenn man die genaue Anzahl an Ergebnissen schon vor dem Abruf der eigentlichen Datensätze braucht. Ansonsten reicht ein [phpf]mysql_fetch_row[/phpf] oder eine andere Fetching-Funktion aus, die man über eine break-on-return-false Schleife so lange benutzt, bis keine Datensätze mehr abgefangen werden. Ein nebenher laufender, inkrementieller Zähler, ist (wenn überhaupt notwendig) sinnvoller.
Sollte das Ergebnisarray am Ende leer sein, wissen wir dennoch, dass keine Ergebnisse vorhanden sind.
Code:
$entries = array(); $i = 0;

while ($fetch = mysql_fetch_assoc($result)) {
    ++$i;
    $entries[] = $fetch;
}

if (empty($entries)) {
    echo "keine Datensätze vorhanden";
} else {
    echo "{$i} Datensätze vorhanden, die nun aufgelistet werden\n";
    // Auflistung
}
 
Es ist schlimm, wenn man nicht wirklich weiß wovon ihr sprecht. So geht es mir nämlich. Ich will doch einfach nur eine Fehlermeldung bzw. möchte ich es verhindern, dass die Kalenderwoche und das Wochendatum vergessen werden einzugeben.

Gruß Sven
 
Und zu dieser Sache wurde bereits eine Variante angeboten:

PHP:
if (!empty($_POST['kw']) AND !empty($_POST['woda'])) {
  // KW und WoDa gesetzt
}

Empty überprüft, ob eine Variable gesetzt ist (wie isset()), und zusätzlich ob diese nicht leer ist.

Als Alternative ginge auch noch eine extremere Überprüfung, wie
PHP:
$kw_ist_gesetzt   = (isset($_POST['kw']) AND (int) $_POST['kw'] >= 1 AND (int) $_POST['kw'] <= 52);
$woda_ist_gesetzt = (isset($_POST['woda']) AND in_array($_POST['woda'], array('montag', 'dienstag', 'mittwoch', 'donnerstag', 'freitag', 'samstag', 'sonntag')));

$schon_vorhanden = 0;

if ($kw_ist_gesetzt AND $woda_ist_gesetzt) {
    // Query zum Überprüfen auf Vorhandensein
    $sql = "SELECT COUNT(*) FROM `tabelle` WHERE `kw` = '"
         . mysql_real_escape_string($_POST['kw'])
         . "' AND `woda` = '"
         . mysql_real_escape_string($_POST['woda']) . "';";
    // Query an Datenbank übergeben
    $result = mysql_query($sql);
    // an $schon_vorhanden die Anzahl an vorhandenen Datensätzen unter den Wherekriterien speichern
    list($schon_vorhanden) = (int) mysql_fetch_row($result);
}

if ($schon_vorhanden == 0) {
    // Datensatz hinzufügen
} else {
    echo "Es ist ein Fehler aufgetreten: Ein solcher Datensatz ist bereits vorhanden";
}

Verständlicher kann ich es dir leider nicht machen... Wenn du das Verfahren nicht verstehst, solltest du bitte nochmal mit den Grundlagen anfagen :confused:
 
Hallo,

ohne den Thread zu 100% komplett gelesen zu haben:

  • Die ganzen Quelltexte, die gepostet wurden, sind einwandfrei und sinnvoll. Wenn du das nicht verstehst, würde ich dir empfehlen dich erstmal in SQL einzuarbeiten :)
  • Die Reihenfolge mit Eintragen, Überprüfung etc ist doch ganz einfach:
  1. Formular wird angezeigt mit einer DropDown-Box oder Kalender oder oder
  2. An dieser Stelle sollte bereits ausgelesen werden, welche KWs noch frei sind
  3. In dieser Box oder Kalender oder oder kann ich auch nur die KWs auswählen, die noch nicht belegt sind, d.h. genau die KWs die ich bei 2tens ausgelesen habe
  4. Die abgesendeten Formularwerte werden überprüft. D.h. sind die Variablen leer oder nicht?
  5. Wenn alles ok ist, kann alles in die Table eingetragen werden
Wenn dir diese Reihenfolge klar ist & der SQL-Code für dich begreifbar ist, bist schon fertig ;)

Ich hoffe ich habe hier keinen Post von euch wiederholt aber das wollte ich noch loswerden.
 
Zurück