unXtremo
Ensign
- Registriert
- Feb. 2009
- Beiträge
- 228
Hallo zusammen,
ich habe mal wieder einen Verständnishänger.
Hier meine DB Struktur:
Also was ich vor habe: Angemeldete Benutzer sollen sich für ein bestimmtes Ereignis anmelden können, dabei gibt die Kategorie eines Ereignisses vor, wie viele Benutzer sich für dieses Ereignis anmelden können.
Ich habe also ein Formular entwickelt, welches die Ereignisse aus der DB abfragt und in Selektlisten nach Wochentag (je Mittwoch, Samstag, Sonntag, Rest gemischt) sortiert ausgibt. Wenn sich jetzt ein User anmelden will, dann wird ein INSERT ausgeführt:
Natürlich werden die übermittelten Formulardaten aus sicherhitsgründen vorher escaped. Die $userid stammt aus der SESSION.
So jetzt soll aber vor dem Anmelden erst überprüft werden, ob sich der Benutzer schon bei genau diesem Ereignis angemeldet hat, um doppel Anmeldungen zu vermeiden. Und ob die maximale Anzahl der Anmeldungen bereits erreicht wurde.
Mein Problem ist jetzt:
In meinem Auswahl Formular zur Anmeldung wählen die User ein bestimmtes Datum in der Selektliste aus, es können aber an einem Tag zwei Ereignisse zu verschiedenen Uhrzeiten sein, sollte ich zu dem Datum des Ereignisses in der Liste auch die Uhrzeit angeben?
Wenn ich jetzt nämlich überprüfen will ob für dieses Ereignis bereits Anmeldungen vorliegen muss ich ja eine Abfrage auf die Tabelle anmeldung machen und über die Tabelle ereignis dem Datum und evetuell der Uhrzeit aus der Kategorie eine bestimmte ID des Ereignisses zuzuordnen (e_id) für diese e_id welche dem Feld ereignis in der anmeldungs Tabelle entspricht muss ich dann ein mysql_num_rows machen um die Anzahl der Anmeldungen zu ermitteln und diese mit der maximalen Anzahl in der Kategorie zu vergleichen. Und wegen der Doppelanmeldungen muss man auch prüfen ob es bereits einen datensatz mit dieser USer ID und Ereignis ID gibt.
Ich weiß nicht genau wieso, aber irgendwie komme ich nicht so recht auf ein SELECT Befehl, der mir diese Abfrage ermöglicht, könntet ihr mir vllt. weiterhelfen
Bisher bin ich soweit:
beim INSERT weiß ich auch noch nicht wo ich die e_id her bekomme
// EDIT:
Ach ja was ich schon bei der Ausgabe im Formular realisiert habe ist, dass Ereignisse die in der Vergangenheit liegen und welche, die zwar noch kommen aber schon ausgebucht sind gar nicht zur Auswahl stehen.
Ich habe gerade noch mal probiert, dabei fällt mir auf, das es doch gar nicht so einfach ist die Uhrzeit in der Selekt liste mit zu liefern:
Im Formular (in While Schleife):
ist kein Problem und sieht dann z.B. so aus: "21.04.2012 18:30"
nur in der Auswertung hatte ich es bisher so gemacht (ohne escapen):
das kann ich aber mit der Uhrzeit hinten dran nicht mehr machen, oder?
// EDIT:
am besten trennte ich hier Datum und Uhrzeit wieder:
ich habe mal wieder einen Verständnishänger.
Hier meine DB Struktur:
PHP:
/**
* Datenbank: entwicklung
*/
CREATE DATABASE entwicklung
DEFAULT CHARACTER SET utf8
COLLATE utf8_unicode_ci
;
/*********
* Beginn der Tabellen
*/
/**
* Benutzer
*/
CREATE TABLE user (
u_id INT NOT NULL UNIQUE AUTO_INCREMENT,
vorname VARCHAR(50) NOT NULL,
nachname VARCHAR(50) NOT NULL,
mail VARCHAR(50) NOT NULL,
username VARCHAR(50) NOT NULL,
password VARCHAR(50) NOT NULL,
u_status BOOLEAN NOT NULL DEFAULT 1,
u_statistik INT NOT NULL DEFAULT 0,
PRIMARY KEY (u_id)
);
/**
* Ort
*/
CREATE TABLE ort (
o_id INT NOT NULL UNIQUE AUTO_INCREMENT,
o_name VARCHAR(50) NOT NULL,
PRIMARY KEY (o_id)
);
/**
* Ereignis Kategorien
*/
CREATE TABLE kategorie (
kategorie_nr INT NOT NULL UNIQUE AUTO_INCREMENT,
kategorie_name VARCHAR(50) NOT NULL,
kategorie_tag VARCHAR(50) NOT NULL,
kategorie_ort VARCHAR(50) NOT NULL,
kategorie_uhrzeit TIME NOT NULL,
max_anzahl_user INT NOT NULL,
PRIMARY KEY (kategorie_nr),
FOREIGN KEY (kategorie_ort)
REFERENCES ort(o_name)
ON DELETE CASCADE
) ENGINE=InnoDB;
/**
* Ereignisse
*/
CREATE TABLE ereignis (
e_id INT NOT NULL UNIQUE AUTO_INCREMENT,
datum DATE NOT NULL,
kategorie INT NOT NULL,
PRIMARY KEY (e_id),
FOREIGN KEY (kategorie)
REFERENCES kategorie(kategorie_nr)
ON DELETE CASCADE
) ENGINE=InnoDB;
/**
* Anmeldung
*/
CREATE TABLE anmeldung (
a_id INT NOT NULL UNIQUE AUTO_INCREMENT,
user INT NOT NULL,
ereignis INT NOT NULL,
PRIMARY KEY (a_id),
FOREIGN KEY (user)
REFERENCES user(u_id),
FOREIGN KEY (ereignis)
REFERENCES ereignis(e_id)
ON DELETE CASCADE
) ENGINE=InnoDB;
Also was ich vor habe: Angemeldete Benutzer sollen sich für ein bestimmtes Ereignis anmelden können, dabei gibt die Kategorie eines Ereignisses vor, wie viele Benutzer sich für dieses Ereignis anmelden können.
Ich habe also ein Formular entwickelt, welches die Ereignisse aus der DB abfragt und in Selektlisten nach Wochentag (je Mittwoch, Samstag, Sonntag, Rest gemischt) sortiert ausgibt. Wenn sich jetzt ein User anmelden will, dann wird ein INSERT ausgeführt:
PHP:
$sql_eintragen = "INSERT anmeldung (user, ereignis) values " . "('" . $userid . "', " . "'" . $ereignis . "')";
So jetzt soll aber vor dem Anmelden erst überprüft werden, ob sich der Benutzer schon bei genau diesem Ereignis angemeldet hat, um doppel Anmeldungen zu vermeiden. Und ob die maximale Anzahl der Anmeldungen bereits erreicht wurde.
Mein Problem ist jetzt:
In meinem Auswahl Formular zur Anmeldung wählen die User ein bestimmtes Datum in der Selektliste aus, es können aber an einem Tag zwei Ereignisse zu verschiedenen Uhrzeiten sein, sollte ich zu dem Datum des Ereignisses in der Liste auch die Uhrzeit angeben?
Wenn ich jetzt nämlich überprüfen will ob für dieses Ereignis bereits Anmeldungen vorliegen muss ich ja eine Abfrage auf die Tabelle anmeldung machen und über die Tabelle ereignis dem Datum und evetuell der Uhrzeit aus der Kategorie eine bestimmte ID des Ereignisses zuzuordnen (e_id) für diese e_id welche dem Feld ereignis in der anmeldungs Tabelle entspricht muss ich dann ein mysql_num_rows machen um die Anzahl der Anmeldungen zu ermitteln und diese mit der maximalen Anzahl in der Kategorie zu vergleichen. Und wegen der Doppelanmeldungen muss man auch prüfen ob es bereits einen datensatz mit dieser USer ID und Ereignis ID gibt.
Ich weiß nicht genau wieso, aber irgendwie komme ich nicht so recht auf ein SELECT Befehl, der mir diese Abfrage ermöglicht, könntet ihr mir vllt. weiterhelfen
Bisher bin ich soweit:
PHP:
$result_anmeldung = mysql_query("
SELECT *
FROM anmeldung
INNER JOIN ereignis
ON anmeldung.ereignis = ereignis.e_id
WHERE user LIKE $userid
AND datum IN($mittwochs,$samstags,$sonntags,$rest)
");
$menge = mysql_num_rows($result_anmeldung);
if($menge == 0)
{
$sql_eintragen = "INSERT ..." // siehe oben
}
// EDIT:
Ach ja was ich schon bei der Ausgabe im Formular realisiert habe ist, dass Ereignisse die in der Vergangenheit liegen und welche, die zwar noch kommen aber schon ausgebucht sind gar nicht zur Auswahl stehen.
Ergänzung ()
Ich habe gerade noch mal probiert, dabei fällt mir auf, das es doch gar nicht so einfach ist die Uhrzeit in der Selekt liste mit zu liefern:
Im Formular (in While Schleife):
PHP:
echo "<option >" . strftime("%d.%m.%Y",strtotime($row['datum'])) . " " . strftime("%H:%M",strtotime($row['datum'] ." ". $row_mi['kategorie_uhrzeit'])) . "</option>";
nur in der Auswertung hatte ich es bisher so gemacht (ohne escapen):
PHP:
$mittwochs = strftime("%Y-%m-%d",strtotime($_POST["mittwochs"]));
// EDIT:
am besten trennte ich hier Datum und Uhrzeit wieder:
PHP:
$mittwochs = strftime("%Y-%m-%d",strtotime($_POST["mittwochs"]));
$mittwochs_zeit = strftime("%H:%M",strtotime($_POST["mittwochs"]));
Zuletzt bearbeitet: