Cocktail Datenbank ohne Mysql mit Mysql umsetzen

druckgott

Erfahrenes Mitglied
So Leute leider fällt mir keine gescheite Idee ein wie ich das umsetzen kann aber vielleicht findet sich ja hier jemand der eine Idee hat wie man sowas in Verbindung mit eine Mysqldatenbank umsetzen kann.

Jetzt zeig ich euch erstmal meine Vorgehnsweiße ohne Mysqldatenbank

Ich habe hier mein Eingabeformular wo ich die Zutaten auswähle:
index.php

PHP:
<html>
<head>
<title>Unbenanntes Dokument</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<form method="post" action="test2.php" >
  <p>
    <select size="5" name="select[]" multiple="multiple">
      <option value="1">Vodka</option>
      <option value="2">Gin</option>
      <option value="3">Bull</option>
     <option value="4">Saft</option>
    </select>
  </p>
  <p>
    <input type="submit">
  </p>
  </form>
<p></p>
</body>
</html>

und dann in der test2.php frag ich alles dann ab:

PHP:
<?php  
//gibt aus was alles vorhanden ist
for ($i=0; $i<5; $i++)
{
$getrank = $_POST['select'][$i];

		if ($getrank == 1)
				{ $zutat1 = "vodka";}
		if ($getrank == 2)
				{ $zutat2 = "gin";}
		if ($getrank == 3)
				{$zutat3 = "bull";}
		if ($getrank == 4)
				{$zutat4 = "saft";}
}

//Cocktails und Zutaten
$cocktail1 = "Cocktail1";
$cocktail2 = "Cocktail2";
$cocktail3 = "Cocktail3";
$cocktail4 = "Cocktail4";
$cocktailzut1 = ($zutat1 == "vodka" AND $zutat2 == "gin" AND $zutat4 == "saft");
$cocktailzut2 = ($zutat3 == "bull" AND $zutat4 == "saft");
$cocktailzut3 = ($zutat1 == "vodka" AND $zutat4 == "saft");
$cocktailzut4 = ($zutat1 == "vodka" AND $zutat2 == "gin");


//Testet die Cocktails die man mixxen kann
if ($cocktailzut1)
{
echo "$cocktail1<br />\n";
}
if ($cocktailzut2)
{
echo "$cocktail2<br />\n";
}
if ($cocktailzut3)
{
echo "$cocktail3<br />\n";
}
if ($cocktailzut4)
{
echo "$cocktail4<br />\n";
}

?>


jetzt dachte ich mir als erstes ich speicher mal die Zutaten alle in eine Datenbank mit Tabelle z.B. db_zutaten

wie ich die eingebe das schaff ich aber wie ich diese jetzt auslesen kann und eben wie ich den vergleich mit der Cocktail tabelle machen kann das weiß ich eben nicht

ich dachte mir jetzt ich erstelle erstmal eine Tabelle für die Cocktails und zwar so:

ID, Cocktailname, Zutat1, Zutat2, Zutat3 bis Zutat15 drin stehen

Jetzt soll er mir überprüfen welchen Cocktail ich mixxen kann.

Ich weiß jetzt eben nicht ob das sinvoll ist das so aufzubauen vielleicht hat jemand eine bessere Idee. Und ich weiß nicht genau wie ich diesen Vergliech aufbauen soll damit er mir eben nur den Cocktail ausgibt den man auch wirklich mixxen kann bei den Zutaten ist die sache es hat ja nicht jeder Cocktail 15 Zutaten also es kann auch sein das ein Teil der Zutaten leer ist.

Vielleicht hat ja jemand eine gute idee.

Oben ist ja schonmal ein Ansatz wie es ohne Datenbank geht

danke schonmal
mfg
druckgott
 
Ein Beispiel:
Tabelle cocktail:
  • id
    INT, primary key, auto increment, eindeutiger Bezeichner
  • name
    CHAR, Bezeichnung des Cocktail
  • rezept
    TEXT, Mixanweisungen
  • kommentar
    TEXT, z.B. Brasilianisches Nationalgetränk oder was man sonst so über den Cocktail zusammengetragen hat
Tabelle zutat:
  • id
    INT, primary key, auto increment, eindeutiger Bezeichner
  • name
    CHAR, Bezeichnung der Zutat
  • infos
    TEXT, z.B. wo bekommt man es her, Alkoholgehalt, usw.
Tabelle cocktailZutaten:
  • cocktailId
    INT, id des Cocktail
  • zutatId
    INT, id der zutat
  • menge
    CHAR, Menge, in der die Zutat in den Cocktail eingeht
Menge könnte man auch detaillierter in 2 Feldern, menge (double) und einheit (char) abbilden.
Erweitern könnte man es durch Bilder-Urls oder was einem sonst noch so einfällt.

Als Beispiel eine Abfrage für ein komplettes Rezept:
PHP:
//Verbindung zur Datenbank herstellen

$id=1; //die ID des ausgewählten cocktails, z.B. über $_GET erhalten

$res = mysql_query("SELECT 
cocktail.id AS cId,
cocktail.name AS cName,
cocktail.rezept,
cocktail.kommentar,
zutat.id AS zId
zutat.name AS zName,
zutat.menge
FROM cocktail
LEFT JOIN cocktailZutaten ON (cocktail.id=cocktailZutaten.cocktailId)
LEFT JOIN zutat ON (zutat.id=cocktailZutaten.zutatId)
WHERE cocktail.id=".mysql_real_escape_string($id));

$firstRow=true; //Hilfsvariable
$data=array();//damit es auch nach der Schleife noch existiert
while ($row=mysql_fetch_assoc($res)) {
    $data=$row;
    if ($firstRow) {
        $firstRow=false;
        echo "<h1>".$row['cName']."</h1>";
        echo "<h2>Zutaten</h2>";
        echo "<ul>";
    }
    echo "<li>".$row['menge']." ".$row['zName']."</li>";
}
echo "</ul>";
echo "<h2>Rezept</h2>";
echo "<p>".$data['rezept']."</p>";
echo "<h2>Kommentar</h2>";
echo "<p>".$data['kommentar']."</p>";
//Da wieder mal hier im Editor getippt:
//Keine Garantie auf Richtigkeit
//nur Beispiel
Es handelt sich um eine n:m-Verknüpfung zwischen den Tabellen. Jede Zutat kann in beliebig vielen Cocktails vorkommen und jeder Cocktail kann beliebig viele Zutaten beinhalten. Eine solche Verknüpfung wird durch drei Tabellen abgebildet.

Angenommen Du suchst einen Cocktail, der Wodka (id = 2) und Saft (id = 5) enthält, dann sollte so ein Query funktionieren:
Code:
SELECT cocktail.id, cocktail.name FROM cocktail
JOIN cocktailZutaten AS z1 ON (cocktail.id=z1.cocktailId)
JOIN cocktailZutaten AS z2 ON (cocktail.id=z2.cocktailId)
WHERE
z1.zutatId=2
AND
z2.zutatId=5
Das Query lässt sich natürlich entsprechend erweitern.
Ausschließen, dass es keine weiteren Zutaten gibt kann man bestimmt auch, hier ein Versuch als Anregung, von dem ich allerdings nicht glaube, dass er funktioniert:
Code:
SELECT 
cocktail.id, 
cocktail.name,
COUNT(*) AS anzahlZutaten
FROM cocktail
JOIN cocktailZutaten AS z1 ON (cocktail.id=z1.cocktailId)
JOIN cocktailZutaten AS z2 ON (cocktail.id=z2.cocktailId)
JOIN cocktailZutaten AS c ON (cocktail.id=c.cocktailId)
GROUP BY c.cocktailId
WHERE
z1.zutatId=2
AND
z2.zutatId=5
AND
anzahlZutaten=2 //Anzahl der gewählten Zutaten
Mit PHP lassen sich diese Querys dynamisch aufbauen und so nach beliebig vielen Zutaten suchen lassen.

Literatur:
Normalisierung
MySQL-Handbuch, SELECT
 
Zuletzt bearbeitet:
ah ok danke die idee ist garnicht so schlecht ich werde mal versuchen die umzusetzen

das einzige was ich nicht ganz check oder nicht ganz weiß wie du meinst ist das

Tabelle cocktailZutaten:

* cocktailId
INT, id des Cocktail
* zutatId
INT, id der zutat
* menge
CHAR, Menge, in der die Zutat in den Cocktail eingeht

und zwar die zutatdl
soll ich die unter 1 2 3 also zutat1 zutat2 zutat3 usw. erstellen oder soll ich die mit einem "," aneinander hängen oder wie meinst du das?
 
Angenommen, Du hast einen Cocktail x mit 1 cl Wodka, 3 cl Cachacha und 4 cl O-Saft und einen Cocktail y mit 2 Stk. Lemonen, 0.1 l Cachacha und 1 El. braunem Zucker, dann sieht das ungefähr so aus:
Tabelle cocktails:
Zeile 1: id=1, name=x, usw.
Zeile 2: id=2, name=y, usw.

Tabelle Zutaten:
Zeile 1: id=1, name=Wodka, usw.
Zeile 2: id=2, name=Lemonen, usw.
Zeile 3: id=3, name=O-Saft, usw.
Zeile 4: id=4, name=brauner Zucker, usw.
Zeile 5: id=5, name=Cachacha, usw.

Tabelle cocktailZutaten:
Zeile 1: cocktailId=1, zutatId=1, menge=1 cl
Zeile 2: cocktailId=1, zutatId=5, menge=3 cl
Zeile 3: cocktailId=1, zutatId=3, menge=4 cl
Zeile 4: cocktailId=2, zutatId=2, menge=2 Stk.
Zeile 5: cocktailId=2, zutatId=5, menge=0.1 l
Zeile 6: cocktailId=2, zutatId=4, menge=1 El.

Du machst also für jede Zutat, die in einem Cocktail vorkommt eine eigene Zeile in der Tabelle. Das ergibt sich aus der angesprochenen Normalisierung. Es ist übrigends die cocktailid und die zutatid, was bei Großbuchstaben wohl nicht so gut rübergekommen ist.
 
du ich bekomm immer den fehler

Fatal error: Call to undefined function: mysql_real_escape_string() in /srv/www/htdocs/web2/html/cocktail/CTDB2005/test.php on line 24

hab jetzt im i net gesucht da stand das kann an der php version liegen kann das sein?

weil eigentlich ist die ja durch das $id definiert oder? und da ist ja auch ein wert drauf
 
Wenn Deine Serverversion kleiner 4.3.0 ist, versuche es mit [phpf]mysql_escape_string[/phpf]. Wenn Du noch PHP 3 hast, dann lass die Funktion erstmal zum testen weg und füge $id direkt ein.
 
jetzt hab ich den nächsten fehler

mysql_fetchassoc()

wieder funktion nicht definiet liegt das auch an dem?
 
jo das hab ich auch gerade gemerkt *g*

aber geht trozdem nicht

jetzt bekomm ich mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /srv/www/htdocs/web2/html/cocktail/CTDB2005/test.php on line 28

das gibts ja nicht
 
Zurück