Problem mit Mysql Datenbank in verbindung mit PHP

druckgott

Erfahrenes Mitglied
Hallo ich habe ein Problem und zwar hab ich jetzt ein script geschrieben, dass mir die Cocktails herausfillter wo eine Zutat vorhanden ist jetzt gibt er aber alle aus wo die Zutat vorhanden ist. Jetzt will ich, das er mir nur die ausgibt, wo alle Zutaten vorhanden sind also wenn ich z.B. Vodka und Bull habe nur die ausgibt die auch nur! Vodka und Bull haben also nicht die die Vodak und Bull drin haben .

Also mein Script sieht bis jetzt so aus:

PHP:
<?php



@error_reporting(7);

/** connect db **/

require("config.inc.php");

require("class_db.php");

$db = new db($mysqlhost,$mysqluser,$mysqlpassword,$mysqldb);

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

$res = mysql_query("SELECT 
zutat_id AS zId,
zutat_name AS zName,
cocktail_id AS cId,
cocktail_name AS cName
FROM zutat_mehr
LEFT  JOIN cocktailZutaten_mehr ON ( zutat_id = cocktailZutaten_mehr.z1_zutatId) 
LEFT  JOIN cocktail_mehr ON ( cocktail_id = cocktailZutaten_mehr.cocktailId ) 
WHERE zutat_id ='".mysql_escape_string($id1)."'");

$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 "<h2>Zutat:</h2>";
        echo "".$row['zName']."";
        echo "<h2>Cocktail:</h2>";
        echo "<ul>";
    }
    echo "<li>".$row['menge']." ".$row['cName']."</li>";
}

?>


Hier mal noch die Tabellen zur orientierung

cocktailZutaten_mehr:
PHP:
#
# Tabellenstruktur für Tabelle `cocktailZutaten_mehr`
#

CREATE TABLE `cocktailZutaten_mehr` (
  `cocktailId` int(4) NOT NULL auto_increment,
  `z1_zutatId` int(4) NOT NULL default '0',
  `z2_zutatId` int(4) NOT NULL default '0',
  PRIMARY KEY  (`cocktailId`),
  KEY `name` (`z1_zutatId`)
) TYPE=MyISAM AUTO_INCREMENT=3 ;

#
# Daten für Tabelle `cocktailZutaten_mehr`
#

INSERT INTO `cocktailZutaten_mehr` VALUES (1, 1, 2);
INSERT INTO `cocktailZutaten_mehr` VALUES (2, 3, 2);


cocktail_mehr:
PHP:
#
# Tabellenstruktur für Tabelle `cocktail_mehr`
#

CREATE TABLE `cocktail_mehr` (
  `cocktail_id` int(4) NOT NULL auto_increment,
  `cocktail_name` varchar(255) NOT NULL default '',
  `cocktail_rezept` varchar(255) NOT NULL default '',
  `cocktail_kommentar` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`cocktail_id`),
  KEY `rezept` (`cocktail_name`)
) TYPE=MyISAM AUTO_INCREMENT=4 ;

#
# Daten für Tabelle `cocktail_mehr`
#

INSERT INTO `cocktail_mehr` VALUES (1, 'Vodka Bull', '2', 'der Kommentar');
INSERT INTO `cocktail_mehr` VALUES (2, 'Gin Tonic', '2', 'das ist der kommentar');


zutat_mehr:

PHP:
#
# Tabellenstruktur für Tabelle `zutat_mehr`
#

CREATE TABLE `zutat_mehr` (
  `zutat_id` int(4) NOT NULL auto_increment,
  `zutat_name` varchar(100) NOT NULL default '',
  `zutat_info` varchar(100) NOT NULL default '',
  PRIMARY KEY  (`zutat_id`),
  KEY `name` (`zutat_name`)
) TYPE=MyISAM AUTO_INCREMENT=4 ;

#
# Daten für Tabelle `zutat_mehr`
#

INSERT INTO `zutat_mehr` VALUES (1, 'Bull', 'hier die Info');
INSERT INTO `zutat_mehr` VALUES (2, 'Gin', 'keine');
INSERT INTO `zutat_mehr` VALUES (3, 'Saft', '');

Ich hoffe es kann mir jemand helfen! da ich leider von mysql nicht so die Megaahnung habe währe echt super

mfg
druckgott
 
