Antworten auf deine Fragen:
Neues Thema erstellen

Antworten zum Thema „Dynamische Auswahlliste um neue Einträge ergänzen und diese in DB speichern?“

sphinxxx

Noch nicht viel geschrieben

Hallo und ein schönes Neues Jahr,

bräuchte mal wieder eure Hilfe: Ich bastele für mein Studium an einer kleinen Rezeptdatenbank. Auf einer der Seiten habe ich ein Formular, in das der Benutzer sein Rezept eintragen kann. Dieses kann er über ein Selectfeld einer bereits vorhandenen Kategorie (z.B. Fischgericht, Vorspeise etc.) zuordnen. Ist jedoch keine der Kategorien für das Rezept passend, sollte der User die Möglichkeit haben, eine eigene Kategorie anzugeben, die dann anschließend in der Datenbanktabelle gespeichert wird.

Das heißt, ich benötige eine Auswahlliste, in der der Benutzer entweder eine vorhandene Kategorie auswählen oder aber auch eine neue hinzufügen kann. Fürchte mit html, php und mysql allein komme ich da nicht weiter (und diesbezüglich bin auch auch leider newbie). Wie lässt sich das lösen, über javascript? Falls ja, wie? Finde nichts Passendes im Netz...

Würde mich über Denkanstöße, Erklärungen und mangels Zeit auch sehr über Codeschnipsel freuen.

Danke und Grüße,

Lara
 

Duddle

Posting-Frequenz: 14µHz

AW: Dynamische Auswahlliste um neue Einträge ergänzen und diese in DB speichern?

Da du ein Anfänger bist, solltest du das wohl so einfach wie möglich mit einem extra Feld neben der Kategorie-Liste lösen. Dann prüfst du, ob a) eine vorhandene Kategorie ausgewählt oder b) im Feld etwas eingetragen wurde.
Wenn b), fügst du diese Kategorie hinzu und nutzt sie. Wenn a), nutzt du diese.


Duddle
 

sphinxxx

Noch nicht viel geschrieben

AW: Dynamische Auswahlliste um neue Einträge ergänzen und diese in DB speichern?

Hallo Duddle,

danke dir schon mal für die Antwort. Wollte es mit einer if else-Abfrage realisieren, doch bevor ich überhaupt zu "else" komme, erhalte ich bereits folgende Fehlermeldung:

Fehler beim HinzufÃŒgen des Rezeptes Cannot add or update a child row: a foreign key constraint fails (`Datenbankname/Tabellenname`, CONSTRAINT `Tabellenname_ibfk_1` FOREIGN KEY (`Rezeptkategorie`) REFERENCES `Tabellenname` (`Rezeptkategorie`) ON UPDATE CASCADE)

Vermute mal, dass es daran liegt, dass die Tabellenspalte "Rezeptkategorie" bereits durch das Select-Feld angesprochen wird .. und darunter dann auch noch mal durch das Feld, in das der User die neue Kategorie eintragen soll, sofern die Auswahl nichts Passendes bietet. Bin hier wie verrückt am Probieren, schaffe es aber nicht ohne eure Hilfe ;)

Hier mein bisheriges Script:

PHP:
<?php
 if (isset($_POST['neueKategorie']) && $_POST['neueKategorie'] !='') {
     $rezeptname = $_POST['rezeptname'];
     $zubereitung = $_POST['zubereitung'];
     $kategorie = $_POST['neueKategorie'];
     $sql = "INSERT INTO Datenbank-Tabellenname SET
     Rezeptname='$rezeptname',
     Zubereitung='$zubereitung',
     Rezeptkategorie='$neueKategorie'";
     if(@mysql_query($sql)) {
     echo '<p style="font-size: 14px; padding: 10px; background-color: #324D37; text-align: center; margin-bottom: 35px;">'
      . 'Vielen Dank. Ihr Rezept wurde versendet!' . '<br /><br />' . 'Was m&ouml;chten Sie als n&auml;chstes tun?' . '<br /><br />'
      . '<a href="index.php">Neues Rezept eingeben</a>' . '<br /><br />' . '<a href="../index.html">Zur&uuml;ck zur Startseite</a>' . '</p>';
     } else {
     echo "<p>Fehler beim Hinzufügen des Rezeptes " . mysql_error() . "</p>";
     }
     }
?>

Hier mein Formular:

HTML:
  <form id="rezepteingabe" action="rezepteingabe.php"  method="post" enctype="multipart/form-data">
       <table class="rezepteingabe">
        <tr>
        <td>Kategorie ausw&auml;hlen</td>
        <td><?php
        $result = mysql_query("SELECT * FROM Datenbank-Tabellenname");
        echo '<select name="kategorie" class="kategorie" size="1">';
        while($row = mysql_fetch_array($result)) {
        echo '<option>'.$row["Rezeptkategorie"].'</option>';
        }
        echo '</select>';
        ?></td>
        </tr>
        <tr>
        <td>Rezeptkategorie hinzuf&uuml;gen</td>
        <td><input type="text" name="neueKategorie" size="30" class="titel" /></td>
        </tr>
        etc.
        etc.

Vielleicht wäre der Fehler behoben, wenn man irgendwie erreichen könnte, dass - sobald das input-Feld "neueKategorie" ausgefüllt ist, das Select-Feld "kategorie" bei der Abfrage ignoriert wird? Weiß nur leider nicht, wie ich das erreichen kann...

Viele Grüße,

Lara
 

Duddle

Posting-Frequenz: 14µHz

AW: Dynamische Auswahlliste um neue Einträge ergänzen und diese in DB speichern?

Du solltest die neue Kategorie in die entsprechende Tabelle einfügen, bevor du sie in einem Datensatz einer anderen Tabelle benutzt. Ich bin mir ziemlich sicher, dass das MySQL nicht alleine macht.


Duddle
 

sphinxxx

Noch nicht viel geschrieben

AW: Dynamische Auswahlliste um neue Einträge ergänzen und diese in DB speichern?

Hi Duddle,

die neuen Kategorien sollen der Tabellenspalte hinzugefügt werden, in der schon die vorhandenen Kategorien stehen...so dass die Spalte "Rezeptkategorie" stetig "wachsen" kann.

Wenn also der Benutzer ein neues Rezept online stellen möchte, soll er neben dem Rezeptnamen, der Zubereitung etc. auch eine Kategorie angeben, in der das Rezept erscheinen soll. Hier hat er die Möglichkeit, entweder aus dem select-Feld eine bereits vorhandere Kategorie auszuwählen, oder - falls diese nicht zum Rezept passt - in einem input-Feld eine neue Kategorie einzutragen. Die neue Kategorie - zum Beispiel "Scharfe Speisen" - soll dann in der selben Tabellenspalte gespeichert werden wie die bereits vorhandenen Katgeorien - z.B. "Vorpseisen", "Fleischgerichte", "Nachspeisen" etc.

Ich meine, dass mein Script nicht funktioniert, da beide Felder (select wie input) in die gleiche Tabellenspalte schreiben wollen. Heißt, ich möchte, dass - wenn das Feld "neueKategorie" ausgefüllt ist - die vorhanden Einträge im dynamischen select-Feld komplett ignoriert werden, da hier möglicherweise der Fehler liegen könnte. Oder nicht??

Wäre schön, wenn mein Formular auch mit dem neuen Feld "neueKategorie"-auswählen laufen würde:)

Danke und Grüße,

Lara
 

Duddle

Posting-Frequenz: 14µHz

AW: Dynamische Auswahlliste um neue Einträge ergänzen und diese in DB speichern?

Ja, ich habe dein Problem verstanden und die vermeintliche Lösung präsentiert.

Ich gehe davon aus, dass du eine eigene Tabelle für die Kategorien hast. Falls dem nicht so ist hast du hier bereits unsauber gearbeitet.
Ansonsten musst du, wie ich gesagt hatte, erst die neue Kategorie in der Kategorie-Tabelle eintragen, damit du auf diese dann in der Rezepte-Tabelle verweisen kannst. Das ist ungefähr wie wenn du eine neue Telefonnummer anrufen willst: solange sie nirgendwo registriert / beim Anbieter eingetragen ist, kannst du sie auch nicht nutzen.


Duddle
 

sphinxxx

Noch nicht viel geschrieben

AW: Dynamische Auswahlliste um neue Einträge ergänzen und diese in DB speichern?

Hi,

Ich habe keine eigene Tabelle für die Kategorien. Ich habe eine Tabelle für die Rezepte, deren eine Spalte für die Rezeptkategorien vorgesehen ist. Ich dachte, frau/man könnte mit SQL und php Spalten/Tabelleninhalte dynamisch mit Inhalten füllen???

Wie soll ich eine neue Kategorie in die Tabellenspalte Rezeptkategorie eintragen, wenn ich gar nicht weiß, wie der User seine Kategorie nennen wird??

Sorry, habe ich hier etwas komplett falsch verstanden?

Grüße,

Lara
 

Duddle

Posting-Frequenz: 14µHz

AW: Dynamische Auswahlliste um neue Einträge ergänzen und diese in DB speichern?

Na gut, dann zitiere ich mich mal selbst:
Falls dem nicht so ist hast du hier bereits unsauber gearbeitet.

Nun verstehe ich aber auch nicht, warum du einen Constraint auf der Kategorie hast. Du hast keinen Fremdschlüssel, also brauchst du auch keinen Constraint. Kannst du mir die Logik dahinter erklären? Vielleicht habe ich nur gerade einen Hänger.

Die Lösung zu deinem Problem ist also, wenn ich es richtig sehe, den Constraint zu entfernen.

Im Moment bin ich aber noch sehr stutzig, ob wir nicht aneinander vorbei reden, denn irgendwie musst du ja die vorhandenen Kategorien eingefügt haben und das hätte mit dem derzeitigen Design auch nicht funktionieren sollen.


Duddle
 

sphinxxx

Noch nicht viel geschrieben

AW: Dynamische Auswahlliste um neue Einträge ergänzen und diese in DB speichern?

Hi Duddle,

das Einfügen klappt problemlos und fehlerfrei mit folgendem Script:

PHP:
 <?php
 if (isset($_POST['kategorie'])) {
     $rezeptname = $_POST['rezeptname'];
     $zubereitung = $_POST['zubereitung'];
     $kategorie = $_POST['kategorie'];
     $sql = "INSERT INTO Datenbank-Tabellenname SET
     Rezeptname='$rezeptname',
     Zubereitung='$zubereitung',
     Rezeptkategorie='$kategorie'";
     if(@mysql_query($sql)) {
     echo '<p style="font-size: 14px; padding: 10px; background-color: #324D37; text-align: center; margin-bottom: 35px;">'
      . 'Vielen Dank. Ihr Rezept wurde versendet!' . '<br /><br />' . 'Was m&ouml;chten Sie als n&auml;chstes tun?' . '<br /><br />'
      . '<a href="index.php">Neues Rezept eingeben</a>' . '<br /><br />' . '<a href="../index.html">Zur&uuml;ck zur Startseite</a>' . '</p>';
     } else {
     echo "<p>Fehler beim Hinzufügen des Rezeptes " . mysql_error() . "</p>";
     }
     }
?>
Der Fehler kommt erst, wenn ich versuche das <input>-Feld (name="neueKategorie", siehe weiter oben) zu integrieren. Vermute Folgendes: Im Select-Feld mit den bereits bestehenden Kategorien ist zwar kein Eintrag mit selected=selected vorausgewählt, jedoch wird offenbar versucht, die zuoberst stehende und im Formular sichtbare Kategorie (Desserts) ebenso in die Datenbank zu speichern wie den Eintrag aus dem input-Feld "neueKategorie". Deshalb müsste im Script ein Befehl stehen, der etwa Folgendes beinhaltet: Wenn das Feld "neueKategorie" nicht leer ist, ignoriere die Einträge in der Auswahlliste komplett und schreibe nur die neue Kategorie in die Tabellenspalte "Rezeptkategorie". Aber wie geht das? Meine if else-Abfrage scheitert ja schon, bevor ich überhaupt zu "else" komme (siehe weiter oben)????????

please help,

Lara
 

Duddle

Posting-Frequenz: 14µHz

AW: Dynamische Auswahlliste um neue Einträge ergänzen und diese in DB speichern?

Entweder übersehe ich etwas, oder du hast irgendwas vergessen zu erwähnen. Wenn das INSERT mit $kategorie funktioniert muss es auch mit $neueKategorie funktionieren. Punkt.

Da sich die beiden gezeigten Programmabschnitte nur geringfügig unterscheiden, sollte folgendes zum Ziel führen:

PHP:
<?php
 if (isset($_POST['kategorie'])) {
  // formular wurde abgeschickt
     $rezeptname = $_POST['rezeptname'];
     $zubereitung = $_POST['zubereitung'];
     $kategorie = $_POST['kategorie'];
  
  if (isset($_POST['neueKategorie']) && $_POST['neueKategorie'] !='') {
   //neue kategorie wurde eingetragen, also nicht die ausgewählte nutzen  
   $kategorie = $_POST['neueKategorie'];
  }
     $sql = "INSERT INTO Datenbank-Tabellenname SET
     Rezeptname='$rezeptname',
     Zubereitung='$zubereitung',
     Rezeptkategorie='$kategorie'";
     if(@mysql_query($sql)) {
     echo '<p style="font-size: 14px; padding: 10px; background-color: #324D37; text-align: center; margin-bottom: 35px;">'
      . 'Vielen Dank. Ihr Rezept wurde versendet!' . '<br /><br />' . 'Was m&ouml;chten Sie als n&auml;chstes tun?' . '<br /><br />'
      . '<a href="index.php">Neues Rezept eingeben</a>' . '<br /><br />' . '<a href="http://www.psd-tutorials.de/forum/index.html">Zur&uuml;ck zur Startseite</a>' . '</p>';
     } else {
     echo "<p>Fehler beim Hinzufügen des Rezeptes " . mysql_error() . "</p>";
     }
     }
?>


Duddle
 

sphinxxx

Noch nicht viel geschrieben

AW: Dynamische Auswahlliste um neue Einträge ergänzen und diese in DB speichern?

Hallo Duddle,

thanx, aber es klappt leider nicht. Glaube, ich weiß aber nun warum nicht. Aus der Fehlermeldung geht hervor, dass es offensichtlich einen Konflikt mit der Tabellenspalte "Rezeptkategorie" gibt, die in der Datenbank leider 2 x vorhanden ist, einmal in Tabelle1 und einmal in Tabelle 2 (siehe Fehlermeldung Tabellenname1 und Tabellenname2). Leider kann ich die Datenbank meines Profs nicht ändern. Gibt es eine Möglichkeit, das Problem innerhalb der Abfrage zu lösen?


Fehler beim HinzufÃŒgen des Rezeptes Cannot add or update a child row: a foreign key constraint fails (`Datenbankname/Tabellenname1`, CONSTRAIN4T `Tabellenname1_ibfk_1` FOREIGN KEY (`Rezeptkategorie`) REFERENCES `Tabellenname2` (`Rezeptkategorie`) ON UPDATE CASCADE)

Das Merkwürdige ist nur, solange ich nichts in das Feld "neueKategorie" eintrage und im Script nur das select-Feld "kategorie" und nicht "neueKategorie" auftaucht, werden die Rezepte samt ausgewählter Kategorie problemlos in der Datenbank gespeichert.


Könntest du noch mal helfen? Das wäre prima!


Viele Grüße,


Lara
 

Duddle

Posting-Frequenz: 14µHz

AW: Dynamische Auswahlliste um neue Einträge ergänzen und diese in DB speichern?

!!!

Okay, jetzt bin ich zu 99,99996% sicher, dass es eine zusätzliche Tabelle für die Rezeptkategorien gibt. Ansonsten würde es keinen Constraint geben. Ansonsten würde es keine zweite Tabelle mit gleichem Spaltennamen geben. Ansonsten wäre es ein schlechtes Design (und das schließe ich beim Prof. aus). Ansonsten würde das alles problemlos funktionieren.

Bitte schau dir exakt an, wie deine Datenbank aufgebaut ist, bevor du daran rumwerkeln willst. Es ist sehr schwierig, auf falschen Fakten etwas aufzubauen (oder gar als Aussenstehender beim Debuggen zu helfen).

Da du mit sehr hoher Wahrscheinlichkeit diese extra Tabelle finden wirst, kannst du mit bereits genannter Lösung (erst die Kategorie eintragen, dann den dazugehörigen Datensatz) vorankommen.


Duddle
 

sphinxxx

Noch nicht viel geschrieben

AW: Dynamische Auswahlliste um neue Einträge ergänzen und diese in DB speichern?

Hi Duddle,

mein Prof hat in einem anderen Zuammenhang schon mal eingeräumt, dass sie Datenbank nicht optimal aufgebaut sei. Habe ihm jetzt gemailt und Hilfe bei der Lösung des Problems erbeten, da ich nicht so genau weiß, was du meinst mit "Kategorie und Datensatz eintragen". Denn eigentlich kann ich doch gar nicht wissen, was der User für eine neue Kategorie eingibt - wie soll ich die dann vorab in die zweite Tabelle mit dem Primärschlüssel eintragen. Die Tabelle habe ich in der Datenbank gefunden, und nu?

Bin am Verzweifeln :mad:

Grüße,

Lara
 

Duddle

Posting-Frequenz: 14µHz

AW: Dynamische Auswahlliste um neue Einträge ergänzen und diese in DB speichern?

Du weisst schon, dass du mehr als einen Befehl an die Datenbank schicken kannst, nicht wahr? Pseudo-Code:
1. falls $neueKategorie gesetzt, füge $neueKategorie in Kategorie-Tabelle ein und setze $kategorie = $neueKategorie
2. füge Rezept mit $kategorie in Rezepte-Tabelle ein

Ansonsten kann ich persönlich dir nicht weiterhelfen. Du gibst keinerlei oder inkorrekte Informationen über deine Architektur, also muss ich Annahmen treffen, ergo kann das Problem nicht weiter eingegrenzt werden.


Duddle
 

Zampano_

Nicht mehr ganz neu hier

AW: Dynamische Auswahlliste um neue Einträge ergänzen und diese in DB speichern?

Ihr habt da 100%ig eine Tabelle für die Kategorien. Ansonsten würde an der Stelle an der du die Select-Box füllst ja für JEDES REZEPT eine Kategorie angezeigt werden. D.h. wenn du 100 Rezepte in deiner DB hättest, würden nach dem Code unten auch 100 Kategorien angezeigt werden.
PHP:
$result = mysql_query("SELECT * FROM Datenbank-Tabellenname");
echo '<select name="kategorie" class="kategorie" size="1">';         
while($row = mysql_fetch_array($result)) 
{        
 echo '<option>'.$row["Rezeptkategorie"].'</option>';         
}        
 echo '</select>';
Ausserdem geb ich Duddel recht. Die Fehlermeldung lässt auf eine weitere Tabelle schliessen zu der ein Constraint aufgebaut ist. Ich kann mir aber nicht vorstellen das MySQL Constraints zulässt, die auf eine nicht Vorhandene Tabelle zeigen. (Spatestens beim füllen der Tabelle müsste es Probleme geben)

Spaltennamen darf man übrigens so oft vergeben wie man will, solange es nicht in der gleichen Tabelle ist.
 
Zuletzt bearbeitet:

sphinxxx

Noch nicht viel geschrieben

AW: Dynamische Auswahlliste um neue Einträge ergänzen und diese in DB speichern?

Euch allen erst mal Dank.

Habe es jetzt hinbekommen. Die neue Kategorie wird eingetragen, nachdem ich das Script so abgeändert habe, dass diese erst in die Tabelle geschrieben wird, in der sich auch der Primärschlüssel für die Spalte "Rezeptkategorie" befindet, also in der Tabelle Rezepte.


