ich hätte da noch eine kleine Rückfrage nochmal zu meinen letzten Thema
hier:
Verständnisfrage: PHP-FAQ: 11.10. Wie kann man Checkboxen verarbeiten? in
Verbindung mit MySQL
Datum:
Samstag, 27. August 2005 13:51:26
Gruppen:
de.comp.lang.php.datenbanken
Bleiben wir einfach mal beim bisherigen Pizza-Beispiel ...
Mir wurde ja empfohlen mein DB-Design zu überarbeiten.
In der Form von:
Wobei das mit dem FOREIGN KEY wollte nicht klappen, kam zu Fehlermeldung -
kann jetzt aber nicht mehr sagen wie die hieà ... - hab den Teil
weggelassen und mal ein wenig über google geforscht ...
.... im Grund entspricht das ja in etwa diesem Beispiel da wenn ich mich
nicht irre: http://www.heddesheimer.de/coaching/warengruppen.html
Nur halt die Felder heiÃen anders und so ...
Meine MySQL DB hat auch TYPE=MyISAM Tabellen, vielleicht klappte deshalb
dieses FOREIGN KEY nicht - aber es geht ja anscheinend wenn ich nach dem
obrigen Beispiel da gehe mit den Warengruppen da auch ohne!?
Aber nochmal zurück zum Checkbox-Formular. Könnte ich das in dieser Form da
so machen?:
Das Formular so:
Salami
Pilze
Sardellen
dann bräuchte wohl meine Tabele Zutaten folgende Felder:
IDZutat, zutat1, zutat2, zutat3
und zum Eintragen müste das dann doch so irgendwie laufen oder?:
Und wenn nicht alle Zutaten aktiviert wurden, dann ist hinterher ein Feld
leer oder? Geht natürlich nur wenns bei 3 Zutaten bliebe - soweit habe ich
das schon verstanden.
Oder seh ich da nun etwas falsch? Oder macht man soetwas ganz anders?
Oder soll ich bei den Checkboxen da jeweils andere "namen" vergeben?
Besten Dank vorab.
Viele GrüÃe
Sascha
Re: Nochmal Checkboxen-Formular & MySQL
am 03.09.2005 20:56:53 von Stefan Rybacki
Sascha Blum wrote:
> Hallo Leute,
>
> ich hätte da noch eine kleine Rückfrage nochmal zu meinen letzten Thema
> hier:
>
> Verständnisfrage: PHP-FAQ: 11.10. Wie kann man Checkboxen verarbeiten? in
> Verbindung mit MySQL
> Datum:
> Samstag, 27. August 2005 13:51:26
> Gruppen:
> de.comp.lang.php.datenbanken
>
Nicht gelesen.
>
> Bleiben wir einfach mal beim bisherigen Pizza-Beispiel ...
>
> Mir wurde ja empfohlen mein DB-Design zu überarbeiten.
> In der Form von:
>
>
>
> CREATE TABLE Zutaten (
> IDZutat...,
> Bezeichnung...
> );
>
> CREATE TABLE Pizzen (
> IDPizza...,
> BestelltAm...
> ...
> );
>
> CREATE TABLE PizzaHatZutaten (
> IDPizza...,
> IDZutat...,
>
> FOREIGN KEY IDPizza REFERENCES Pizzen (IDPizza),
> FOREIGN KEY IDZutat REFERENCES Zutaten (IDZutat)
> );
>
Design sieht in Ordnung aus.
>...
> Das Formular so:
>
> Salami
> Pilze
> Sardellen
>
Lieber:
Salami
Pilze
Sardellen
> dann bräuchte wohl meine Tabele Zutaten folgende Felder:
>
> IDZutat, zutat1, zutat2, zutat3
nein.
>
> und zum Eintragen müste das dann doch so irgendwie laufen oder?:
>
>
> $DatabasePointer=mysql_connect("mein_host", "user", "pw");
> mysql_select_db("meine_db", $DatabasePointer);
>
> //hier müste man wohl erstmal Variablen tauschen?
>
> $zutat1=$_REQUEST['zutat[0]'];
> $zutat2=$_REQUEST['zutat[1]'];
> $zutat3=$_REQUEST['zutat[2]'];
>
> $SQL = "INSERT INTO zutaten (idpizza, zutat1, zutat2, zutat3) VALUES ('',
> $zutat1, $zutat2, $zutat3);
> mysql_query($SQL, $DatabasePointer);
>
(Offensichtlich muÃt du vorher noch ne Pizza anlegen, damit du ein ID der Pizza hast)
> Und wenn nicht alle Zutaten aktiviert wurden, dann ist hinterher ein Feld
> leer oder? Geht natürlich nur wenns bei 3 Zutaten bliebe - soweit habe ich
> das schon verstanden.
Offensichtlich hast du das Design noch nicht ganz verstanden.
Zutaten enthält alle möglichen Zutaten
Pizzen enthält alle Pizzen
PizzaHatZutaten enthält für jede Pizza in Pizzen 0 oder mehr Zutaten
>
> Oder seh ich da nun etwas falsch? Oder macht man soetwas ganz anders?
> Oder soll ich bei den Checkboxen da jeweils andere "namen" vergeben?
Nein willst du nicht.
>
> Besten Dank vorab.
>
> Viele GrüÃe
Bis denn dann
Stefan
>
> Sascha
Re: Nochmal Checkboxen-Formular & MySQL
am 05.09.2005 13:09:19 von Sascha Blum
Hallo,
Stefan Rybacki wrote:
>> Das Formular so:
>>
>> Salami
>> Pilze
>> Sardellen
>>
>
> Lieber:
> Salami
> Pilze
>
> Sardellen
ok dann verwende ich da nun die id's ...
>> $DatabasePointer=mysql_connect("mein_host", "user", "pw");
>> mysql_select_db("meine_db", $DatabasePointer);
>>
>> //hier müste man wohl erstmal Variablen tauschen?
>>
>> $zutat1=$_REQUEST['zutat[0]'];
>> $zutat2=$_REQUEST['zutat[1]'];
>> $zutat3=$_REQUEST['zutat[2]'];
>>
>> $SQL = "INSERT INTO zutaten (idpizza, zutat1, zutat2, zutat3) VALUES ('',
>> $zutat1, $zutat2, $zutat3);
>> mysql_query($SQL, $DatabasePointer);
>>
>
> Nein.
>
> 1. du fügst hier nur in PizzaHatZutaten ein
>
> INSERT INTO PizzaHatZutaten (idpizza, idzutat) VALUES (idpizza, zutat1),
> (idpizza,zutat2), (idpizza, zutat3)
>
> (Offensichtlich muÃt du vorher noch ne Pizza anlegen, damit du ein ID der
> Pizza hast)
OK hieÃe dann vor dem INSERT INTO PizzaHatZutaten ... - Pizza anlegen:
INSERT INTO Pizza ...
danach müste ich ja dann um mit INSERT INTO PizzaHatZutaten fortzufahren
erstmal die id herausfinden wo die Pizza da gerade beim INSERT erhalten hat
oder seh ich das falsch?
richtig oder hab ich da nun was falsch gemacht bei meiner Vorgehensweise?
>> Und wenn nicht alle Zutaten aktiviert wurden, dann ist hinterher ein Feld
>> leer oder? Geht natürlich nur wenns bei 3 Zutaten bliebe - soweit habe
>> ich das schon verstanden.
>
> Offensichtlich hast du das Design noch nicht ganz verstanden.
>
> Zutaten enthält alle möglichen Zutaten
> Pizzen enthält alle Pizzen
>
> PizzaHatZutaten enthält für jede Pizza in Pizzen 0 oder mehr Zutaten
nun habe ich aber langsam aber sicher das Design verstanden ... - stand da
wohl ein wenig auf der Leitung! Sorry das es solange gebraucht hat! :-)
Tausendfachen Dank an alle die mir bisher geholfen haben und es mir versucht
haben zu erklären bzw. es mir erklärten. Hat mir sehr weitergeholfen.
Viele GrüÃe
Sascha
Re: Nochmal Checkboxen-Formular & MySQL
am 05.09.2005 14:52:13 von Stefan Rybacki
Sascha Blum wrote:
> Hallo,
>
> Stefan Rybacki wrote:
>
>
>
>>>Das Formular so:
>>>
>>> Salami
>>> Pilze
>>> Sardellen
>>>
>>Lieber:
>> Salami
>> Pilze
>>
>> Sardellen
>
>
> ok dann verwende ich da nun die id's ...
>
>
>
>
>>>$DatabasePointer=mysql_connect("mein_host", "user", "pw");
>>>mysql_select_db("meine_db", $DatabasePointer);
>>>
>>>//hier müste man wohl erstmal Variablen tauschen?
>>>
>>>$zutat1=$_REQUEST['zutat[0]'];
>>>$zutat2=$_REQUEST['zutat[1]'];
>>>$zutat3=$_REQUEST['zutat[2]'];
>>>
>>>$SQL = "INSERT INTO zutaten (idpizza, zutat1, zutat2, zutat3) VALUES ('',
>>>$zutat1, $zutat2, $zutat3);
>>>mysql_query($SQL, $DatabasePointer);
>>>
>>
>>Nein.
>>
>>1. du fügst hier nur in PizzaHatZutaten ein
>>
>>INSERT INTO PizzaHatZutaten (idpizza, idzutat) VALUES (idpizza, zutat1),
>>(idpizza,zutat2), (idpizza, zutat3)
>>
>>(Offensichtlich muÃt du vorher noch ne Pizza anlegen, damit du ein ID der
>>Pizza hast)
>
>
> OK hieÃe dann vor dem INSERT INTO PizzaHatZutaten ... - Pizza anlegen:
>
> INSERT INTO Pizza ...
Genau
>
> danach müste ich ja dann um mit INSERT INTO PizzaHatZutaten fortzufahren
> erstmal die id herausfinden wo die Pizza da gerade beim INSERT erhalten hat
> oder seh ich das falsch?
>
> Wie mache ich das am sinnvollsten? So etwa:
>
> $last_id = mysql_insert_id();
>
Jup, denk dran die ID in Pizza auf AUTO_INCREMENT zu haben.
> oder gäbe es dafür was anderes bzw. besseres?
>
> HieÃe dann letztendlich in meinem Script:
>
> INSERT INTO Pizza ...
>
> $idpizza = mysql_insert_id();
>
jup mit idpizza=$idpizza usw. in der VALUES Klausel
> richtig oder hab ich da nun was falsch gemacht bei meiner Vorgehensweise?
>
Sieht gut aus.
>
>
>>>Und wenn nicht alle Zutaten aktiviert wurden, dann ist hinterher ein Feld
>>>leer oder? Geht natürlich nur wenns bei 3 Zutaten bliebe - soweit habe
>>>ich das schon verstanden.
>>
>>Offensichtlich hast du das Design noch nicht ganz verstanden.
>>
>>Zutaten enthält alle möglichen Zutaten
>>Pizzen enthält alle Pizzen
>>
>>PizzaHatZutaten enthält für jede Pizza in Pizzen 0 oder mehr Zutaten
>
>
>
> nun habe ich aber langsam aber sicher das Design verstanden ... - stand da
> wohl ein wenig auf der Leitung! Sorry das es solange gebraucht hat! :-)
>
Besser spät als nie. ;)
> Tausendfachen Dank an alle die mir bisher geholfen haben und es mir versucht
> haben zu erklären bzw. es mir erklärten. Hat mir sehr weitergeholfen.
>
Bis denn dann
Stefan
> Viele GrüÃe
>
> Sascha
>
>
Re: Nochmal Checkboxen-Formular & MySQL
am 05.09.2005 15:10:05 von Sascha Blum
Hallo,
Stefan Rybacki wrote:
[...]
>> OK hieÃe dann vor dem INSERT INTO PizzaHatZutaten ... - Pizza anlegen:
>>
>> INSERT INTO Pizza ...
>
> Genau
>
>>
>> danach müste ich ja dann um mit INSERT INTO PizzaHatZutaten fortzufahren
>> erstmal die id herausfinden wo die Pizza da gerade beim INSERT erhalten
>> hat oder seh ich das falsch?
>>
>> Wie mache ich das am sinnvollsten? So etwa:
>>
>> $last_id = mysql_insert_id();
>>
>
> Jup, denk dran die ID in Pizza auf AUTO_INCREMENT zu haben.
>
>> oder gäbe es dafür was anderes bzw. besseres?
>>
>> HieÃe dann letztendlich in meinem Script:
>>
>> INSERT INTO Pizza ...
>>
>> $idpizza = mysql_insert_id();
>>
>
> jup
>
>>
>> INSERT INTO PizzaHatZutaten (idpizza, idzutat) VALUES (idpizza, zutat1),
>> (idpizza,zutat2), (idpizza, zutat3)
>>
>
> jup mit idpizza=$idpizza usw. in der VALUES Klausel
wenn ich
$idpizza = mysql_insert_id();
vor dem INSERT INTO PizzaHatZutaten da definiere sozusagen, dann könnte
nachfolgendes dann so aussehen oder?:
Und eines würde mich auch noch interessieren das hinter dem VALUES da. Also
wenn nur 1 Wert in der Checkbox aktiviert würde, dann wird beim Insert nur
($idpizza, zutat1) dann vom Script verwendet und nur 1 Datensatz wird
eingetragen oder würden dann noch 2 leere Datensätze eingetragen?
Viele GrüÃe
Sascha
Re: Nochmal Checkboxen-Formular & MySQL
am 05.09.2005 15:41:35 von Stefan Rybacki
Sascha Blum wrote:
> Hallo,
> ...
>
> wenn ich
>
> $idpizza = mysql_insert_id();
>
> vor dem INSERT INTO PizzaHatZutaten da definiere sozusagen, dann könnte
> nachfolgendes dann so aussehen oder?:
>
> INSERT INTO PizzaHatZutaten ($idpizza, idzutat) VALUES ($idpizza, zutat1),
> ($idpizza,zutat2), ($idpizza, zutat3)
>
> Und eines würde mich auch noch interessieren das hinter dem VALUES da. Also
> wenn nur 1 Wert in der Checkbox aktiviert würde, dann wird beim Insert nur
> ($idpizza, zutat1) dann vom Script verwendet und nur 1 Datensatz wird
> eingetragen oder würden dann noch 2 leere Datensätze eingetragen?
leere Einträge bzw. du bekommst Fehlermeldungen
dann mach lieber ne Schleife
....
$idpizza=mysql_insert_id();
foreach ($_REQUEST['zutat'] as $zutat) {
$sql="INSERT DELAYED INTO PizzaHatZutaten (idpizza, idzutat) VALUES ($idpizza,$zutat)";
//sende query hier
...
}
Bis denn dann
Stefan
>
> Viele GrüÃe
>
> Sascha
>
>
>
Re: Nochmal Checkboxen-Formular & MySQL
am 06.09.2005 11:17:42 von Sascha Blum
Hallo,
Stefan Rybacki wrote:
>> Und eines würde mich auch noch interessieren das hinter dem VALUES da.
>> Also wenn nur 1 Wert in der Checkbox aktiviert würde, dann wird beim
>> Insert nur ($idpizza, zutat1) dann vom Script verwendet und nur 1
>> Datensatz wird eingetragen oder würden dann noch 2 leere Datensätze
>> eingetragen?
>
> leere Einträge bzw. du bekommst Fehlermeldungen
>
> dann mach lieber ne Schleife
>
>
> ...
> $idpizza=mysql_insert_id();
>
> foreach ($_REQUEST['zutat'] as $zutat) {
> $sql="INSERT DELAYED INTO PizzaHatZutaten (idpizza, idzutat) VALUES
> ($idpizza,$zutat)";
>
> //sende query hier
> ...
> }
irgendwas habe ich wohl bei meinem Script falsch gemacht ... :-(
Der erste Teil funktioniert, aber der zweite mit den Zutaten nicht.
Bekomme folgende Fehlermeldung:
Warning: Invalid argument supplied for foreach()
in /home/sascha/public_html/projekte/eintrag-einfuegen.php on line 18
Mein Script was die DB-Ãbertragung da angeht sieht derzeit so aus:
foreach ($_REQUEST['artikel_id'] as $artikel_id) {
$sql="INSERT DELAYED INTO pizzahatzutat (artikel_id, zutat_id)
VALUES ($artikel_id, $zutat_id)";
mysql_query($sql, $DatabasePointer);
}
also wie gesagt das mit der Pizza-Tabelle klappt noch wunderbar und die
Daten werden auch da reingeschrieben, aber mit der anderen Tabelle klappt
es nicht. Was habe ich denn da falsch gemacht?
Besten Dank vorab.
Viele GrüÃe
Sascha
Re: Nochmal Checkboxen-Formular & MySQL
am 06.09.2005 12:09:45 von Stefan Rybacki
Sascha Blum wrote:
>...
>
> irgendwas habe ich wohl bei meinem Script falsch gemacht ... :-(
>
> Der erste Teil funktioniert, aber der zweite mit den Zutaten nicht.
>
> Bekomme folgende Fehlermeldung:
>
> Warning: Invalid argument supplied for foreach()
> in /home/sascha/public_html/projekte/eintrag-einfuegen.php on line 18
>
Lies die Fehlermeldung genau. Die hat nichts mit der Datenbank zu tun. Vielleicht hast du
meinen Code einfach so übernommen?
$_REQUEST['artikel_id'] scheint bei dir kein Array zu sein.
Prüfe dies vorher (siehe unten). Was sagt dir print_r($_REQUEST['artikel_id'])?
Hoffe deine Checkboxen haben als Namen artikel_id[].
>
> Mein Script was die DB-Ãbertragung da angeht sieht derzeit so aus:
>
>
> $DatabasePointer=mysql_connect("mein_host", "user", "db");
> mysql_select_db("sascha", $DatabasePointer);
>
> $SQL = "INSERT INTO pizza (pizzanr, bezeichnung, rezept) VALUES ('', '"
> $_REQUEST['bezeichnung']."', '".$_REQUEST['rezept']."')";
> mysql_query($SQL, $DatabasePointer);
>
prüfe $_REQUEST['rezept'] usw. vorher bitte auf Korrektheit und escape die Werte auch
gleich noch um z.B. Fehlermeldungen und oder SQL Injection zu vermeiden.
z.B. if (!isset($_REQUEST['rezept']) { print("Kein Rezept");exit();}
für das escapen schau dir mysql_real_escape_string an.
>
>
> $artikel_id=mysql_insert_id();
>
> foreach ($_REQUEST['artikel_id'] as $artikel_id) {
> $sql="INSERT DELAYED INTO pizzahatzutat (artikel_id, zutat_id)
> VALUES ($artikel_id, $zutat_id)";
>
> mysql_query($sql, $DatabasePointer);
>
> }
>
>
> also wie gesagt das mit der Pizza-Tabelle klappt noch wunderbar und die
> Daten werden auch da reingeschrieben, aber mit der anderen Tabelle klappt
> es nicht. Was habe ich denn da falsch gemacht?
siehe oben.
>
> Besten Dank vorab.
>
Bis denn dann
Stefan
> Viele GrüÃe
>
> Sascha
Re: Nochmal Checkboxen-Formular & MySQL
am 06.09.2005 12:39:48 von Sascha Blum
Hallo,
Stefan Rybacki wrote:
> Sascha Blum wrote:
>>...
>>
>> irgendwas habe ich wohl bei meinem Script falsch gemacht ... :-(
>>
>> Der erste Teil funktioniert, aber der zweite mit den Zutaten nicht.
>>
>> Bekomme folgende Fehlermeldung:
>>
>> Warning: Invalid argument supplied for foreach()
>> in /home/sascha/public_html/projekte/eintrag-einfuegen.php on line 18
>>
>
> Lies die Fehlermeldung genau. Die hat nichts mit der Datenbank zu tun.
> Vielleicht hast du meinen Code einfach so übernommen?
>
> $_REQUEST['artikel_id'] scheint bei dir kein Array zu sein.
> Prüfe dies vorher (siehe unten). Was sagt dir
> print_r($_REQUEST['artikel_id'])? Hoffe deine Checkboxen haben als Namen
> artikel_id[].
ahh das war wohl der entscheidende Hinweis ... - da kam vor lauter Variabeln
etwas durcheinander ...
.... nun scheint es zu funktionieren wie gewünscht! Tausendfachen Dank
nochmals ...
Jetzt muss ich nur noch ein Script zum Auslesen basteln ... :-)
Viele GrüÃe
Sascha
Re: Nochmal Checkboxen-Formular & MySQL
am 06.09.2005 15:07:24 von Sascha Blum
Hallo,
ich bin jetzt gerade dabei das Ausgabe-Script zu schreiben ...
.... so habe aber ein kleines Problem. Mache ich ein mysql_query wo ich die
Pizza-Tabelle selcetiere, und diese dann in einer while-Schleife (wie in
diesem Beispiel dort: http://tut.php-q.net/mysql-select-php.html) dann
bekomme ich ordnungsgemäss alle eingetragenen Pizzen ausgegeben - soweit
sogut. Wenn ich ein mysyl_query mache wo ich die 3 besagten Tabellen
verknüfe und das per while ausgebe, bekomme ich alle Zutaten unter einander
ausgegeben - soweit sogut ...
Aber wie stelle ich das an, das das in etwa so ausgegeben wird?:
Pizza1
Rezept
Zutat1
Zutat2
Zutat3 (je nach dem wieviel Zutaten eben in der Tabelle drin sind)
-------------------------------------------------
Pizza2
Rezept
Zutat1
Zutat2
Zutat3 (je nach dem wieviel Zutaten eben in der Tabelle drin sind)
Habe schon wie verrückt herum experimentiert und komme einfach auf keinen
gemeinsamen Nenner. Auch google hab ich schon versucht zu Befragen um an
ein Beispiel dran zu kommen, aber irgendwie finde ich da nicht so das was
ich suche ... - vielleicht hab ich auch die falschen Suchbegriffe verwendet
oder so.
Ich schätze aber mal ich muss irgendwie 2 mysql_querys machen, einmal für
die Pizzen schätze ich mal und eine wo die Zutaten dazu drin aufgelistet
sind. Aber wie kann ich das dann verbinden bzw. gewünschtes Ergebnis da
erzielen?
Habe auch sowas schon versucht, aber das ist wohl etwas falsch ...
Sascha Blum wrote:
> Hallo,
>
> ...
> Ich schätze aber mal ich muss irgendwie 2 mysql_querys machen, einmal für
> die Pizzen schätze ich mal und eine wo die Zutaten dazu drin aufgelistet
> sind. Aber wie kann ich das dann verbinden bzw. gewünschtes Ergebnis da
> erzielen?
Das ist eine Möglichkeit.
Ein andere wäre, deine Anfrage mit verknüpften Tabellen benutzen, nach Pizza sortieren und
dann in der Schleife die Pizza einmal ausgeben und dann das Rezept und dann die Zutaten
solange bis sich die Pizza ändert.
z.B.
$oldpizzaid=-1;
while ($row=mysql_fetch_assoc($ResultPointer)) {
if ($row['pizzaid']!=$oldpizzaid) {
print("\n");
print($row['pizzaname']."\n");
print($row['rezept']."\n");
print("Zutaten:\n");
$oldpizzaid=$row['pizzaid'];
}
//print out ingredients
print($row['zutat']."\n");
}
>
> Habe auch sowas schon versucht, aber das ist wohl etwas falsch ...
>
> while($row = mysql_fetch_assoc($ResultPointer); $row2 =
> mysql_fetch_assoc($ResultPointer2)) {...}
>
> Parse error: parse error, unexpected ';'
Versuche die Fehlermeldungen auch zu verstehen. Wo ist ein ; und warum könnte es dort
falsch sein ;)