Kommt mir irgendwie bekannt vor ;)
Nur die Datenbankstruktur ist anders.
Folgendes Query findet den Vodka Bull:
Code:
SELECT
cocktail_id AS cID,
cocktail_name AS cName
FROM cocktail_mehr
LEFT JOIN cocktailzutaten_mehr AS cz1
 ON (cz1.cocktailId=cocktail_mehr.cocktail_id)
WHERE (
cz1.z1_zutatId IN 
    (SELECT zutat_id FROM zutat_mehr 
    WHERE zutat_name LIKE 'Gin' OR zutat_name LIKE 'Bull' )
 AND
 cz1.z2_zutatId IN 
    (SELECT zutat_id FROM zutat_mehr 
    WHERE zutat_name LIKE 'Gin' OR zutat_name LIKE 'Bull' ))
 
also irgendwie haut das noch nicht ganz hin wenn ich die abfrage in mysqladmin starte bringt er mir einen fehler in Zeile

MySQL meldet:

#1064 - You have an error in your SQL syntax near 'SELECT zutat_id
FROM zutat_mehr
WHERE zutat_name
LIKE 'Gin' OR zutat_name
LIKE ' at line 6

Aberst starte ich jetzt nur die 2 untern select Teile haut es hin da kommt jedesmal kein fehler an was kann das liegen
 
Zuletzt bearbeitet:
Das Query geht bei mir, diesmal habe ich es sogar getestet.
Evtl. ist Deine MySQL-Version zu alt für Subselects.
Wieso hast du eigentlich 2 Zutat-IDs in der cocktailZutaten_mehr-Tabelle?

EDIT: Du kannst die IIDs auch vorher in einem eigenen Query aus der Datenbank ziehen und das Subquery damit ersetzen:
Code:
SELECT zutat_id FROM zutat_mehr 
    WHERE zutat_name LIKE 'Gin' OR zutat_name LIKE 'Bull' 

//Die erhaltenen IDs mit PHP zu einem String zusammenfügen, 
//der die IDs mit Komma getrennt enthält (fett)

SELECT
cocktail_id AS cID,
cocktail_name AS cName
FROM cocktail_mehr
LEFT JOIN cocktailzutaten_mehr AS cz1
 ON (cz1.cocktailId=cocktail_mehr.cocktail_id)
WHERE (
cz1.z1_zutatId IN 
    (1,2)
 AND
 cz1.z2_zutatId IN 
    (1,2))

Gruß hpvw
 
Zuletzt bearbeitet:
ah danke schön werde ich heute nachmittag checken

weil ein checktail ja nicht nur eine Zutat hat sondern mehrere deswegen

oder kann ich die auch in eine Zutaten ID packen und mit "," oder so trennen? oder wie würdest du das jetzt machen

Und kann man diese Ausgabe dann auch auf bis zu 15 Zutaten erweitern?
 
Zuletzt bearbeitet:
ok haut einwandfrei hin ich kann doch eigentlich immer wenn er keine Zutat drin hat also wenn er nicht die 15 stück hat in dem rest einfach 0 drin lassen dann müsste das ja auch hinhauen alsow wenn ich einen cocktail hinzufüge tut er 15 Zutaten hinzu und läste alle die leer sind einfach auf 0 und das mach ich dann bei der abfrage auch das er alle die er hat die zahlen nimmt und sonst einfach 0 übergibt!

mfg
druckgott
 
so jetzt hab ich leider schon wieder ein problem und zwar hab ich jetzt eine user Tabelle angelegt

PHP:
CREATE TABLE `user_mehr` (
  `user_id` int(4) NOT NULL auto_increment,
  `user_name` varchar(255) NOT NULL default '',
  `z1_zutat_userid` int(4) NOT NULL default '0',
  `z2_zutat_userid` int(4) NOT NULL default '0',
  `z3_zutat_userid` int(4) NOT NULL default '0',
  `z4_zutat_userid` int(4) NOT NULL default '0',
  PRIMARY KEY  (`user_id`),
  KEY `rezept` (`user_name`)
) TYPE=MyISAM AUTO_INCREMENT=4 ;

INSERT INTO `user_mehr` VALUES (3, 'test', 1, 2, 3, 4);

bei dem user wenn es mehr zutaten gibt werden die automatisch dazu getan.

und der hat jetzt eben Zutaten und jetzt will ich das er die vergleicht mit denen von den Cocktails und die Cocktails ausgibt, die ich mixxen kann

mein Script hab ich mittlerweile erweiter und zwar so:

( bei 0 da hat er keien Zutat drin also ist standart drin damit es nicht leer ist)

PHP:
<?php
@error_reporting(7);

/** connect db **/
require("config.inc.php");
require("class_db.php");
$db = new db($mysqlhost,$mysqluser,$mysqlpassword,$mysqldb);

// Daten über Post erhalten
$id1=2;
$id2=3; 
$id3=0;
$id4=0;
$id5=0; 
$id6=0;
$id7=0;
$id8=0; 
$id9=0;
$id10=0;
$id11=0; 
$id12=0;
$id13=0;
$id14=0; 
$id15=0;

// Ausgabe der Cocktails
$res = mysql_query("
SELECT 
cocktail_id AS cID,
cocktail_name AS cName
FROM cocktail_mehr
LEFT  JOIN cocktailZutaten_mehr AS cz1 ON ( cz1.cocktailId = cocktail_mehr.cocktail_id ) 
WHERE ( 
cz1.z1_zutatId IN ( ".$id1.", ".$id2.", ".$id3.", ".$id4.", ".$id5.", ".$id6.", ".$id7.", ".$id8.", ".$id9.", ".$id10.", ".$id11.", ".$id12.", ".$id13.", ".$id14.", ".$id15." )  
AND 
cz1.z2_zutatId IN ( ".$id1.", ".$id2.", ".$id3.", ".$id4.", ".$id5.", ".$id6.", ".$id7.", ".$id8.", ".$id9.", ".$id10.", ".$id11.", ".$id12.", ".$id13.", ".$id14.", ".$id15." ) 
AND 
cz1.z3_zutatId IN ( ".$id1.", ".$id2.", ".$id3.", ".$id4.", ".$id5.", ".$id6.", ".$id7.", ".$id8.", ".$id9.", ".$id10.", ".$id11.", ".$id12.", ".$id13.", ".$id14.", ".$id15." )
AND
cz1.z4_zutatId IN ( ".$id1.", ".$id2.", ".$id3.", ".$id4.", ".$id5.", ".$id6.", ".$id7.", ".$id8.", ".$id9.", ".$id10.", ".$id11.", ".$id12.", ".$id13.", ".$id14.", ".$id15." )  
AND 
cz1.z5_zutatId IN ( ".$id1.", ".$id2.", ".$id3.", ".$id4.", ".$id5.", ".$id6.", ".$id7.", ".$id8.", ".$id9.", ".$id10.", ".$id11.", ".$id12.", ".$id13.", ".$id14.", ".$id15." ) 
AND 
cz1.z6_zutatId IN ( ".$id1.", ".$id2.", ".$id3.", ".$id4.", ".$id5.", ".$id6.", ".$id7.", ".$id8.", ".$id9.", ".$id10.", ".$id11.", ".$id12.", ".$id13.", ".$id14.", ".$id15." )
AND
cz1.z7_zutatId IN ( ".$id1.", ".$id2.", ".$id3.", ".$id4.", ".$id5.", ".$id6.", ".$id7.", ".$id8.", ".$id9.", ".$id10.", ".$id11.", ".$id12.", ".$id13.", ".$id14.", ".$id15." )  
AND 
cz1.z8_zutatId IN ( ".$id1.", ".$id2.", ".$id3.", ".$id4.", ".$id5.", ".$id6.", ".$id7.", ".$id8.", ".$id9.", ".$id10.", ".$id11.", ".$id12.", ".$id13.", ".$id14.", ".$id15." ) 
AND 
cz1.z9_zutatId IN ( ".$id1.", ".$id2.", ".$id3.", ".$id4.", ".$id5.", ".$id6.", ".$id7.", ".$id8.", ".$id9.", ".$id10.", ".$id11.", ".$id12.", ".$id13.", ".$id14.", ".$id15." )
AND
cz1.z10_zutatId IN ( ".$id1.", ".$id2.", ".$id3.", ".$id4.", ".$id5.", ".$id6.", ".$id7.", ".$id8.", ".$id9.", ".$id10.", ".$id11.", ".$id12.", ".$id13.", ".$id14.", ".$id15." )  
AND 
cz1.z11_zutatId IN ( ".$id1.", ".$id2.", ".$id3.", ".$id4.", ".$id5.", ".$id6.", ".$id7.", ".$id8.", ".$id9.", ".$id10.", ".$id11.", ".$id12.", ".$id13.", ".$id14.", ".$id15." ) 
AND 
cz1.z12_zutatId IN ( ".$id1.", ".$id2.", ".$id3.", ".$id4.", ".$id5.", ".$id6.", ".$id7.", ".$id8.", ".$id9.", ".$id10.", ".$id11.", ".$id12.", ".$id13.", ".$id14.", ".$id15." )
AND
cz1.z13_zutatId IN ( ".$id1.", ".$id2.", ".$id3.", ".$id4.", ".$id5.", ".$id6.", ".$id7.", ".$id8.", ".$id9.", ".$id10.", ".$id11.", ".$id12.", ".$id13.", ".$id14.", ".$id15." )  
AND 
cz1.z14_zutatId IN ( ".$id1.", ".$id2.", ".$id3.", ".$id4.", ".$id5.", ".$id6.", ".$id7.", ".$id8.", ".$id9.", ".$id10.", ".$id11.", ".$id12.", ".$id13.", ".$id14.", ".$id15." ) 
AND 
cz1.z15_zutatId IN ( ".$id1.", ".$id2.", ".$id3.", ".$id4.", ".$id5.", ".$id6.", ".$id7.", ".$id8.", ".$id9.", ".$id10.", ".$id11.", ".$id12.", ".$id13.", ".$id14.", ".$id15." )
)");



$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 "<h2>Cocktail:</h2>";
        echo "<ul>";
    }
    echo "<li>".$row['cName']."</li>";
}
?>

problem ist bei dem ich kann jetzt höchsten 15 Zutaten hinzufügen sonst hab ich ja ein problem und es haut nicht mehr in also der user darf höchsten 15 zutaten besitzen der rest bleibt ja dann unberücksichtigt bzw ergibt einen fehler oder ich muss das script erweitern
währe echt cool wenn mir nochmal jemand helfen könnte da ich eben mysql nicht wirklich kappiere
 
Mir scheint, Du hast das Konzept aus dem anderen Thread nicht verstanden?

Es wird pro Verknüpfung "Cocktail enthält Zutat" eine Zeile in die Verknüpfungstabelle geschrieben. Daher benötigt diese Tabelle auch nur eine Spalte mit ZutatID.
Für jede weitere Zutat in einem Cocktail wird also eine weitere Zeile hinzugefügt und nicht eine zusätzliche Spalte mit noch einer ZutatID.

Mit dem Modell lassen sich dann Cocktails mit beliebig vielen Zutaten abbilden (0 Zutaten bis beliebig viele Zutaten) ohne irgendwo auf eine (nicht vorhandene) Zutat mit der ID 0 zu verweisen oder irgendwas mit Komma zu trennen.

Um abzubilden, welche Zutaten ein User hat, erstellst du noch so eine Verknüpfungstabelle, nur halt nicht mit einer CocktailID, sondern mit einer UserID.

Habe ich eigentlich schon auf die Normalisierung verwiesen?
In einem anderen Post habe ich auch eine Menge Links gesammelt, die vom Umgang mit normalisierten Tabellen erzählen.

Gruß hpvw
 
hä also irgendwie kappier ich das nicht ganz

also reicht mir eigentlich vollkommen das?

PHP:
SELECT
cocktail_id AS cID,
cocktail_name AS cName
FROM cocktail_mehr
LEFT JOIN cocktailzutaten_mehr AS cz1
 ON (cz1.cocktailId=cocktail_mehr.cocktail_id)
WHERE (
cz1.z1_zutatId IN 
    (1,2)
 AND
 cz1.z2_zutatId IN 
    (1,2))

aber wo erweitere ich jetzt wenn ich mehrere Zutaten habe?

die 2te tabelle würde dann so aussehn?

PHP:
SELECT user_id AS uID, user_name AS uName
FROM user_mehr
LEFT  JOIN cocktailZutaten_mehr AS cz1 ON ( cz1.cocktailId = user_mehr.user_id ) 
WHERE ( cz1.z1_zutatId
IN ( 1, 2  )  AND cz1.z2_zutatId
IN ( 1, 2  )  );

aber jetzt muss ich ja die 2 noch vernküpfen oder?

Also es tut mir echt leider wenn ich mich so blöd anstelle aber ich komm da einfach nicht mit
 
also ich glaub jetzt hab ich es gecheckt ich lass einfach die ganzen $id´s weg und übergib aus meinem formular alle zutatenid´s mit einem string herüber und also das die alle mit einem , da stehen und dann tu ich das in allen 15 zutat einfügen oder wie?
 
Zurück