Das Script sieht jetzt so aus:


PHP:
<?php
if (isset($_POST['neueKategorie']) && $_POST['neueKategorie'] != "") {
$neueKategorie = $_POST['neueKategorie'];
$sql = "INSERT INTO Tabelle Rezeptkategorien SET
Rezeptkategorie='$neueKategorie'";
if(@mysql_query($sql)) {
$rezeptname = $_POST['rezeptname'];
$zubereitung = $_POST['zubereitung'];
$sql = "INSERT INTO Tabelle Rezepte SET
Rezeptname='$rezeptname',
Zubereitung='$zubereitung',
Rezeptkategorie='$neueKategorie'";
}
if(@mysql_query($sql)) {
echo etc....
} else {
echo "<p>Fehler beim Hinzufügen des Rezeptes " . mysql_error() . "</p>";
}
etc...
?>


Das gleiche Problem mit o.g. Fehlermeldung CONSTRAINTS und Foreign Key habe ich nun auch, wenn ich das Formular für die Rezepteingabe um ein neues Feld "neueZutat" ergänze und mein Script nach obigem Schema entsprechend erweitere. Grund ist, dass sich in der Tabelle Rezeptzutaten eine Spalte "ID" befindet, die es ebenso in der Tabelle "Rezepte" gibt (hier befindet sich auch der Primärschlüssel für die ID). Nur kann ich die Zutaten nicht erst in die Tabelle Rezepte eintragen, da sich hier wiederum keine Spalte für die Zutaten befindet.


Also was tun? Meine Idee wäre, die ID für das in der neuen Kategorie erstellte Rezept aus der Tabelle Rezepte irgendwie in die Tabelle Rezeptzutaten einzufügen, so dass dieser dann die neue Zutat zugewiesen werden kann. Wäre der Weg richtig? Falls ja, wie ließe sich das zu realisieren?


Hier noch mal der Aufbau der Tabellen:


Rezepte: ID mit Primärschlüssel | Rezeptkategroie | Zubereitung etc.


Rezeptzutaten: ID | Name der Zutat | etc.


Wie bekomme ich den Eintrag aus dem Feld "neueZutat" also in die Tabelle Rezeptzutaten?


Vielleicht, Duddle, könntest du noch mal helfen?


Danke und Grüße,


Lara
 

Duddle

Posting-Frequenz: 14µHz

AW: Dynamische Auswahlliste um neue Einträge ergänzen und diese in DB speichern?

Nur kann ich die Zutaten nicht erst in die Tabelle Rezepte eintragen, da sich hier wiederum keine Spalte für die Zutaten befindet.

Genau, das wäre ja auch unsinnig. Da jedes Rezept viele Zutaten hat und jede Zutat vielen Rezepten zugeordnet werden kann, ist das eine n:m-Beziehung. Diese wird - in der Regel - durch eine Zwischentabelle aufgelöst. Diese sagt dann in deinem Beispiel in einem Datensatz, ob eine Zutat einem bestimmten Rezept zugeordnet ist (und wahrscheinlich noch die Menge).

Eine neue Zutat selbst trägst du ganz simpel in die Rezeptzutaten-Tabelle ein. Die Zuweisung erfolgt dann über die genannte Zwischentabelle, die es in deinem System sicher auch gibt (obwohl du sie nicht erwähnst).

Da du scheinbar die Konzepte hinter Tabellen/Relationen und Fremdschlüsseln nicht komplett verstehst, empfehle ich dir in Zukunft bei der Beschreibung vorhandener Tabellenstrukturen weniger eigenständig zu kürzen. Aus deinen Erläuterungen geht z.B. nicht deutlich hervor, wie die Datenbank nun eigentlich aufgebaut ist, wie welche Relationen aufgelöst wurden usw.


Duddle
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
175.189
Beiträge
2.582.075
Mitglieder
67.258
Neuestes Mitglied
cue98
Oben