Werte aus Formular überprüfen

Schmaro

Grünschnabel
Hallo zusammen,

ich bin es schon wieder. Habe mal wieder ein Problem. Habe auch schon Stunden lang gesucht und nichts brauchbares gefunden.
Nun zu meinem Problem.

Ich habe ein Formular mit dem ich Daten in eine MySQL DB eintrage. Funktioniert ja mit dem Befehlt INSERT INTO
Alles schön und gut.
Jetzt habe ich einen bestimmten Wert der sich nicht wiederholen darf. Heißt ich müsste vorher prüfen ob dieser Wert schon in der DB steht. Wenn ja dann soll er mir ne Fehlermeldung geben, ansonsten soll er alle Daten bzw. Werte aus dem Formular in die DB eintragen. Ich weiß nicht wie ich das anstellen soll.
Ich beschreibe mal noch kurz welche Daten aus dem Formular kommen. kw = kalenderwoche, name = Name, thema = Thema. Die Kalenderwoche darf sich nicht wiederholen.
Da fällt mir noch, kann man vielleicht gleich noch eine Überprüfung machen, ob die Kalenderwoche eingetragen wurde im Formular. Das heißt sie darf nicht leer sein.
Habt ihr vielleicht ne Idee wie man das alles umsetzen kann?

Gruß Sven
 
Zuletzt bearbeitet:
Am einfachsten ist es wohl, wenn du auf bestimmte Spalten in der Tabelle einen "Unique Index" setzt: Wird nun versucht, einen schon vorhandener Wert einzufügen, liefert dir MySQL einen bestimmten Errorcode, der abgefangen und verarbeitet werden kann. Die Methode funktionier auch über mehrere Spalten via
Code:
UNIQUE KEY `keyname` (`spalte1`, `spalte2`, ...)
wenn ich mich recht entsinne.

Einfacher zu Handhaben zur gezielten Fehlerreaktion wäre ein Select-Query, welches dann die Anzahl der zutreffenden Reihen zurückgibt, die auf die Wo-Bedingungen zutreffen. Angenommen, du hast ein Formular mit "name", "vorname", "ip" oder was auch immer, kannst du vorher über
Code:
SELECT COUNT(`id`) WHERE (`name` = 'name' AND `vorname` = 'vorname') OR `ip` = 'ip';

Leichter wäre in dem Falle, schon aus dem Grund, dass es nicht sonderlich komplex ist, die Variante über einzigartige Schlüssel (Unique Indizies):
Code:
ALTER TABLE `tabellenname` ADD UNIQUE KEY `name_vorname` (`name`, `vorname`), UNIQUE KEY `ip` (`ip`);
Schießmichtot - Habe lange nicht mehr direkt mit Editierbefehlen in MySQL gearbeitet. Ein Blick ins Handbuch schadet sicherlich nicht ;)

Wenn du nun
Code:
INSERT INTO `tabellenname` (`name`, `vorname`, ìp`) VALUES ('name', 'vorname', 'ip');
ausführst, bekommst du entweder als Errorcode "0" zurück oder einen anderen Errorcode. Sollten alle Spaltennamen korrekt sein, keine Syntaxfehler vorliegen, etc, kann das dann nur noch eine Fehlermeldung auf Grund eines Unique-Keys sein. Die entsprechende Fehlernummer ist 1169 oder so... Eine Übersicht über alle Codes findet man in der MySQL Onlinereferenz.

Jetzt erst deinen bearbeiteten Beitrag gesehen: Die Überprüfung auf vorhandene und nicht vorhandene Werte läuft am besten über die verwendete Scriptsprache ab, denn MySQL ist nur eine Datenbanksprache und kann so gesehen nicht direkt mit HTTP Post und Get Werten arbeiten. Angenommen, du arbeitest mit PHP, kannst du folgenden Code zur überprüfung verwenden:
PHP:
if (!empty($_POST['kw']) AND ctype_digit($_POST['kw']) AND (int) $_POST['kw'] > 0 AND (int) $_POST['kw'] <= 52) { /* ... */ }
 
Zuletzt bearbeitet:
Lege in deiner Tabelle den Wert, der nur einmal vorkommen soll, als Unique Key fest. Es kommt dann zu einer Fehlermeldung wenn Werte mehr als einmal in die Tabelle geschrieben werden sollen.
 
Hallo,

also den Unique Key habe ich festgelegt.
Probleme habe ich aber die Überprüfung rein zu bauen. Am besten ich poste mal den Code. Vielleicht könnt ihr mir dann sagen wo und wie ich das machen kann.
PHP:
<form id="sendeplan" name="sendeplan" method="post" action="<? echo $_SERVER['PHP_SELF'] ?>">
  <?php
include ("config.inc.php");
if (isset($_POST['submit'])) {
$sql = "INSERT INTO `sendeplan` (`damo`, `djmo18`, `thmo18`, `djmo20`, `thmo20`, `djmo22`, `thmo22`, `dadi`, `djdi18`, `thdi18`, `djdi20`, `thdi20`, `djdi22`, `thdi22`, `dami`, `djmi18`, `thmi18`, `djmi20`, `thmi20`, `djmi22`, `thmi22`, `dado`, `djdo18`, `thdo18`, `djdo20`, `thdo20`, `djdo22`, `thdo22`, `dafr`, `djfr18`, `thfr18`, `djfr20`, `thfr20`, `djfr22`, `thfr22`, `dasa`, `djsa18`, `thsa18`, `djsa20`, `thsa20`, `djsa22`, `thsa22`, `daso`, `djso18`, `thso18`, `djso20`, `thso20`, `djso22`, `thso22`, `kw`, `woda` ) VALUES ('$_POST[damo]', '$_POST[djmo18]', '$_POST[thmo18]', '$_POST[djmo20]', '$_POST[thmo20]', '$_POST[djmo22]', '$_POST[thmo22]', '$_POST[dadi]', '$_POST[djdi18]', '$_POST[thdi18]', '$_POST[djdi20]', '$_POST[thdi20]', '$_POST[djdi22]', '$_POST[thdi22]', '$_POST[dami]', '$_POST[djmi18]', '$_POST[thmi18]', '$_POST[djmi20]', '$_POST[thmi20]', '$_POST[djmi22]', '$_POST[thmi22]', '$_POST[dado]', '$_POST[djdo18]', '$_POST[thdo18]', '$_POST[djdo20]', '$_POST[thdo20]', '$_POST[djdo22]', '$_POST[thdo22]', '$_POST[dafr]', '$_POST[djfr18]', '$_POST[thfr18]', '$_POST[djfr20]', '$_POST[thfr20]', '$_POST[djfr22]', '$_POST[thfr22]', '$_POST[dasa]', '$_POST[djsa18]', '$_POST[thsa18]', '$_POST[djsa20]', '$_POST[thsa20]', '$_POST[djsa22]', '$_POST[thsa22]', '$_POST[daso]', '$_POST[djso18]', '$_POST[thso18]', '$_POST[djso20]', '$_POST[thso20]', '$_POST[djso22]',  '$_POST[thso22]', '$_POST[kw]', '$_POST[woda]')";
	$result = mysql_query($sql);
	if ($result) {
		echo "<p>Deine Daten wurden erfolgreich erfasst! Der neue Sendeplan steht. Grinz</p>";
	}
	else {
		echo "<p>Deine Daten wurden <b>nicht</b> erfasst! Da ist dir wohl ein Fehler unterlaufen</p>";
		}
}
?>

Ich hoffe man kann aus dem Code etwas erkenne? Weiß, ist sehr umfangreich das Formular.
Ich möchte jetzt, das die Kalenderwoche = kw bestimmt sein muss bzw. das das nicht leer sein darf und genauso das Wochendatum = woda. Da soll dann eine Fehlermeldung kommen.
Wo und wie ich jetzt dort die if und else Anweisungen schreiben muss, weiß ich nicht.
Vielleicht habt ihr da die Lösung die ich suche.

Schöne Grüße Sven
 
Sei mir nicht böse, aber die Spaltenbezeichnungen sind sehr konfus, und insgesamt ist das Query sehr, sehr fehleranfällig...Kaum setzt jemand zB ein "'" ein, ist dein Querystring futsch. Auf diese Weise kann das gesamte Query natürlich auch manipuliert werden. Aber vorerst zu deinem eigentlichen Problem:

PHP:
<form id="sendeplan" name="sendeplan" method="post" action="<? echo $_SERVER['PHP_SELF']; ?>">
<?php
include ("config.inc.php");
if (isset($_POST['submit'])) {
$sql = "INSERT INTO `sendeplan` (
    `damo`, `djmo18`, `thmo18`, `djmo20`, `thmo20`, `djmo22`, `thmo22`, `dadi`, `djdi18`, `thdi18`, `djdi20`, `thdi20`, `djdi22`, `thdi22`, `dami`, `djmi18`, `thmi18`, `djmi20`, `thmi20`, `djmi22`, `thmi22`, `dado`, `djdo18`, `thdo18`, `djdo20`, `thdo20`, `djdo22`, `thdo22`, `dafr`, `djfr18`, `thfr18`, `djfr20`, `thfr20`, `djfr22`, `thfr22`, `dasa`, `djsa18`, `thsa18`, `djsa20`, `thsa20`, `djsa22`, `thsa22`, `daso`, `djso18`, `thso18`, `djso20`, `thso20`, `djso22`, `thso22`, `kw`, `woda`
) VALUES (
    '$_POST[damo]', '$_POST[djmo18]', '$_POST[thmo18]', '$_POST[djmo20]', '$_POST[thmo20]', '$_POST[djmo22]', '$_POST[thmo22]', '$_POST[dadi]', '$_POST[djdi18]', '$_POST[thdi18]', '$_POST[djdi20]', '$_POST[thdi20]', '$_POST[djdi22]', '$_POST[thdi22]', '$_POST[dami]', '$_POST[djmi18]', '$_POST[thmi18]', '$_POST[djmi20]', '$_POST[thmi20]', '$_POST[djmi22]', '$_POST[thmi22]', '$_POST[dado]', '$_POST[djdo18]', '$_POST[thdo18]', '$_POST[djdo20]', '$_POST[thdo20]', '$_POST[djdo22]', '$_POST[thdo22]', '$_POST[dafr]', '$_POST[djfr18]', '$_POST[thfr18]', '$_POST[djfr20]', '$_POST[thfr20]', '$_POST[djfr22]', '$_POST[thfr22]', '$_POST[dasa]', '$_POST[djsa18]', '$_POST[thsa18]', '$_POST[djsa20]', '$_POST[thsa20]', '$_POST[djsa22]', '$_POST[thsa22]', '$_POST[daso]', '$_POST[djso18]', '$_POST[thso18]', '$_POST[djso20]', '$_POST[thso20]', '$_POST[djso22]',  '$_POST[thso22]', '$_POST[kw]', '$_POST[woda]')";
	$result = mysql_query($sql);
        // hier überprüfen, ob MySQL einen Fehlercode zurückgibt und dieser 1169 (duplicate unique key) ist
	if ($mysqlerrno = (int) mysql_errno() == 1169) {
                echo "<p>Doppelte Einträge sind nicht erlaubt</p>";
        elseif ($mysqlerrno == 0) {
		echo "<p>Deine Daten wurden erfolgreich erfasst! Der neue Sendeplan steht. Grinz</p>";
	}
	else {
		echo "<p>Deine Daten wurden <b>nicht</b> erfasst! Da ist dir wohl ein Fehler unterlaufen</p>";
		}
}
?>

Insgesamt sieht das mit den Spalten generell nicht so gut aus :(
Schlüssel (für dich selbst) mal die Spaltenbezeichner auf und überleg dir, ob es nicht sinnvoll ist, die Sachen in verschiedene Tabellen auszulagern, die Architektur komplett zu überarbeiten, und dann einfach bei einer Abfrage zu joinen. Ich denke, das geht alles ein wenig simpler und effektiver ;)

Übrigens eignen sich die Funktionen
PHP:
mysql_real_escape_string($value [, $mysqlconnectionressource]);
// oder
mysql_escape_string($value);
sehr gut um SQL-Injections vorzubeugen.
 
Jetzt verstehe ich nur noch Bahnhof.

Habe die Abfrage mit mysql gestalltet. Wie soll ich denn den Code verbessern. bin ja froh, das es so einigermaßen funktioniert.

Wie mach ich das jetzt aber, dass die Kalenderwoche=kw und Wochendatum=woda nicht leer sein dürfen.

Gruß Sven
 
Zuletzt bearbeitet:
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.
 
Ich sehe leider gar nicht mehr durch.

PHP:
$result = mysql_query($sql);
        // hier überprüfen, ob MySQL einen Fehlercode zurückgibt und dieser 1169 (duplicate unique key) ist
    if ($mysqlerrno = (int) mysql_errno() == 1169) {
                echo "<p>Doppelte Einträge sind nicht erlaubt</p>";
        elseif ($mysqlerrno == 0) {
        echo "<p>Deine Daten wurden erfolgreich erfasst! Der neue Sendeplan steht. Grinz</p>";
    }
    else {
        echo "<p>Deine Daten wurden <b>nicht</b> erfasst! Da ist dir wohl ein Fehler unterlaufen</p>";
        }
}
?>
bei dem Code wird mir die Seite erst gar nicht mehr angezeigt

und hier

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

weiß ich nicht wirklich wie und wo das reingehört.

Gruß Sven
 
Ein wenig Eigeninitiative wäre schon nicht schlecht ^^

PHP:
<?php
// Prüfen, ob KW und WODA gesendet wurden und nicht leer sind
if (!empty($_POST['kw']) AND !empty($_POST['woda'])) {
  // hier dann das machen, was das Script machen soll, wenn WODA und KW gesetzt und nicht leer sind
  // also zB das INSERT Query ausführen und so weiter
}
?>

PHP:
<?php
$result = mysql_query($sql);
// hier überprüfen, ob MySQL einen Fehlercode zurückgibt und dieser 1169 (duplicate unique key) ist
$mysqlerrno = (int) mysql_errno();
if ($mysqlerrno == 1169) {
    // es wurde versucht, ein Duplikat eines Uniquefeldes anzulegen
elseif ($mysqlerrno > 0) {
    // es ist ein anderer Fehler aufgetreten
} else {
    // es trat kein Fehler auf
}
?>

Das ist erstmal der Rahmen, und in dem Musst du nun noch einsetzen, was eingesetzt werden muss. zB:

PHP:
if (!empty($_POST['kw']) AND !empty($_POST['woda'])) {
  $sql = "...";
  $result = mysql_query($sql);

  // hier überprüfen, ob MySQL einen Fehlercode zurückgibt und dieser 1169 (duplicate unique key) ist
  $mysqlerrno = (int) mysql_errno();
  if ($mysqlerrno == 1169) {
    // es wurde versucht, ein Duplikat eines Uniquefeldes anzulegen
  elseif ($mysqlerrno > 0) {
    // es ist ein anderer Fehler aufgetreten
  } else {
    // es trat kein Fehler auf
 }
}

Um leere Seiten möglichst zu vermeiden, die durch Syntaxfehler und ähnliche Schusseleien entstehen, sollten folgende Codezeilen zu Beginn des Scripts eingesetzt werden:
PHP:
<?php
ini_set('display_errors', 'on');
error_reporting(E_ALL | E_PARSE | E_STRICT);
// oder error_reporting(E_ALL | E_STRICT);
// jedoch hat das bei mir schon öfter Parsingfehler unterdrückt o.O
?>
 
Vielleicht wirkt meine Methode etwas Anfängermäßig, aber bisher hat sie ziemlich gut funktioniert:

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

  if($result != 0){
    //Hier kannst du dann eine Fehlermeldung ausgeben lassen
  }else{
    //Hier kannst du die Werte vom Formular in die DB eintragen lassen
  }
}else{
  //Fehlermeldung wenn $_POST['kw'] leer ist
}

Verwende ich schon einige Zeit, und hatte so weit ich mich erinnern kann noch kein Problem damit! ;)

mfg
Nero_85
 
Zurück