Compare commits
10 Commits
dev/m3_saf
...
dev/m4_saf
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c69ffd7aa2 | ||
|
|
b2acdfe783 | ||
|
|
3206c60ce2 | ||
|
|
644248d1ff | ||
|
|
b8d937d110 | ||
|
|
9c61333473 | ||
|
|
a4e443ed04 | ||
|
|
09e803b7a0 | ||
|
|
a76e8b397a | ||
|
|
d2f6e02b4b |
22
.idea/dataSources.local.xml
generated
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="dataSourceStorageLocal" created-in="PS-232.10072.32">
|
||||||
|
<data-source name="@localhost" uuid="a1d1df29-b94a-4ad6-bd6f-a458b97a6c0c">
|
||||||
|
<database-info product="MariaDB" version="11.1.3-MariaDB" jdbc-version="4.2" driver-name="MariaDB Connector/J" driver-version="3.0.7" dbms="MARIADB" exact-version="11.1.3" exact-driver-version="3.0">
|
||||||
|
<extra-name-characters>#@</extra-name-characters>
|
||||||
|
<identifier-quote-string>`</identifier-quote-string>
|
||||||
|
</database-info>
|
||||||
|
<case-sensitivity plain-identifiers="lower" quoted-identifiers="lower" />
|
||||||
|
<secret-storage>master_key</secret-storage>
|
||||||
|
<user-name>root</user-name>
|
||||||
|
<schema-mapping>
|
||||||
|
<introspection-scope>
|
||||||
|
<node kind="schema">
|
||||||
|
<name qname="emensawerbeseite" />
|
||||||
|
<name qname="@" />
|
||||||
|
</node>
|
||||||
|
</introspection-scope>
|
||||||
|
</schema-mapping>
|
||||||
|
</data-source>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
12
.idea/dataSources.xml
generated
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
|
||||||
|
<data-source source="LOCAL" name="@localhost" uuid="a1d1df29-b94a-4ad6-bd6f-a458b97a6c0c">
|
||||||
|
<driver-ref>mariadb</driver-ref>
|
||||||
|
<synchronize>true</synchronize>
|
||||||
|
<jdbc-driver>org.mariadb.jdbc.Driver</jdbc-driver>
|
||||||
|
<jdbc-url>jdbc:mariadb://localhost:3306</jdbc-url>
|
||||||
|
<working-dir>$ProjectFileDir$</working-dir>
|
||||||
|
</data-source>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
1607
.idea/dataSources/a1d1df29-b94a-4ad6-bd6f-a458b97a6c0c.xml
generated
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
#n:emensawerbeseite
|
||||||
|
!<md> [1700856041000, 0, null, null, -2147483648, -2147483648]
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
#n:information_schema
|
||||||
|
!<md> [null, 0, null, null, -2147483648, -2147483648]
|
||||||
11
.idea/sqlDataSources.xml
generated
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="DdlMappings">
|
||||||
|
<mapping uuid="be6b29fb-6598-43a2-941f-0bba6d782429" name="emensawerbeseite@localhost Mapping">
|
||||||
|
<data-sources db="24dddfdb-38aa-45e9-b936-a3dd64f77e86" ddl="260cbe83-f68f-4636-a591-fef81902f80c" />
|
||||||
|
<scope>
|
||||||
|
<node kind="database" negative="1" />
|
||||||
|
</scope>
|
||||||
|
</mapping>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
6
.idea/sqldialects.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="SqlDialectMappings">
|
||||||
|
<file url="file://$PROJECT_DIR$/M3/werbeseite_daten.sql" dialect="MariaDB" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
75
.idea/workspace.xml
generated
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="AutoImportSettings">
|
||||||
|
<option name="autoReloadType" value="SELECTIVE" />
|
||||||
|
</component>
|
||||||
|
<component name="ChangeListManager">
|
||||||
|
<list default="true" id="6dcbe3e4-9d68-41d8-8c39-5cfbe5cd4a21" name="Changes" comment="">
|
||||||
|
<change beforePath="$PROJECT_DIR$/M3/M3.md" beforeDir="false" afterPath="$PROJECT_DIR$/M3/M3.md" afterDir="false" />
|
||||||
|
</list>
|
||||||
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||||
|
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||||
|
<option name="LAST_RESOLUTION" value="IGNORE" />
|
||||||
|
</component>
|
||||||
|
<component name="ComposerSettings">
|
||||||
|
<execution />
|
||||||
|
</component>
|
||||||
|
<component name="Git.Settings">
|
||||||
|
<option name="RECENT_BRANCH_BY_REPOSITORY">
|
||||||
|
<map>
|
||||||
|
<entry key="$PROJECT_DIR$" value="dev/m3_safak" />
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
||||||
|
</component>
|
||||||
|
<component name="MarkdownSettingsMigration">
|
||||||
|
<option name="stateVersion" value="1" />
|
||||||
|
</component>
|
||||||
|
<component name="PhpWorkspaceProjectConfiguration" interpreter_name="Xampp" />
|
||||||
|
<component name="ProjectColorInfo"><![CDATA[{
|
||||||
|
"customColor": "",
|
||||||
|
"associatedIndex": 0
|
||||||
|
}]]></component>
|
||||||
|
<component name="ProjectId" id="2YZcMNXBUidjAecPVKM66b1DdlE" />
|
||||||
|
<component name="ProjectViewState">
|
||||||
|
<option name="hideEmptyMiddlePackages" value="true" />
|
||||||
|
<option name="showLibraryContents" value="true" />
|
||||||
|
</component>
|
||||||
|
<component name="PropertiesComponent"><![CDATA[{
|
||||||
|
"keyToString": {
|
||||||
|
"RunOnceActivity.OpenProjectViewOnStart": "true",
|
||||||
|
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||||
|
"WebServerToolWindowFactoryState": "false",
|
||||||
|
"database.data.extractors.current.export.id": "Comma-separated (CSV)_id",
|
||||||
|
"git-widget-placeholder": "dev/robert__m3",
|
||||||
|
"last_opened_file_path": "C:/Users/rober/Documents/GitHub/DBWT-Praktika/M3/werbeseite_daten.sql",
|
||||||
|
"node.js.detected.package.eslint": "true",
|
||||||
|
"node.js.detected.package.tslint": "true",
|
||||||
|
"node.js.selected.package.eslint": "(autodetect)",
|
||||||
|
"node.js.selected.package.tslint": "(autodetect)",
|
||||||
|
"settings.editor.selected.configurable": "preferences.pluginManager",
|
||||||
|
"vue.rearranger.settings.migration": "true"
|
||||||
|
},
|
||||||
|
"keyToStringList": {
|
||||||
|
"DatabaseDriversLRU": [
|
||||||
|
"mariadb"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}]]></component>
|
||||||
|
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
|
||||||
|
<component name="TaskManager">
|
||||||
|
<task active="true" id="Default" summary="Default task">
|
||||||
|
<changelist id="6dcbe3e4-9d68-41d8-8c39-5cfbe5cd4a21" name="Changes" comment="" />
|
||||||
|
<created>1700736495450</created>
|
||||||
|
<option name="number" value="Default" />
|
||||||
|
<option name="presentableId" value="Default" />
|
||||||
|
<updated>1700736495450</updated>
|
||||||
|
<workItem from="1700736497007" duration="15223000" />
|
||||||
|
</task>
|
||||||
|
<servers />
|
||||||
|
</component>
|
||||||
|
<component name="TypeScriptGeneratedFilesManager">
|
||||||
|
<option name="version" value="3" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
BIN
M3/11b).pdf
Normal file
166
M3/Datenbank_erstellen.txt
Normal file
@@ -0,0 +1,166 @@
|
|||||||
|
create or replace database emensawerbeseite;
|
||||||
|
|
||||||
|
use emensawerbeseite;
|
||||||
|
|
||||||
|
create table gericht (
|
||||||
|
id int8 primary key auto_increment,
|
||||||
|
name varchar(80) not null unique,
|
||||||
|
beschreibung varchar(80) not null,
|
||||||
|
erfasst_am date not null,
|
||||||
|
vegetarisch boolean not null,
|
||||||
|
vegan boolean not null,
|
||||||
|
preisintern double not null,
|
||||||
|
preisextern double not null
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
create table allergen(
|
||||||
|
code char(4) primary key ,
|
||||||
|
name varchar(300) not null,
|
||||||
|
typ varchar(20) not null
|
||||||
|
);
|
||||||
|
|
||||||
|
create table kategorie(
|
||||||
|
id int8 primary key ,
|
||||||
|
name varchar(80) not null,
|
||||||
|
eltern_id int8 ,
|
||||||
|
CONSTRAINT FOREIGN KEY (eltern_id) REFERENCES kategorie(id),
|
||||||
|
bildname varchar(200)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table gericht_hat_allergen(
|
||||||
|
code char(4),
|
||||||
|
CONSTRAINT FOREIGN KEY (code) REFERENCES allergen(code),
|
||||||
|
gericht_id int8 not null,
|
||||||
|
CONSTRAINT FOREIGN KEY (gericht_id) REFERENCES gericht(id)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table gericht_hat_kategorie(
|
||||||
|
gericht_id int8 not null,
|
||||||
|
CONSTRAINT FOREIGN KEY (gericht_id) REFERENCES gericht(id),
|
||||||
|
kategorie_id int8 not null,
|
||||||
|
CONSTRAINT FOREIGN KEY (kategorie_id) REFERENCES kategorie(id)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table besucher_counter(
|
||||||
|
id int primary key,
|
||||||
|
besucher int8
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
INSERT INTO `besucher_counter` ()
|
||||||
|
VALUES (1,1);
|
||||||
|
|
||||||
|
|
||||||
|
INSERT INTO `allergen` (`code`, `name`, `typ`) VALUES
|
||||||
|
('a', 'Getreideprodukte', 'Getreide (Gluten)'),
|
||||||
|
('a1', 'Weizen', 'Allergen'),
|
||||||
|
('a2', 'Roggen', 'Allergen'),
|
||||||
|
('a3', 'Gerste', 'Allergen'),
|
||||||
|
('a4', 'Dinkel', 'Allergen'),
|
||||||
|
('a5', 'Hafer', 'Allergen'),
|
||||||
|
('a6', 'Dinkel', 'Allergen'),
|
||||||
|
('b', 'Fisch', 'Allergen'),
|
||||||
|
('c', 'Krebstiere', 'Allergen'),
|
||||||
|
('d', 'Schwefeldioxid/Sulfit', 'Allergen'),
|
||||||
|
('e', 'Sellerie', 'Allergen'),
|
||||||
|
('f', 'Milch und Laktose', 'Allergen'),
|
||||||
|
('f1', 'Butter', 'Allergen'),
|
||||||
|
('f2', 'Käse', 'Allergen'),
|
||||||
|
('f3', 'Margarine', 'Allergen'),
|
||||||
|
('g', 'Sesam', 'Allergen'),
|
||||||
|
('h', 'Nüsse', 'Allergen'),
|
||||||
|
('h1', 'Mandeln', 'Allergen'),
|
||||||
|
('h2', 'Haselnüsse', 'Allergen'),
|
||||||
|
('h3', 'Walnüsse', 'Allergen'),
|
||||||
|
('i', 'Erdnüsse', 'Allergen');
|
||||||
|
|
||||||
|
INSERT INTO `gericht` (`id`, `name`, `beschreibung`, `erfasst_am`, `vegan`, `vegetarisch`, `preisintern`, `preisextern`) VALUES
|
||||||
|
(1, 'Bratkartoffeln mit Speck und Zwiebeln', 'Kartoffeln mit Zwiebeln und gut Speck', '2020-08-25', 0, 0, 2.3, 4),
|
||||||
|
(3, 'Bratkartoffeln mit Zwiebeln', 'Kartoffeln mit Zwiebeln und ohne Speck', '2020-08-25', 1, 1, 2.3, 4),
|
||||||
|
(4, 'Grilltofu', 'Fein gewürzt und mariniert', '2020-08-25', 1, 1, 2.5, 4.5),
|
||||||
|
(5, 'Lasagne', 'Klassisch mit Bolognesesoße und Creme Fraiche', '2020-08-24', 0, 0, 2.5, 4.5),
|
||||||
|
(6, 'Lasagne vegetarisch', 'Klassisch mit Sojagranulatsoße und Creme Fraiche', '2020-08-24', 0, 1, 2.5, 4.5),
|
||||||
|
(7, 'Hackbraten', 'Nicht nur für Hacker', '2020-08-25', 0, 0, 2.5, 4),
|
||||||
|
(8, 'Gemüsepfanne', 'Gesundes aus der Region, deftig angebraten', '2020-08-25', 1, 1, 2.3, 4),
|
||||||
|
(9, 'Hühnersuppe', 'Suppenhuhn trifft Petersilie', '2020-08-25', 0, 0, 2, 3.5),
|
||||||
|
(10, 'Forellenfilet', 'mit Kartoffeln und Dilldip', '2020-08-22', 0, 0, 3.8, 5),
|
||||||
|
(11, 'Kartoffel-Lauch-Suppe', 'der klassische Bauchwärmer mit frischen Kräutern', '2020-08-22', 0, 1, 2, 3),
|
||||||
|
(12, 'Kassler mit Rosmarinkartoffeln', 'dazu Salat und Senf', '2020-08-23', 0, 0, 3.8, 5.2),
|
||||||
|
(13, 'Drei Reibekuchen mit Apfelmus', 'grob geriebene Kartoffeln aus der Region', '2020-08-23', 0, 1, 2.5, 4.5),
|
||||||
|
(14, 'Pilzpfanne', 'die legendäre Pfanne aus Pilzen der Saison', '2020-08-23', 0, 1, 3, 5),
|
||||||
|
(15, 'Pilzpfanne vegan', 'die legendäre Pfanne aus Pilzen der Saison ohne Käse', '2020-08-24', 1, 1, 3, 5),
|
||||||
|
(16, 'Käsebrötchen', 'schmeckt vor und nach dem Essen', '2020-08-24', 0, 1, 1, 1.5),
|
||||||
|
(17, 'Schinkenbrötchen', 'schmeckt auch ohne Hunger', '2020-08-25', 0, 0, 1.25, 1.75),
|
||||||
|
(18, 'Tomatenbrötchen', 'mit Schnittlauch und Zwiebeln', '2020-08-25', 1, 1, 1, 1.5),
|
||||||
|
(19, 'Mousse au Chocolat', 'sahnige schweizer Schokolade rundet jedes Essen ab', '2020-08-26', 0, 1, 1.25, 1.75),
|
||||||
|
(20, 'Suppenkreation á la Chef', 'was verschafft werden muss, gut und günstig', '2020-08-26', 0, 0, 0.5, 0.9);
|
||||||
|
|
||||||
|
INSERT INTO `gericht_hat_allergen` (`code`, `gericht_id`) VALUES
|
||||||
|
('h', 1),
|
||||||
|
('a3', 1),
|
||||||
|
('a4', 1),
|
||||||
|
('f1', 3),
|
||||||
|
('a6', 3),
|
||||||
|
('i', 3),
|
||||||
|
('a3', 4),
|
||||||
|
('f1', 4),
|
||||||
|
('a4', 4),
|
||||||
|
('h3', 4),
|
||||||
|
('d', 6),
|
||||||
|
('h1',7),
|
||||||
|
('a2', 7),
|
||||||
|
('h3', 7),
|
||||||
|
('c', 7),
|
||||||
|
('a3', 8),
|
||||||
|
('h3', 10),
|
||||||
|
('d', 10),
|
||||||
|
('f', 10),
|
||||||
|
('f2', 12),
|
||||||
|
('h1', 12),
|
||||||
|
('a5',12),
|
||||||
|
('c', 1),
|
||||||
|
('a2', 9),
|
||||||
|
('i', 14),
|
||||||
|
('f1', 1),
|
||||||
|
('a1', 15),
|
||||||
|
('a4', 15),
|
||||||
|
('i', 15),
|
||||||
|
('f3', 15),
|
||||||
|
('h3', 15);
|
||||||
|
|
||||||
|
INSERT INTO `kategorie` (`id`, `eltern_id`, `name`, `bildname`) VALUES
|
||||||
|
(1, NULL, 'Aktionen', 'kat_aktionen.png'),
|
||||||
|
(2, NULL, 'Menus', 'kat_menu.gif'),
|
||||||
|
(3, 2, 'Hauptspeisen', 'kat_menu_haupt.bmp'),
|
||||||
|
(4, 2, 'Vorspeisen', 'kat_menu_vor.svg'),
|
||||||
|
(5, 2, 'Desserts', 'kat_menu_dessert.pic'),
|
||||||
|
(6, 1, 'Mensastars', 'kat_stars.tif'),
|
||||||
|
(7, 1, 'Erstiewoche', 'kat_erties.jpg');
|
||||||
|
|
||||||
|
INSERT INTO `gericht_hat_kategorie` (`kategorie_id`, `gericht_id`) VALUES
|
||||||
|
(3, 1), (3, 3), (3, 4), (3, 5), (3, 6), (3, 7), (3, 9), (4, 16), (4, 17), (4, 18), (5, 16), (5, 17), (5, 18);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
SELECT DISTINCT name, GROUP_CONCAT(code) FROM gericht g JOIN gericht_hat_allergen a ON g.id = a.gericht_id GROUP BY name ASC;
|
||||||
|
|
||||||
|
SELECT DISTINCT name, GROUP_CONCAT(code) FROM gericht g LEFT JOIN gericht_hat_allergen a ON g.id = a.gericht_id GROUP BY name ASC
|
||||||
|
;
|
||||||
|
SELECT DISTINCT allergen.code, GROUP_CONCAT(gericht.name) AS gericht FROM allergen
|
||||||
|
LEFT JOIN gericht_hat_allergen on allergen.code = gericht_hat_allergen.code
|
||||||
|
LEFT JOIN gericht ON gericht_hat_allergen.gericht_id = gericht_id
|
||||||
|
GROUP BY allergen.name
|
||||||
|
ORDER BY code ASC;
|
||||||
|
|
||||||
|
|
||||||
|
SELECT kategorie.name, COUNT(kategorie_id) AS anzahl FROM gericht_hat_kategorie, kategorie
|
||||||
|
WHERE kategorie.id = gericht_hat_kategorie.kategorie_id
|
||||||
|
GROUP BY kategorie_id
|
||||||
|
ORDER BY anzahl ASC;
|
||||||
|
|
||||||
|
SELECT kategorie.name, COUNT(kategorie_id) AS anzahl FROM gericht_hat_kategorie, kategorie
|
||||||
|
WHERE kategorie.id = gericht_hat_kategorie.kategorie_id AND kategorie_id > 2
|
||||||
|
GROUP BY kategorie_id
|
||||||
|
ORDER BY anzahl ASC;
|
||||||
BIN
M3/Diagram.drawio.png
Normal file
|
After Width: | Height: | Size: 138 KiB |
56
M3/M3.md
@@ -52,4 +52,60 @@ INSERT INTO gericht_hat_kategorie VALUES (21, 3);
|
|||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
# Aufgabe 6
|
||||||
|
|
||||||
|
## Abfragen
|
||||||
|
|
||||||
|
1) Alle Gerichte mit allen zugehörigen Allergenen
|
||||||
|
``` sql
|
||||||
|
SELECT DISTINCT name, GROUP_CONCAT(code) FROM gericht g JOIN gericht_hat_allergen a ON g.id = a.gericht_id GROUP BY name ASC;
|
||||||
|
```
|
||||||
|
2) Ändern Sie die vorherige Abfrage so ab, dass alle existierenden Gerichte dargestellt werden (auch wenn keine Allergene enthalten sind).
|
||||||
|
``` sql
|
||||||
|
SELECT DISTINCT name, GROUP_CONCAT(code) FROM gericht g LEFT JOIN gericht_hat_allergen a ON g.id = a.gericht_id GROUP BY name ASC;
|
||||||
|
```
|
||||||
|
3) Ändern Sie die vorherige Abfrage so ab, so dass im Ergebnis alle existierenden Allergene dargestellt werden (auch wenn diese nicht einem Gericht zugeordnet sind).
|
||||||
|
``` sql
|
||||||
|
SELECT DISTINCT allergen.code, GROUP_CONCAT(gericht.name) AS gericht FROM allergen LEFT JOIN gericht_hat_allergen on allergen.code = gericht_hat_allergen.code LEFT JOIN gericht ON gericht_hat_allergen.gericht_id = gericht_id
|
||||||
|
GROUP BY allergen.name
|
||||||
|
ORDER BY code ASC;
|
||||||
|
```
|
||||||
|
4) Die Anzahl der Gerichte pro Kategorie aufsteigend sortiert nach Anzahl.
|
||||||
|
``` sql
|
||||||
|
SELECT kategorie.name, COUNT(kategorie_id) AS anzahl FROM gericht_hat_kategorie, kategorie
|
||||||
|
WHERE kategorie.id = gericht_hat_kategorie.kategorie_id
|
||||||
|
GROUP BY kategorie_id
|
||||||
|
ORDER BY anzahl ASC;
|
||||||
|
```
|
||||||
|
5) Ändern Sie die vorherige Abfrage so ab, dass dabei nur die Kategorien dargestellt werden, die mehr als 2 Gerichte besitzen.
|
||||||
|
``` sql
|
||||||
|
SELECT kategorie.name, COUNT(kategorie_id) AS anzahl FROM gericht_hat_kategorie, kategorie
|
||||||
|
WHERE kategorie.id = gericht_hat_kategorie.kategorie_id AND kategorie_id > 2
|
||||||
|
GROUP BY kategorie_id
|
||||||
|
ORDER BY anzahl ASC;
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
# Aufgabe 7
|
||||||
|
elter_kategorie:
|
||||||
|
``` sql
|
||||||
|
CONSTRAINT FOREIGN KEY (id) REFERENCES kategorie(id),
|
||||||
|
```
|
||||||
|
|
||||||
|
gericht_hat_allergen:
|
||||||
|
``` sql
|
||||||
|
code char(4),
|
||||||
|
CONSTRAINT FOREIGN KEY (code) REFERENCES allergen(code),
|
||||||
|
gericht_id int8 not null,
|
||||||
|
CONSTRAINT FOREIGN KEY (gericht_id) REFERENCES gericht(id)
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
gericht_hat_kategorie:
|
||||||
|
``` sql
|
||||||
|
gericht_id int8 not null,
|
||||||
|
CONSTRAINT FOREIGN KEY (gericht_id) REFERENCES gericht(id),
|
||||||
|
kategorie_id int8 not null,
|
||||||
|
CONSTRAINT FOREIGN KEY (kategorie_id) REFERENCES kategorie(id)
|
||||||
|
|
||||||
|
```
|
||||||
@@ -1 +1 @@
|
|||||||
152
|
218
|
||||||
@@ -11,11 +11,18 @@ $besucherCount = 0;
|
|||||||
$newletterCount = 0;
|
$newletterCount = 0;
|
||||||
|
|
||||||
// Datenbankanbindung
|
// Datenbankanbindung
|
||||||
|
//$link = mysqli_connect(
|
||||||
|
//"127.0.0.1", // Host der Datenbank
|
||||||
|
//"root", // Benutzername zur Anmeldung
|
||||||
|
//"wm#32", // Passwort
|
||||||
|
//"emensawerbeseite" // Auswahl der Datenbanken (bzw. des Schemas)
|
||||||
|
//);
|
||||||
|
|
||||||
$link = mysqli_connect(
|
$link = mysqli_connect(
|
||||||
"127.0.0.1", // Host der Datenbank
|
"127.0.0.1", // Host der Datenbank
|
||||||
"root", // Benutzername zur Anmeldung
|
"root", // Benutzername zur Anmeldung
|
||||||
"wm#32", // Passwort
|
"wm#32", // Passwort
|
||||||
"emensawerbeseite" // Auswahl der Datenbanken (bzw. des Schemas)
|
"emensawerbeseite" // Auswahl der Datenbanken (bzw. des Schemas)
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!$link) {
|
if (!$link) {
|
||||||
@@ -24,18 +31,16 @@ if (!$link) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Besucher counter
|
//Besucher counter
|
||||||
if (file_exists("besucher.txt")) {
|
|
||||||
$besucherFile = fopen("besucher.txt", "r");
|
//Aktuelle Besucher Zahl
|
||||||
$besucherCount = fgets($besucherFile) + 1;
|
$sql_besucher = "SELECT besucher FROM besucher_counter WHERE id=1";
|
||||||
fclose($besucherFile);
|
$result_sql_besucher = mysqli_query($link, $sql_besucher);
|
||||||
$besucherFile = fopen("besucher.txt", "w");
|
$besucher = mysqli_fetch_assoc($result_sql_besucher);
|
||||||
fwrite($besucherFile, $besucherCount);
|
|
||||||
fclose($besucherFile);
|
//Updatet Besucher Zahl
|
||||||
} else {
|
$besucherCount = $besucher["besucher"] + 1;
|
||||||
$besucherFile = fopen("besucher.txt", "w");
|
$sql_besucher = "UPDATE besucher_counter SET besucher =".$besucherCount;
|
||||||
fwrite($besucherFile, 1);
|
$result_sql_besucher = mysqli_query($link, $sql_besucher);
|
||||||
fclose($besucherFile);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Newletter counter
|
//Newletter counter
|
||||||
if (file_exists("newletter.txt")) {
|
if (file_exists("newletter.txt")) {
|
||||||
@@ -48,6 +53,7 @@ if (file_exists("newletter.txt")) {
|
|||||||
fclose($newsFile);
|
fclose($newsFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Newletter Anmeldung
|
||||||
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
||||||
$name = $_POST['name'];
|
$name = $_POST['name'];
|
||||||
$email = $_POST['email'];
|
$email = $_POST['email'];
|
||||||
@@ -55,7 +61,7 @@ if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
|||||||
$terms = $_POST['terms'];
|
$terms = $_POST['terms'];
|
||||||
|
|
||||||
$errors = array();
|
$errors = array();
|
||||||
|
//Error handling
|
||||||
if (empty(trim($name))) {
|
if (empty(trim($name))) {
|
||||||
$errors[] = "Bitte geben Sie einen Namen ein.";
|
$errors[] = "Bitte geben Sie einen Namen ein.";
|
||||||
}
|
}
|
||||||
@@ -84,7 +90,7 @@ if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
|||||||
"language" => $language,
|
"language" => $language,
|
||||||
"terms" => $terms
|
"terms" => $terms
|
||||||
);
|
);
|
||||||
|
//File writing
|
||||||
$file = "subscriptions.json";
|
$file = "subscriptions.json";
|
||||||
$current_data = file_exists($file) ? json_decode(file_get_contents($file), true) : array();
|
$current_data = file_exists($file) ? json_decode(file_get_contents($file), true) : array();
|
||||||
$current_data[] = $data;
|
$current_data[] = $data;
|
||||||
@@ -217,7 +223,6 @@ if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="grid">
|
<div class="grid">
|
||||||
@@ -249,41 +254,49 @@ if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
|||||||
|
|
||||||
<!-- Speisekarte -->
|
<!-- Speisekarte -->
|
||||||
<?php
|
<?php
|
||||||
|
//Gerichte aus Datenbank
|
||||||
$sql_gerichte = "SELECT * FROM gericht ORDER BY RAND() LIMIT 5";
|
$sql_gerichte = "SELECT * FROM gericht ORDER BY RAND() LIMIT 5";
|
||||||
$result_sql_gerichte = mysqli_query($link, $sql_gerichte);
|
$result_sql_gerichte = mysqli_query($link, $sql_gerichte);
|
||||||
|
|
||||||
$tabelle = "<table class=\"speisen\"><tr class=\"speisen\"> <td>Gerichte</td><td>Preis intern</td><td>Preis extern</td><td>Bild</td></tr>";
|
$tabelle = "<table class=\"speisen\"><tr class=\"speisen\"> <td>Gerichte</td><td>Preis intern</td><td>Preis extern</td><td>Bild</td></tr>";
|
||||||
|
|
||||||
$verwendete_allergene = [];
|
$verwendete_allergene_code = [];
|
||||||
$verwendete_allergene_string = "";
|
$verwendete_allergene_string = "";
|
||||||
|
|
||||||
while ($row_gerichte = mysqli_fetch_assoc($result_sql_gerichte)) {
|
while ($row_gerichte = mysqli_fetch_assoc($result_sql_gerichte)) {
|
||||||
|
|
||||||
|
// Abfrage der vorhandenen Allergene im aktuellen Gericht
|
||||||
|
|
||||||
$sql_gericht_hat_allergene = "SELECT * FROM gericht_hat_allergen WHERE gericht_id=" . $row_gerichte['id'];
|
$sql_gericht_hat_allergene = "SELECT * FROM gericht_hat_allergen WHERE gericht_id=" . $row_gerichte['id'];
|
||||||
$result_sql_gericht_hat_allergene = mysqli_query($link, $sql_gericht_hat_allergene);
|
$result_sql_gericht_hat_allergene = mysqli_query($link, $sql_gericht_hat_allergene);
|
||||||
$allergene = "";
|
$allergene = "";
|
||||||
while ($row_allergene = mysqli_fetch_assoc($result_sql_gericht_hat_allergene)) {
|
while ($row_allergene = mysqli_fetch_assoc($result_sql_gericht_hat_allergene)) {
|
||||||
$allergene .= $row_allergene['code'] . ", ";
|
$allergene .= $row_allergene['code'] . ", ";
|
||||||
|
|
||||||
if (!in_array($row_allergene['code'], $verwendete_allergene)) {
|
if (!in_array($row_allergene['code'], $verwendete_allergene_code)) {
|
||||||
$verwendete_allergene[] = $row_allergene['code'];
|
$verwendete_allergene_code[] = $row_allergene['code'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Preise in EUR
|
||||||
|
|
||||||
$preisintern = number_format($row_gerichte['preisintern'], 2, ',', '.');
|
$preisintern = number_format($row_gerichte['preisintern'], 2, ',', '.');
|
||||||
$preisextern = number_format($row_gerichte['preisextern'], 2, ',', '.');
|
$preisextern = number_format($row_gerichte['preisextern'], 2, ',', '.');
|
||||||
|
|
||||||
|
// Ausgabe des aktuellen Gerichts
|
||||||
|
|
||||||
$tabelle .= "<tr class=\"speisen\"><td>" . $row_gerichte['name'] . " <sup>" . $allergene . "</sup></td><td>" . $preisintern . "€</td><td>" . $preisextern . "€</td><td>Kein Bild in der Datenbank </td></tr>";
|
$tabelle .= "<tr class=\"speisen\"><td>" . $row_gerichte['name'] . " <sup>" . $allergene . "</sup></td><td>" . $preisintern . "€</td><td>" . $preisextern . "€</td><td>Kein Bild in der Datenbank </td></tr>";
|
||||||
}
|
}
|
||||||
$tabelle .= "</table>";
|
$tabelle .= "</table>";
|
||||||
echo $tabelle;
|
echo $tabelle;
|
||||||
|
|
||||||
|
// Abfrage der Allergen Code und Name
|
||||||
|
|
||||||
$sql_allergen = "SELECT code, name FROM allergen";
|
$sql_allergen = "SELECT code, name FROM allergen";
|
||||||
$result_sql_allergen = mysqli_query($link, $sql_allergen);
|
$result_sql_allergen = mysqli_query($link, $sql_allergen);
|
||||||
|
|
||||||
while ($row_allergen = mysqli_fetch_assoc($result_sql_allergen)){
|
while ($row_allergen = mysqli_fetch_assoc($result_sql_allergen)){
|
||||||
if (in_array($row_allergen['code'], $verwendete_allergene)){
|
if (in_array($row_allergen['code'], $verwendete_allergene_code)){
|
||||||
$verwendete_allergene_string .= "<sup>".$row_allergen['code']."</sup> ". $row_allergen['name']. ", ";
|
$verwendete_allergene_string .= "<sup>".$row_allergen['code']."</sup> ". $row_allergen['name']. ", ";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -296,7 +309,15 @@ if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
|||||||
<div class="zahlen">
|
<div class="zahlen">
|
||||||
<p><?php echo $besucherCount; ?> Besuche</p>
|
<p><?php echo $besucherCount; ?> Besuche</p>
|
||||||
<p><?php echo $newletterCount; ?> Anmeldungen zum Newsletter</p>
|
<p><?php echo $newletterCount; ?> Anmeldungen zum Newsletter</p>
|
||||||
<p><?php echo count($gerichte); ?> Speisen</p>
|
<p>
|
||||||
|
<?php
|
||||||
|
$sql_gerichte = "SELECT COUNT(id) FROM gericht";
|
||||||
|
$result_sql_gerichte = mysqli_query($link, $sql_gerichte);
|
||||||
|
$ausgabe = mysqli_fetch_assoc($result_sql_gerichte);
|
||||||
|
echo $ausgabe["COUNT(id)"];
|
||||||
|
?>
|
||||||
|
Speisen
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<h1 id="kontakt">Interesse geweckt? Wir informieren</h1>
|
<h1 id="kontakt">Interesse geweckt? Wir informieren</h1>
|
||||||
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
1
|
2
|
||||||
@@ -1 +1 @@
|
|||||||
[{"name":"Max","email":"max@gmail.com","language":"deutsch","terms":"on"},{"name":"Max","email":"max@gmail.com","language":"deutsch","terms":"on"},{"name":"Max","email":"max@gmail.com","language":"deutsch","terms":"on"},{"name":"Max","email":"max@gmail.com","language":"deutsch","terms":"on"},{"name":"Ro","email":"robert-joel@web.de","language":"deutsch","terms":"on"},{"name":"Robert","email":"robert-joel@web.de","language":"deutsch","terms":"on"}]
|
[{"name":"Max","email":"max@gmail.com","language":"deutsch","terms":"on"},{"name":"Max","email":"max@gmail.com","language":"deutsch","terms":"on"},{"name":"Max","email":"max@gmail.com","language":"deutsch","terms":"on"},{"name":"Max","email":"max@gmail.com","language":"deutsch","terms":"on"},{"name":"Ro","email":"robert-joel@web.de","language":"deutsch","terms":"on"},{"name":"Robert","email":"robert-joel@web.de","language":"deutsch","terms":"on"},{"name":"Max","email":"max@gmail.com","language":"deutsch","terms":"on"}]
|
||||||
BIN
M3/dossier m3.pdf
Normal file
8
M4/.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
||||||
8
M4/.idea/M4.iml
generated
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="WEB_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager">
|
||||||
|
<content url="file://$MODULE_DIR$" />
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
||||||
12
M4/.idea/dataSources.xml
generated
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
|
||||||
|
<data-source source="LOCAL" name="emensawerbeseite" uuid="0a2c3473-febe-491a-b3f1-82e9ba5b153f">
|
||||||
|
<driver-ref>mariadb</driver-ref>
|
||||||
|
<synchronize>true</synchronize>
|
||||||
|
<jdbc-driver>org.mariadb.jdbc.Driver</jdbc-driver>
|
||||||
|
<jdbc-url>jdbc:mariadb://localhost:3306</jdbc-url>
|
||||||
|
<working-dir>$ProjectFileDir$</working-dir>
|
||||||
|
</data-source>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
8
M4/.idea/modules.xml
generated
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/M4.iml" filepath="$PROJECT_DIR$/.idea/M4.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
20
M4/.idea/php.xml
generated
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="MessDetectorOptionsConfiguration">
|
||||||
|
<option name="transferred" value="true" />
|
||||||
|
</component>
|
||||||
|
<component name="PHPCSFixerOptionsConfiguration">
|
||||||
|
<option name="transferred" value="true" />
|
||||||
|
</component>
|
||||||
|
<component name="PHPCodeSnifferOptionsConfiguration">
|
||||||
|
<option name="highlightLevel" value="WARNING" />
|
||||||
|
<option name="transferred" value="true" />
|
||||||
|
</component>
|
||||||
|
<component name="PhpProjectSharedConfiguration" php_language_level="8.0" />
|
||||||
|
<component name="PhpStanOptionsConfiguration">
|
||||||
|
<option name="transferred" value="true" />
|
||||||
|
</component>
|
||||||
|
<component name="PsalmOptionsConfiguration">
|
||||||
|
<option name="transferred" value="true" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
6
M4/.idea/sqldialects.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="SqlDialectMappings">
|
||||||
|
<file url="PROJECT" dialect="MariaDB" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
6
M4/.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
19
M4/Dossier/.$Aufgabe1.drawio.bkp
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<mxfile host="Electron" modified="2023-12-01T15:21:01.688Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/22.1.2 Chrome/114.0.5735.289 Electron/25.9.4 Safari/537.36" etag="78gUQK1TRnweegfurtHK" version="22.1.2" type="device">
|
||||||
|
<diagram name="Seite-1" id="jhCbnHoXzx65MXILfqUJ">
|
||||||
|
<mxGraphModel dx="1050" dy="725" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
||||||
|
<root>
|
||||||
|
<mxCell id="0" />
|
||||||
|
<mxCell id="1" parent="0" />
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-1" value="" style="rhombus;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="320" y="240" width="160" height="80" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-2" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="80" y="240" width="160" height="80" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-3" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="560" y="240" width="160" height="80" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
</root>
|
||||||
|
</mxGraphModel>
|
||||||
|
</diagram>
|
||||||
|
</mxfile>
|
||||||
91
M4/Dossier/.$Aufgabe1.drawio.dtmp
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
<mxfile host="Electron" modified="2023-12-02T22:05:22.197Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/22.1.2 Chrome/114.0.5735.289 Electron/25.9.4 Safari/537.36" etag="rtvPorWLK5CfuI4500ka" version="22.1.2" type="device">
|
||||||
|
<diagram name="Seite-1" id="jhCbnHoXzx65MXILfqUJ">
|
||||||
|
<mxGraphModel dx="1048" dy="722" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
||||||
|
<root>
|
||||||
|
<mxCell id="0" />
|
||||||
|
<mxCell id="1" parent="0" />
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-1" value="erstellt" style="rhombus;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="320" y="240" width="160" height="80" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-2" value="Wunschgericht" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="560" y="240" width="160" height="80" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-3" value="Ersteller" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="80" y="240" width="160" height="80" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-4" value="Name" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="560" y="140" width="80" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-5" value="Beschreibung" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="680" y="140" width="80" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-6" value="Erstellungs-datum" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="500" y="180" width="80" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-7" value="ID" style="ellipse;whiteSpace=wrap;html=1;fontStyle=4" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="620" y="180" width="80" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-12" value="" style="endArrow=none;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="1" target="8l75yZ3mhxg1qXRySu_G-5" edge="1">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="700" y="240" as="sourcePoint" />
|
||||||
|
<mxPoint x="750" y="190" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-13" value="" style="endArrow=none;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.621;entryY=0.005;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="8l75yZ3mhxg1qXRySu_G-7" target="8l75yZ3mhxg1qXRySu_G-2" edge="1">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="730" y="280" as="sourcePoint" />
|
||||||
|
<mxPoint x="780" y="230" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-14" value="" style="endArrow=none;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="1" target="8l75yZ3mhxg1qXRySu_G-4" edge="1">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="600" y="240" as="sourcePoint" />
|
||||||
|
<mxPoint x="628" y="154" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-15" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=1;entryDx=0;entryDy=0;exitX=0.15;exitY=0.003;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="8l75yZ3mhxg1qXRySu_G-2" target="8l75yZ3mhxg1qXRySu_G-6" edge="1">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="610" y="250" as="sourcePoint" />
|
||||||
|
<mxPoint x="610" y="170" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-17" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" edge="1">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="480" y="279.66" as="sourcePoint" />
|
||||||
|
<mxPoint x="560" y="279.66" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-18" value="Name" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="80" y="160" width="80" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-19" value="<u>E-Mail</u>" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="170" y="160" width="80" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-20" value="" style="endArrow=none;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.25;exitY=0;exitDx=0;exitDy=0;" parent="1" source="8l75yZ3mhxg1qXRySu_G-3" edge="1">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="100" y="260" as="sourcePoint" />
|
||||||
|
<mxPoint x="120" y="200" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-21" value="" style="endArrow=none;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.25;exitY=0;exitDx=0;exitDy=0;" parent="1" edge="1">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="209.65999999999997" y="240" as="sourcePoint" />
|
||||||
|
<mxPoint x="209.65999999999997" y="200" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-22" value="N" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="530" y="250" width="30" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-23" value="1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="240" y="250" width="30" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-24" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" edge="1">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="240" y="280" as="sourcePoint" />
|
||||||
|
<mxPoint x="320" y="280" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
</root>
|
||||||
|
</mxGraphModel>
|
||||||
|
</diagram>
|
||||||
|
</mxfile>
|
||||||
91
M4/Dossier/Aufgabe1.drawio
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
<mxfile host="Electron" modified="2023-12-02T22:05:19.234Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/22.1.2 Chrome/114.0.5735.289 Electron/25.9.4 Safari/537.36" etag="UqWXQEsGpaBe1QuKew26" version="22.1.2" type="device">
|
||||||
|
<diagram name="Seite-1" id="jhCbnHoXzx65MXILfqUJ">
|
||||||
|
<mxGraphModel dx="1048" dy="722" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
||||||
|
<root>
|
||||||
|
<mxCell id="0" />
|
||||||
|
<mxCell id="1" parent="0" />
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-1" value="erstellt" style="rhombus;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="320" y="240" width="160" height="80" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-2" value="Wunschgericht" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="560" y="240" width="160" height="80" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-3" value="Ersteller" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="80" y="240" width="160" height="80" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-4" value="Name" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="560" y="140" width="80" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-5" value="Beschreibung" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="680" y="140" width="80" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-6" value="Erstellungs-datum" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="500" y="180" width="80" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-7" value="ID" style="ellipse;whiteSpace=wrap;html=1;fontStyle=4" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="620" y="180" width="80" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-12" value="" style="endArrow=none;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="1" target="8l75yZ3mhxg1qXRySu_G-5" edge="1">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="700" y="240" as="sourcePoint" />
|
||||||
|
<mxPoint x="750" y="190" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-13" value="" style="endArrow=none;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.621;entryY=0.005;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="8l75yZ3mhxg1qXRySu_G-7" target="8l75yZ3mhxg1qXRySu_G-2" edge="1">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="730" y="280" as="sourcePoint" />
|
||||||
|
<mxPoint x="780" y="230" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-14" value="" style="endArrow=none;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="1" target="8l75yZ3mhxg1qXRySu_G-4" edge="1">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="600" y="240" as="sourcePoint" />
|
||||||
|
<mxPoint x="628" y="154" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-15" value="" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=1;entryDx=0;entryDy=0;exitX=0.15;exitY=0.003;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="8l75yZ3mhxg1qXRySu_G-2" target="8l75yZ3mhxg1qXRySu_G-6" edge="1">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="610" y="250" as="sourcePoint" />
|
||||||
|
<mxPoint x="610" y="170" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-17" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" edge="1">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="480" y="279.66" as="sourcePoint" />
|
||||||
|
<mxPoint x="560" y="279.66" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-18" value="Name" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="80" y="160" width="80" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-19" value="<u>E-Mail</u>" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="170" y="160" width="80" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-20" value="" style="endArrow=none;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.25;exitY=0;exitDx=0;exitDy=0;" parent="1" source="8l75yZ3mhxg1qXRySu_G-3" edge="1">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="100" y="260" as="sourcePoint" />
|
||||||
|
<mxPoint x="120" y="200" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-21" value="" style="endArrow=none;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.25;exitY=0;exitDx=0;exitDy=0;" parent="1" edge="1">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="209.65999999999997" y="240" as="sourcePoint" />
|
||||||
|
<mxPoint x="209.65999999999997" y="200" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-22" value="N" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="530" y="250" width="30" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-23" value="1" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="240" y="250" width="30" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="8l75yZ3mhxg1qXRySu_G-24" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" edge="1">
|
||||||
|
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||||
|
<mxPoint x="240" y="280" as="sourcePoint" />
|
||||||
|
<mxPoint x="320" y="280" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
</root>
|
||||||
|
</mxGraphModel>
|
||||||
|
</diagram>
|
||||||
|
</mxfile>
|
||||||
BIN
M4/Dossier/ERD M4-1-1.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
144
M4/Dossier/M4.md
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
# Aufgabe 1
|
||||||
|
> Dauer: 2 h
|
||||||
|
## 1)
|
||||||
|

|
||||||
|
## 2) Datenbankentwurf in Relationenschreibweise
|
||||||
|
```sql
|
||||||
|
use emensawerbeseite;
|
||||||
|
|
||||||
|
-- Tabelle 'Ersteller' erstellen
|
||||||
|
CREATE TABLE IF NOT EXISTS Ersteller (
|
||||||
|
EMail VARCHAR(255) PRIMARY KEY,
|
||||||
|
Name VARCHAR(255) DEFAULT 'anonym'
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Tabelle 'Wunschgericht' erstellen
|
||||||
|
CREATE TABLE IF NOT EXISTS Wunschgericht (
|
||||||
|
ID INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
Name VARCHAR(255) NOT NULL,
|
||||||
|
Beschreibung TEXT,
|
||||||
|
Erstellungsdatum DATE NOT NULL,
|
||||||
|
Ersteller_EMail VARCHAR(255) NOT NULL,
|
||||||
|
FOREIGN KEY (Ersteller_EMail) REFERENCES Ersteller(EMail)
|
||||||
|
);
|
||||||
|
```
|
||||||
|
## 6)
|
||||||
|
### a)
|
||||||
|
````sql
|
||||||
|
select * from wunschgericht order by Erstellungsdatum desc limit 5;
|
||||||
|
````
|
||||||
|
### b)
|
||||||
|
````sql
|
||||||
|
-- basierend auf M3 6) 4)
|
||||||
|
select ersteller.Name,
|
||||||
|
count(Ersteller_EMail) as anzahl from wunschgericht, ersteller where ersteller.EMail = wunschgericht.Ersteller_EMail
|
||||||
|
group by Ersteller_EMail
|
||||||
|
order by anzahl desc ;
|
||||||
|
````
|
||||||
|
---
|
||||||
|
# Aufgabe 2
|
||||||
|
> Dauer: 2h
|
||||||
|
|
||||||
|
Bei der Übergabe von Daten in die DB müssen diese geprüft werden.
|
||||||
|
Bei der Ausgabe von Daten aus der DB im HTML Code müssen diese Maskiert werden.
|
||||||
|
````php
|
||||||
|
// wunschgericht.php
|
||||||
|
// Zeile 33
|
||||||
|
$sql_ersteller_exists = "SELECT * FROM ersteller WHERE EMail = '" . $ersteller_email . "'";
|
||||||
|
$sql_ersteller_exists = "SELECT * FROM ersteller WHERE EMail = '" . mysqli_real_escape_string($link, $ersteller_email) . "'";
|
||||||
|
|
||||||
|
// Zeile 36
|
||||||
|
$sql_ersteller = "INSERT INTO ersteller(EMail, Name) VALUES ('" . $ersteller_email . "','" . $ersteller_name . "')";
|
||||||
|
$sql_ersteller = "INSERT INTO ersteller(EMail, Name) VALUES ('" . mysqli_real_escape_string($link, $ersteller_email) . "','" . mysqli_real_escape_string($link, $ersteller_name) . "')";
|
||||||
|
|
||||||
|
// Zeile 42
|
||||||
|
$sql = "INSERT INTO wunschgericht(Name, Beschreibung, Erstellungsdatum, Ersteller_EMail) VALUES ('" . $gericht_name . "','" . $gericht_beschreibung . "','". $date ."','" . $ersteller_email . "')";
|
||||||
|
$sql = "INSERT INTO wunschgericht(Name, Beschreibung, Erstellungsdatum, Ersteller_EMail) VALUES ('" . mysqli_real_escape_string($link, $gericht_name) . "','" . mysqli_real_escape_string($link, $gericht_beschreibung) . "','".$date."','" . mysqli_real_escape_string($link, $ersteller_email) . "')";
|
||||||
|
?>
|
||||||
|
````
|
||||||
|
|
||||||
|
````php
|
||||||
|
// index.php
|
||||||
|
// Zeile 43
|
||||||
|
$sql_besucher = "UPDATE besucher_counter SET besucher =".$besucherCount;
|
||||||
|
$sql_besucher = "UPDATE besucher_counter SET besucher =". mysqli_real_escape_string($link, $besucherCount);
|
||||||
|
|
||||||
|
// Zeile 190
|
||||||
|
$tabelle .= "<tr class=\"speisen\"><td>" . $row_gerichte['name'] . " <sup>" . $allergene . "</sup></td><td>" . $preisintern . "€</td><td>" . $preisextern . "€</td><td>Kein Bild in der Datenbank </td></tr>";
|
||||||
|
$tabelle .= "<tr class=\"speisen\"><td>" . htmlspecialchars($row_gerichte['name']) . " <sup>" . htmlspecialchars($allergene) . "</sup></td><td>" . htmlspecialchars($preisintern) . "€</td><td>" . htmlspecialchars($preisextern) . "€</td><td>Kein Bild in der Datenbank </td></tr>";
|
||||||
|
|
||||||
|
|
||||||
|
// Zeile 202
|
||||||
|
$verwendete_allergene_string .= "<sup>".$row_allergen['code']."</sup> ". $row_allergen['name']. ", ";
|
||||||
|
$verwendete_allergene_string .= "<sup>". htmlspecialchars($row_allergen['code']) ."</sup> ". htmlspecialchars($row_allergen['name']) . ", ";
|
||||||
|
|
||||||
|
// Zeile 214f
|
||||||
|
echo $besucherCount;
|
||||||
|
echo $newletterCount;
|
||||||
|
|
||||||
|
echo htmlspecialchars($besucherCount);
|
||||||
|
echo htmlspecialchars($newletterCount);
|
||||||
|
|
||||||
|
// Zeile 220
|
||||||
|
echo $ausgabe["COUNT(id)"];
|
||||||
|
echo htmlspecialchars($ausgabe["COUNT(id)"]);
|
||||||
|
````
|
||||||
|
Bei der Newsletteranmeldung sollte man sich auch ggf. überlegen, wie man die Eingaben prüft un zu vermeiden, das schadhafter Code gespeichert und später abgerufen wird.
|
||||||
|
|
||||||
|
# Aufgabe 4
|
||||||
|
> Dauer 1,5 h
|
||||||
|
1. Eindeutigkeit für die Kombination aus Gericht und Kategorie sicherstellen
|
||||||
|
````sql
|
||||||
|
ALTER TABLE gericht_hat_kategorie
|
||||||
|
ADD CONSTRAINT gericht_kategorie_unique UNIQUE (gericht_id, kategorie_id);
|
||||||
|
````
|
||||||
|
2. In der Tabelle gericht soll eine Abfrage nach Name beschleunigt werden.
|
||||||
|
````sql
|
||||||
|
ALTER TABLE gericht
|
||||||
|
ADD INDEX idx_name (name);
|
||||||
|
````
|
||||||
|
3. Bei Löschung eines Gerichts sollen
|
||||||
|
1) die zugehörigen Zuordnungen zu einer Kategorie sowie
|
||||||
|
````sql
|
||||||
|
ALTER TABLE gericht_hat_kategorie
|
||||||
|
DROP FOREIGN KEY gericht_hat_kategorie_ibfk_1, -- (gericht_id) -> gericht(id)
|
||||||
|
ADD CONSTRAINT gericht_hat_kategorie_ibfk_1_new
|
||||||
|
FOREIGN KEY (gericht_id) REFERENCES gericht(id)
|
||||||
|
ON DELETE CASCADE;
|
||||||
|
````
|
||||||
|
2) die zugehörigen Zuordnungen zu Allergenen automatisch mit gelöscht werden.
|
||||||
|
````sql
|
||||||
|
ALTER TABLE gericht_hat_allergen
|
||||||
|
DROP FOREIGN KEY gericht_hat_allergen_ibfk_2, -- (gericht_id) -> gericht(id)
|
||||||
|
ADD CONSTRAINT gericht_hat_allergen_ibfk_2_new
|
||||||
|
FOREIGN KEY (gericht_id) REFERENCES gericht(id)
|
||||||
|
ON DELETE CASCADE;
|
||||||
|
````
|
||||||
|
4. Eine Kategorie kann nur dann gelöscht werden, wenn
|
||||||
|
1) dieser keine Gerichte zugeordnet sind und
|
||||||
|
````sql
|
||||||
|
ALTER TABLE gericht_hat_kategorie
|
||||||
|
ADD CONSTRAINT fk_gericht_hat_kategorie_kategorie_id
|
||||||
|
FOREIGN KEY (kategorie_id) REFERENCES kategorie(id)
|
||||||
|
ON DELETE RESTRICT;
|
||||||
|
````
|
||||||
|
2) diese keine Kindkategorien besitzt.
|
||||||
|
````sql
|
||||||
|
ALTER TABLE kategorie
|
||||||
|
ADD CONSTRAINT fk_kategorie_eltern_id
|
||||||
|
FOREIGN KEY (eltern_id) REFERENCES kategorie(id)
|
||||||
|
ON DELETE RESTRICT;
|
||||||
|
````
|
||||||
|
5. Wird der Code eines Allergens verändert, so ändert sich dieser Code automatisch in den referenzierenden Datensätzen.
|
||||||
|
````sql
|
||||||
|
ALTER TABLE gericht_hat_allergen
|
||||||
|
DROP FOREIGN KEY gericht_hat_allergen_ibfk_1, -- (code) -> allergen(code)
|
||||||
|
ADD CONSTRAINT gericht_hat_allergen_ibfk_1_new
|
||||||
|
FOREIGN KEY (code) REFERENCES allergen(code)
|
||||||
|
ON UPDATE CASCADE;
|
||||||
|
````
|
||||||
|
6. Eine Kombination aus ``gericht_id`` und ``kategorie_id`` in ``gericht_hat_kategorie`` soll als Primärschlüssel dienen.
|
||||||
|
````sql
|
||||||
|
ALTER TABLE gericht_hat_kategorie
|
||||||
|
ADD PRIMARY KEY (gericht_id, kategorie_id);
|
||||||
|
````
|
||||||
1
M4/Werbeseite/besucher.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
218
|
||||||
BIN
M4/Werbeseite/fh-logo.jpg
Normal file
|
After Width: | Height: | Size: 64 KiB |
31
M4/Werbeseite/gerichte.php
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Praktikum DBWT. Autoren:
|
||||||
|
* Şafak, Hazinedar, 3108590
|
||||||
|
* Robert, Joel, 3672729
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
$gerichte = [
|
||||||
|
1 => ['name' => 'Rindfleich mit Bambus, Kaiserschoten und roter Paprika, dazu Mie Nudeln',
|
||||||
|
'priceint' => 3.50,
|
||||||
|
"priceex" => 6.20,
|
||||||
|
"img" =>"img/bambus.jpg"
|
||||||
|
],
|
||||||
|
2 => ['name' => 'Spinatrisotto mit kleinen Samosateigecken und gemischter Salat',
|
||||||
|
'priceint' => 2.90,
|
||||||
|
"priceex" => 5.30,
|
||||||
|
"img" =>"img/risotto.jpg"
|
||||||
|
],
|
||||||
|
3 => ['name' => 'Spaghetti Bolognese',
|
||||||
|
'priceint' => 3,
|
||||||
|
"priceex" => 5,
|
||||||
|
"img" =>"img/bolo.jpg"
|
||||||
|
],
|
||||||
|
4 => ['name' => 'Spaghetti Carbonara',
|
||||||
|
'priceint' => 3,
|
||||||
|
"priceex" => 5,
|
||||||
|
"img" =>"img/carbonara.jpg"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
?>
|
||||||
BIN
M4/Werbeseite/img/bambus.jpg
Normal file
|
After Width: | Height: | Size: 1.6 MiB |
BIN
M4/Werbeseite/img/bolo.jpg
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
BIN
M4/Werbeseite/img/carbonara.jpg
Normal file
|
After Width: | Height: | Size: 139 KiB |
BIN
M4/Werbeseite/img/risotto.jpg
Normal file
|
After Width: | Height: | Size: 103 KiB |
274
M4/Werbeseite/index.php
Normal file
@@ -0,0 +1,274 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Praktikum DBWT. Autoren:
|
||||||
|
* Şafak, Hazinedar, 3108590
|
||||||
|
* Robert, Joel, 3672729
|
||||||
|
*/
|
||||||
|
|
||||||
|
include "gerichte.php";
|
||||||
|
|
||||||
|
$besucherCount = 0;
|
||||||
|
$newletterCount = 0;
|
||||||
|
|
||||||
|
// Datenbankanbindung
|
||||||
|
//$link = mysqli_connect(
|
||||||
|
//"127.0.0.1", // Host der Datenbank
|
||||||
|
//"root", // Benutzername zur Anmeldung
|
||||||
|
//"wm#32", // Passwort
|
||||||
|
//"emensawerbeseite" // Auswahl der Datenbanken (bzw. des Schemas)
|
||||||
|
//);
|
||||||
|
|
||||||
|
$link = mysqli_connect(
|
||||||
|
"127.0.0.1", // Host der Datenbank
|
||||||
|
"root", // Benutzername zur Anmeldung
|
||||||
|
"wm#32", // Passwort
|
||||||
|
"emensawerbeseite" // Auswahl der Datenbanken (bzw. des Schemas)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!$link) {
|
||||||
|
echo "Verbindung fehlgeschlagen: ", mysqli_connect_error();
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
//Besucher counter
|
||||||
|
|
||||||
|
//Aktuelle Besucher Zahl
|
||||||
|
$sql_besucher = "SELECT besucher FROM besucher_counter WHERE id=1";
|
||||||
|
$result_sql_besucher = mysqli_query($link, $sql_besucher);
|
||||||
|
$besucher = mysqli_fetch_assoc($result_sql_besucher);
|
||||||
|
|
||||||
|
//Updatet Besucher Zahl
|
||||||
|
$besucherCount = $besucher["besucher"] + 1;
|
||||||
|
$sql_besucher = "UPDATE besucher_counter SET besucher =". mysqli_real_escape_string($link, $besucherCount);
|
||||||
|
$result_sql_besucher = mysqli_query($link, $sql_besucher);
|
||||||
|
|
||||||
|
//Newletter counter
|
||||||
|
if (file_exists("newletter.txt")) {
|
||||||
|
$newsFile = fopen("newletter.txt", "r");
|
||||||
|
$newletterCount = fgets($newsFile);
|
||||||
|
fclose($newsFile);
|
||||||
|
} else {
|
||||||
|
$newsFile = fopen("newletter.txt", "w");
|
||||||
|
fwrite($newsFile, 0);
|
||||||
|
fclose($newsFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Newletter Anmeldung
|
||||||
|
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
||||||
|
$name = $_POST['name'];
|
||||||
|
$email = $_POST['email'];
|
||||||
|
$language = $_POST['language'];
|
||||||
|
$terms = $_POST['terms'];
|
||||||
|
|
||||||
|
$errors = array();
|
||||||
|
//Error handling
|
||||||
|
if (empty(trim($name))) {
|
||||||
|
$errors[] = "Bitte geben Sie einen Namen ein.";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($terms)) {
|
||||||
|
$errors[] = "Bitte stimmen Sie den Datenschutzbestimmungen zu.";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
||||||
|
$errors[] = "Bitte geben Sie eine gültige E-Mail-Adresse ein.";
|
||||||
|
}
|
||||||
|
|
||||||
|
$spam_domains = array("rcpt.at", "damnthespam.at", "wegwerfmail.de", "trashmail");
|
||||||
|
|
||||||
|
foreach ($spam_domains as $domain) {
|
||||||
|
if (str_contains($email, $domain)) {
|
||||||
|
$errors[] = "Bitte geben Sie eine gültige E-Mail-Adresse ein, keine Wegwerf- oder Spam-E-Mail-Adresse.";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($errors)) {
|
||||||
|
$data = array(
|
||||||
|
"name" => $name,
|
||||||
|
"email" => $email,
|
||||||
|
"language" => $language,
|
||||||
|
"terms" => $terms
|
||||||
|
);
|
||||||
|
//File writing
|
||||||
|
$file = "subscriptions.json";
|
||||||
|
$current_data = file_exists($file) ? json_decode(file_get_contents($file), true) : array();
|
||||||
|
$current_data[] = $data;
|
||||||
|
|
||||||
|
if (file_put_contents($file, json_encode($current_data))) {
|
||||||
|
echo '<script type="text/javascript"> alert("Vielen Dank für Ihre Anmeldung zum Newsletter.");</script>';
|
||||||
|
|
||||||
|
//Newsletter counter
|
||||||
|
$newletterCount++;
|
||||||
|
$newsFile = fopen("newletter.txt", "w");
|
||||||
|
fwrite($newsFile, $newletterCount);
|
||||||
|
fclose($newsFile);
|
||||||
|
} else {
|
||||||
|
echo '<script type="text/javascript">alert("Es gab einen Fehler bei Ihrer Anmeldung. Bitte versuchen Sie es erneut.");</script>';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$error_string = "";
|
||||||
|
foreach ($errors as $error) {
|
||||||
|
$error_string .= $error . '\n';
|
||||||
|
}
|
||||||
|
|
||||||
|
echo '<script type="text/javascript">alert("' . $error_string . '");</script>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
|
|
||||||
|
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en" xmlns="http://www.w3.org/1999/html">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Ihre E-Mensa</title>
|
||||||
|
<link rel="stylesheet" href="style.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="grid">
|
||||||
|
<div>
|
||||||
|
<img src="fh-logo.jpg" alt="FH-Logo">
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<a href="#ankündigung">Ankündigung</a>
|
||||||
|
<a href="#speisen">Speisen</a>
|
||||||
|
<a href="#zahlen">Zahlen</a>
|
||||||
|
<a href="#kontakt">Kontakt</a>
|
||||||
|
<a href="#wichtig">Wichtig für uns</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<hr>
|
||||||
|
<div class="grid">
|
||||||
|
<div></div>
|
||||||
|
<div>
|
||||||
|
<img src="mensa21.jpg" alt="Essen">
|
||||||
|
<h1 id="ankündigung">Bald gibt es auch Essen online ;)</h1>
|
||||||
|
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et
|
||||||
|
dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet
|
||||||
|
clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet,
|
||||||
|
consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,
|
||||||
|
sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no
|
||||||
|
sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
|
||||||
|
<h1 id="speisen">Köstlichkeiten die Sie erwarten</h1>
|
||||||
|
|
||||||
|
<!-- Speisekarte -->
|
||||||
|
<?php
|
||||||
|
//Gerichte aus Datenbank
|
||||||
|
$sql_gerichte = "SELECT * FROM gericht ORDER BY RAND() LIMIT 5";
|
||||||
|
$result_sql_gerichte = mysqli_query($link, $sql_gerichte);
|
||||||
|
|
||||||
|
$tabelle = "<table class=\"speisen\"><tr class=\"speisen\"> <td>Gerichte</td><td>Preis intern</td><td>Preis extern</td><td>Bild</td></tr>";
|
||||||
|
|
||||||
|
$verwendete_allergene_code = [];
|
||||||
|
$verwendete_allergene_string = "";
|
||||||
|
|
||||||
|
while ($row_gerichte = mysqli_fetch_assoc($result_sql_gerichte)) {
|
||||||
|
|
||||||
|
// Abfrage der vorhandenen Allergene im aktuellen Gericht
|
||||||
|
|
||||||
|
$sql_gericht_hat_allergene = "SELECT * FROM gericht_hat_allergen WHERE gericht_id=" . $row_gerichte['id'];
|
||||||
|
$result_sql_gericht_hat_allergene = mysqli_query($link, $sql_gericht_hat_allergene);
|
||||||
|
$allergene = "";
|
||||||
|
while ($row_allergene = mysqli_fetch_assoc($result_sql_gericht_hat_allergene)) {
|
||||||
|
$allergene .= $row_allergene['code'] . ", ";
|
||||||
|
|
||||||
|
if (!in_array($row_allergene['code'], $verwendete_allergene_code)) {
|
||||||
|
$verwendete_allergene_code[] = $row_allergene['code'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Preise in EUR
|
||||||
|
|
||||||
|
$preisintern = number_format($row_gerichte['preisintern'], 2, ',', '.');
|
||||||
|
$preisextern = number_format($row_gerichte['preisextern'], 2, ',', '.');
|
||||||
|
|
||||||
|
// Ausgabe des aktuellen Gerichts
|
||||||
|
|
||||||
|
$tabelle .= "<tr class=\"speisen\"><td>" . htmlspecialchars($row_gerichte['name']) . " <sup>" . htmlspecialchars($allergene) . "</sup></td><td>" . htmlspecialchars($preisintern) . "€</td><td>" . htmlspecialchars($preisextern) . "€</td><td>Kein Bild in der Datenbank </td></tr>";
|
||||||
|
}
|
||||||
|
$tabelle .= "</table>";
|
||||||
|
echo $tabelle;
|
||||||
|
|
||||||
|
// Abfrage der Allergen Code und Name
|
||||||
|
|
||||||
|
$sql_allergen = "SELECT code, name FROM allergen";
|
||||||
|
$result_sql_allergen = mysqli_query($link, $sql_allergen);
|
||||||
|
|
||||||
|
while ($row_allergen = mysqli_fetch_assoc($result_sql_allergen)){
|
||||||
|
if (in_array($row_allergen['code'], $verwendete_allergene_code)){
|
||||||
|
$verwendete_allergene_string .= "<sup>". htmlspecialchars($row_allergen['code']) ."</sup> ". htmlspecialchars($row_allergen['name']) . ", ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
echo $verwendete_allergene_string;
|
||||||
|
?>
|
||||||
|
|
||||||
|
<h1>Für Sie nichts dabei? <a href="../Werbeseite/wunschgericht.php">Wunschgericht erfassen</a></h1>
|
||||||
|
|
||||||
|
|
||||||
|
<h1 id="zahlen">E-Mensa in Zahlen</h1>
|
||||||
|
<div class="zahlen">
|
||||||
|
<p><?php echo htmlspecialchars($besucherCount); ?> Besuche</p>
|
||||||
|
<p><?php echo htmlspecialchars($newletterCount); ?> Anmeldungen zum Newsletter</p><p>
|
||||||
|
<?php
|
||||||
|
$sql_gerichte = "SELECT COUNT(id) FROM gericht";
|
||||||
|
$result_sql_gerichte = mysqli_query($link, $sql_gerichte);
|
||||||
|
$ausgabe = mysqli_fetch_assoc($result_sql_gerichte);
|
||||||
|
echo htmlspecialchars($ausgabe["COUNT(id)"]);
|
||||||
|
?>
|
||||||
|
Speisen
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<h1 id="kontakt">Interesse geweckt? Wir informieren</h1>
|
||||||
|
|
||||||
|
<form method="post">
|
||||||
|
<div class="formular">
|
||||||
|
<div>
|
||||||
|
<label for="name">Name:</label> <br>
|
||||||
|
<input type="text" name="name" id="name" placeholder="Bitte geben Sie Ihren Namen ein">
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="email">E-Mail:</label> <br>
|
||||||
|
<input type="email" name="email" id="email" placeholder="Bitte geben Sie Ihre E-Mail ein">
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for="language">Newsletter bitte in:</label> <br>
|
||||||
|
<select name="language" id="language">
|
||||||
|
<option value="deutsch">Deutsch</option>
|
||||||
|
<option value="englisch">Englisch</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
<input required type="checkbox" name="terms" id="terms">
|
||||||
|
<label for="terms">Den Datenschutzbestimmungen stimme ich zu</label>
|
||||||
|
<button type="submit">Zum Newsletter anmelden</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
|
||||||
|
<h1 id="wichtig">Das ist uns wichtig</h1>
|
||||||
|
<div class="wichtig">
|
||||||
|
<ul class="wichtigListe">
|
||||||
|
<li>Beste frische saisonale Zutaten</li>
|
||||||
|
<li>Ausgewogen abwechslungsreiche Gerichte</li>
|
||||||
|
<li>Sauberkeit</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<h1 class="freude">Wir freuen uns auf Ihren Besuch!</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<footer>
|
||||||
|
<table class="fusszeile">
|
||||||
|
<tr>
|
||||||
|
<td>(c) E-Mensa GmbH</td>
|
||||||
|
<td>Şafak Hazinedar & Robert Joel</td>
|
||||||
|
<td><a href="">Impressum</a></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
BIN
M4/Werbeseite/mensa21.jpg
Normal file
|
After Width: | Height: | Size: 153 KiB |
1
M4/Werbeseite/newletter.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
2
|
||||||
90
M4/Werbeseite/style.css
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
* {
|
||||||
|
font-family: Arial;
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 200px auto 200px;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.speisen {
|
||||||
|
border: solid;
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
.speisen td {
|
||||||
|
border: solid;
|
||||||
|
border-collapse: collapse;
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 5px;
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.speisen td:not(:first-of-type) {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
text-align: justify;
|
||||||
|
}
|
||||||
|
|
||||||
|
.zahlen {
|
||||||
|
list-style-type: none;
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: auto auto auto;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.zahlen p {
|
||||||
|
text-align: center;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.formular {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: auto auto auto;
|
||||||
|
justify-content: start;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wichtig {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wichtigListe {
|
||||||
|
display: inline-block;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.freude {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
border-top: 1px solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fusszeile {
|
||||||
|
padding-top: 20px;
|
||||||
|
padding-bottom: 20px;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fusszeile td:first-child {
|
||||||
|
border-left: none;
|
||||||
|
padding-left: 20px;
|
||||||
|
padding-right: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fusszeile td {
|
||||||
|
border-left: 3px solid;
|
||||||
|
padding-left: 20px;
|
||||||
|
padding-right: 20px;
|
||||||
|
}
|
||||||
1
M4/Werbeseite/subscriptions.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[{"name":"Max","email":"max@gmail.com","language":"deutsch","terms":"on"},{"name":"Max","email":"max@gmail.com","language":"deutsch","terms":"on"},{"name":"Max","email":"max@gmail.com","language":"deutsch","terms":"on"},{"name":"Max","email":"max@gmail.com","language":"deutsch","terms":"on"},{"name":"Ro","email":"robert-joel@web.de","language":"deutsch","terms":"on"},{"name":"Robert","email":"robert-joel@web.de","language":"deutsch","terms":"on"},{"name":"Max","email":"max@gmail.com","language":"deutsch","terms":"on"}]
|
||||||
104
M4/Werbeseite/wunschgericht.php
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
<?php
|
||||||
|
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
||||||
|
$gericht_name = $_POST['gericht_name'];
|
||||||
|
$gericht_beschreibung = $_POST['gericht_beschreibung'];
|
||||||
|
$ersteller_name = $_POST['ersteller_name'];
|
||||||
|
$ersteller_email = $_POST['ersteller_email'];
|
||||||
|
|
||||||
|
// Datenbankverbindung
|
||||||
|
$link = mysqli_connect(
|
||||||
|
"127.0.0.1",
|
||||||
|
"root",
|
||||||
|
"wm#32",
|
||||||
|
"emensawerbeseite"
|
||||||
|
);
|
||||||
|
if (!$link) {
|
||||||
|
echo "Verbindung fehlgeschlagen: ", mysqli_connect_error();
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
$error_count = 0;
|
||||||
|
$spam_domains = array("rcpt.at", "damnthespam.at", "wegwerfmail.de", "trashmail");
|
||||||
|
|
||||||
|
foreach ($spam_domains as $domain) {
|
||||||
|
if (str_contains($ersteller_email, $domain)) {
|
||||||
|
echo '<script type="text/javascript"> alert("Fehler bei den übermittelten Daten");</script>';
|
||||||
|
$error_count++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!$error_count){
|
||||||
|
// Ersteller in DB eintragen
|
||||||
|
$sql_ersteller_exists = "SELECT * FROM ersteller WHERE EMail = '" . mysqli_real_escape_string($link, $ersteller_email) . "'";
|
||||||
|
$result_ersteller_exists = mysqli_query($link,$sql_ersteller_exists);
|
||||||
|
if(mysqli_num_rows($result_ersteller_exists) == 0){
|
||||||
|
$sql_ersteller = "INSERT INTO ersteller(EMail, Name) VALUES ('" . mysqli_real_escape_string($link, $ersteller_email) . "','" . mysqli_real_escape_string($link, $ersteller_name) . "')";
|
||||||
|
$result_ersteller = mysqli_query($link,$sql_ersteller);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gericht in die DB eintragen
|
||||||
|
$date = date("Y-m-d");
|
||||||
|
$sql = "INSERT INTO wunschgericht(Name, Beschreibung, Erstellungsdatum, Ersteller_EMail)
|
||||||
|
VALUES ('" . mysqli_real_escape_string($link, $gericht_name) . "','" . mysqli_real_escape_string($link, $gericht_beschreibung) . "','".$date."','" . mysqli_real_escape_string($link, $ersteller_email) . "')";
|
||||||
|
$result = mysqli_query($link, $sql);
|
||||||
|
|
||||||
|
if ($result) {
|
||||||
|
echo '<script type="text/javascript"> alert("Ihr Wunschgericht wurde erfolgreich gespeichert!");</script>';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
echo '<script type="text/javascript"> alert("Es gab einen Fehler: "' . mysqli_error($link) . '</script>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mysqli_close($link);
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
|
||||||
|
<html lang="en" xmlns="http://www.w3.org/1999/html">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Ihre E-Mensa</title>
|
||||||
|
<link rel="stylesheet" href="style.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="grid">
|
||||||
|
<div>
|
||||||
|
<img src="fh-logo.jpg" alt="FH-Logo">
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<a href="index.php#ankündigung">Ankündigung</a>
|
||||||
|
<a href="index.php#speisen">Speisen</a>
|
||||||
|
<a href="index.php#zahlen">Zahlen</a>
|
||||||
|
<a href="index.php#kontakt">Kontakt</a>
|
||||||
|
<a href="index.php#wichtig">Wichtig für uns</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<hr>
|
||||||
|
<form method="post" action="wunschgericht.php">
|
||||||
|
<div class="formular">
|
||||||
|
<label for="gericht_name">Name des Gerichts:</label>
|
||||||
|
<input type="text" name="gericht_name" id="gericht_name" required>
|
||||||
|
<br>
|
||||||
|
<label for="gericht_beschreibung">Beschreibung des Gerichts:</label>
|
||||||
|
<textarea name="gericht_beschreibung" id="gericht_beschreibung" required></textarea>
|
||||||
|
<br>
|
||||||
|
<label for="ersteller_name">Ihr Name:</label>
|
||||||
|
<input type="text" name="ersteller_name" id="ersteller_name">
|
||||||
|
<br>
|
||||||
|
<label for="ersteller_email">Ihre E-Mail Adresse:</label>
|
||||||
|
<input type="text" name="ersteller_email" id="ersteller_email" required>
|
||||||
|
<input type="submit" value="Wunsch abschicken">
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
<footer>
|
||||||
|
<table class="fusszeile">
|
||||||
|
<tr>
|
||||||
|
<td>(c) E-Mensa GmbH</td>
|
||||||
|
<td>Şafak Hazinedar & Robert Joel</td>
|
||||||
|
<td><a href="">Impressum</a></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</footer>
|
||||||
|
</html>
|
||||||