Multiauswahlwerte von Dropdown in Datenbank speichern

  • Hallo zusammen, ich bin "leider" ein Totalanfänger und spring dann immer mit 2 Füßen rein und will zuviel auf einmal. Das mal vorne weg.


    Gegooglelt habe ich auch schon. Entweder habe ich die falschen Begriffe benutzt und oder ich schnall es einfach nicht.



    Ich habe folgendes Problem bei dem ich eure Hilfe gerne in Anspruch nehmen würde.


    Ich habe ein Multiselectfeld mit Bootstrap erstellt.


    Ich habe auch hinbekommen das ich Daten für die Auswahl aus meiner DB abrufen kann, diese angezeigt werden und auch zur Auswahl stehen. :thumbup:



    Es sollen also mehrere "Produkte" ausgewählt werden können und in eine Datenbank übertragen werden.



    Auswahl: Apfel, Birne abschicken.


    In der DB sollen die dann im Feld sagen wir -Items- angezeigt werden als: Apfel, Birne.


    So. Nun möchte ich wieder die Eierlegendewollmilchsau und nicht mit

    <option value="Apfel">Apfel</option> arbeiten, sondern die Optionen halt aus der Datenbank verwenden, damit diese auch selbst vom Admin erweitert werden können.



    Frage an euch: geht so etwas überhaupt?



    Der Code zum Abrufen aus der DB im Formular:


    <select class="select2" multiple="multiple" name="Panel" data-placeholder="Panel wählen" style="width: 100%;" required >

    <?php

    foreach( $ergebnisPanel as $abfragePanel){

    ?>

    <option><?php echo $abfragePanel ['Panel']; ?></option>

    <?php

    }


    ?>

    </select>


    wähle ich hier 2 Produkte aus, schickt er nur eines und zwar das letzte als Eintrag in die DB.



    Wenn jemand helfen möchte, immer ran. :)

    Aber bitte wie schon erwähnt...gaaaanz laaaangsam. ^^



    In einem Video(von gefühlten 1000 die ich mir angeschaut habe) habe ich folgedes dazu gefunden:


    <option value="<?php echo $beispiel['beispiel'];?></option>

    Das wäre ja genau das was ich bräuchte....macht er bei mir aber nicht.

  • wähle ich hier 2 Produkte aus, schickt er nur eines und zwar das letzte als Eintrag in die DB.

    Hast du dich schon mit der Console vertraut gemacht ?

    Öffne die mal und teste hier das multiple Menü

    https://www.w3schools.com/tags…e=tryhtml_select_multiple.


    Ich würde es aber anders machen.

    Das Menü so ändern

    Dann kannst du die Auswahl in PHP so auslesen

  • Hier noch eine Option, falls das multi-Select nicht gefällt..

    Code
    1. <form action="/action_page.php" method="POST">
    2. <label>Choose a car:</label>
    3. <label><input value="volvo" name="cars[]" type="checkbox">Volvo</label>
    4. <label><input value="saab" name="cars[]" type="checkbox">Saab</label>
    5. <label><input value="opel" name="cars[]" type="checkbox">Opel</label>
    6. <label><input value="audi" name="cars[]" type="checkbox">Audi</label>
    7. <br><br>
    8. <input type="submit" value="Submit">
    9. </form>

    kann es gerade nicht testen, die Verarbeitung sollte gleich sein wie bei basi

  • Danke euch schonmal.


    Ja das habe ich öfter gefunden aber...


    Die Select/Labelfelder müsste ich doch im Formular erweitern wenn etwas hinzugefügt werden soll.


    Bsp: Wir haben volvo,saab,opel,audi als feste Werte ja eigentlich.


    Soll nun Fiat dazu kommen, müsste man das ja zumindest im Formular hinzufügen.


    Der Gedanke war, da ich ja eh die DB abfrage ob man nicht genau diese Werte übernehmen könnte?


    Ich glaube man versteht mein Kauderwelsch nicht so :) deswegen nochmal:


    Datenbankeinträge:

    volvo

    saab

    opel

    audi


    Diese Werte lese ich für mein Dropdownfeld aus als Auswahl um diese im Dropdown anzuzeigen.



    Nun füge ich in die Datenbank Fiat hinzu, Fiat erscheint im Dropdown usw.


    Versteht man was ich meine? :D


    <option value="<?php echo $beispiel['beispiel'];?></option>


    Es gibt ja zig tausend Wege die nach Rom führen und zig tausend schreibweisen von php und Anweisungen....zumindest kommt mir das gerade so vor.

    Ob das hier eine "veraltete" Version ist oder gar nicht mehr möglich ist....ich weiß es leider nicht.


    Es impliziert mir aber als ob hier die Datenbankabfrage/einträge als value genutzt wird.


    Somit könnte man doch in die Datenbank hinzufügen was man möchte z.B Fiat und es wäre im Dropdown verfügbar und könnte auch gesendet werden?


    Edit: Danke für eure saubere Schreibweise schonmal. So versteh selbst ich das. :)

  • Ich bin mir noch nicht sicher was das Problem ist. Falls es dieses ist:

    Zitat

    wähle ich hier 2 Produkte aus, schickt er nur eines und zwar das letzte als Eintrag in die DB.

    hat dir Basti schon die Lösung gegeben: Du musst ein Paar von eckigen Klammern hinter den Namen stellen, so:

    name="Panel[]"

    andernfalls wird immer nur der letzte Wert an den Server geschickt.

  • Ich bin mir noch nicht sicher was das Problem ist. Falls es dieses ist:

    hat dir Basti schon die Lösung gegeben: Du musst ein Paar von eckigen Klammern hinter den Namen stellen, so:

    name="Panel[]"

    andernfalls wird immer nur der letzte Wert an den Server geschickt.

    Ach du heilige Kuh :D Kennt ihr das wenn ihr 4 std ein Komma sucht das zuviel is und warum es nicht funktioniert und ihr in die Tischkante beißen könntet? Ne ihr vermutlich nicht mehr :D


    Sempervivum, da war ich echt zu schnell und hab vor lauter Option die ich nicht wollte das übersehen....und nicht korrekt verstanden.


    Ich bekomme nun zumindest beim absenden von 2 gewählten einen Eintrag mit Array(also tatsächlich das Wort Array) in der DB. Ich vermuhte nun mal einfach das ich den wie oben gezeigt

    1. <?php
    2. if(isset($_POST['cars'])){
    3. foreach($_POST['cars'] as $key => $val){
    4. echo "Auswahl $key = $val<br>";
    5. }



    abfangen bzw. in die Ausgewählten Einträge umwandeln kann auch ohne die Variante <Option></Option> für feste Werte.


    Ei super. Dann versuch ich mal weiter zu basteln.


    Vielen Dank soweit. :)



    Edit: Neee leider doch nicht geklappt.


    Im Formular:

    <div class="form-group">
    <label>Panel auswählen:</label>
    <select class="select2" multiple="multiple" name="Panel[ ]" data-placeholder="Panel wählen" style="width: 100%;" required >

    <?php
    foreach( $ergebnisPanel as $abfragePanel){
    ?>
    <option><?php echo $abfragePanel ['Panel']; ?></option>
    <?php
    }

    ?>

    </select>



    in der php Datei


    if(isset($_POST['Panel'])){
    foreach($_POST['Panel'] as $key => $val){
    }


    Er sendet, aber nach wie vor nur einen Wert.

    Dieser Beitrag wurde bereits 1 Mal editiert, zuletzt von franky77 () aus folgendem Grund: Versuch der Vorschläge

  • in der php Datei


    if(isset($_POST['Panel'])){
    foreach($_POST['Panel'] as $key => $val){
    }


    Er sendet, aber nach wie vor nur einen Wert.


    Meine Echoausgabe sagt was anderes.

    Du musst die Werte in der Schleife abfragen.

    Oder wie hier zusehen ist nach der Schleife, doch das ist nur sinnvoll, wenn du eine Feste Größe hast von select Menü.

    Da die aber immer anders sein kann bei dir, musst du die Werte in der Schleife auslesen.


    Du könntest aber auch das ganze Array als JSON speichern, doch da weiß ich nicht, ob du das schon kannst.

    Kannst dich da ja mal einlesen

    https://www.php.net/manual/de/function.json-decode.php

    https://www.php.net/manual/de/function.json-encode.php

  • Vielen Dank basti1012

    aber....


    Ei Caramba. -.-


    Das stellte ich mir irgendwie einfach vor :D Ne, ok, dann muss ich da noch tiefer rein und schauen ob ich das geregelt bekomm.


    Zu dem anderen Thema das ich noch in anderen Foren gepostet habe.....

    Es soll nicht der Eindruck entstehen das ich im vorbeilaufen mal eben Code abgreifen möchte. Das ist nicht die Intension.


    Schon gar nicht ist es so das ich die Bemühungen hier oder sonstwo nicht zu schätzen wüsste. Gerade ICH weiß die zu schätzen da ich vor dem Code sitze als wären es Chinesische Schriftzeichen.


    Es wird aber auch nicht so sein das ich php Programmierer werde und nun 1 oder mehr Jahre in den Foren verbringe. Ist doch logisch. Sonst kann ich mal eben noch Java, CSS, und und und lernen. Bis dahin bin ich in Rente....leider.


    Dass das dermaßen eng gesehen wird in der Community war mir nicht bewusst. Dafür Sorry. Dennoch sehe ich es nach wie vor so wie ich es dort schrieb.



    Ich kann mir auch vorstellen das es eben mehr als genügend solcher Leute gibt, die dann die Lösung in ihr Projekt kopieren und nicht mal ein Danke da lassen. Das ist euch als Community gegenüber natürlich mehr als unfair.

    Dieser Beitrag wurde bereits 1 Mal editiert, zuletzt von franky77 ()

  • Zu dem anderen Thema das ich noch in anderen Foren gepostet habe.....

    Dazu gab es mal in einem anderen Forum diesen Text:


    Zitat

    Crossposting bedeutet, dass ein und dieselbe Frage in mehreren Foren oder Newsgroups gleichzeitig gestellt wird. Ein solches Verhalten wird von den meisten Helfern nicht toleriert, denn damit stellst Du einerseits die Kompetenz der Helfer jedes einzelnen Forums und Newsgroup in Frage und bewirkst zudem, dass ein zig-faches an Stunden aufgewendet wird, um nur ein einziges Problem zu lösen, denn überall werden sich die Helfer daran setzen, eine Lösung für Dich zu finden. Das ist ganz klar ein Missbrauch an dem kostenlosen und freiwilligen Support, der hier angeboten wird. Wenn Deine Frage klar und deutlich gestellt wurde, dann wirst Du ganz bestimmt innerhalb kürzester Zeit eine Antwort erhalten. Sollte dies auch nach mehreren Tagen nicht der Fall sein, dann versuche bitte die Frage besser zu formulieren. Falls Du dennoch in einem zweiten Forum posten solltest, erwähne bitte, dass Du die Frage schon woanders gestellt hast, und dass Du es tust, weil keine Lösung gefunden werden konnte.

    Stelle dir Folgendes vor: du liest in einem Forum eine Frage, wendest Zeit dafür auf, um eine gute Lösung zu posten und zwei Mausklicks später siehst du in einem anderen Forum, dass das Problem schon gelöst ist. Da bekommst du einen dicken Hals und genau deswegen wird das so eng gesehen.

  • Dazu gab es mal in einem anderen Forum diesen Text:


    Stelle dir Folgendes vor: du liest in einem Forum eine Frage, wendest Zeit dafür auf, um eine gute Lösung zu posten und zwei Mausklicks später siehst du in einem anderen Forum, dass das Problem schon gelöst ist. Da bekommst du einen dicken Hals und genau deswegen wird das so eng gesehen.

    :) Japp. Nach längerer Überlegung ist der Groschen dann gefallen. Soll nicht wieder vorkommen.

  • Du hast natürlich recht, die Echoausgabe sagt:

    <option value="volvo">volvo</option>

    <option value="fiat">fiat</option>

    pasted-from-clipboard.png


    er schreibt aber nur fiat in die DB

    pasted-from-clipboard.png


    Ich übergebe doch den Wert indem ich:


    INSERT INTO MEINEDATENBANK (MEINESPALTE) VALUES ('$val');";


    schreibe?

  • In deinem Posting #6 sehe ich nur diesen Code:

    Code
    1. if(isset($_POST['Panel'])){
    2. foreach($_POST['Panel'] as $key => $val){
    3. }

    Du hast Da eine leere foreach-Schleife. Poste doch Mal, wie es vollständig aussieht, einschl. Eintragen in die DB. Ich hoffe, Du hast letzteres nicht etwa hinter dieser Schleife notiert.

  • In deinem Posting #6 sehe ich nur diesen Code:

    Code
    1. if(isset($_POST['Panel'])){
    2. foreach($_POST['Panel'] as $key => $val){
    3. }

    Du hast Da eine leere foreach-Schleife. Poste doch Mal, wie es vollständig aussieht, einschl. Eintragen in die DB. Ich hoffe, Du hast letzteres nicht etwa hinter dieser Schleife notiert.

    Och ich bin mir sicher das ich fast alles verdaddelt hab was es da zu verdaddeln gibt :D


  • Genau was ich befürchtet hatte: Die Schleife läuft leer durch, anschließend haben $key und $val jeweils den letzten Wert. Du musst das Eintragen in die DB innerhalb der Schleife erledigen:

    Code
    1. foreach($_POST['Panel'] as $key => $val){
    2. // DB-Operation hier
    3. }
  • Genau was ich befürchtet hatte: Die Schleife läuft leer durch, anschließend haben $key und $val jeweils den letzten Wert. Du musst das Eintragen in die DB innerhalb der Schleife erledigen:

    Und prepared Statements dabei natürlich richtig verwenden - so wie du das machst ist es falsch: im Query dürfen nur Platzhalter stehen, die Werte werden mit execute (bzw. eine bind-Methode) übergeben (Pseudocode):

    PHP
    1. $query = "INSERT INTO tabelle (spalte) VALUES (:value)"
    2. $stm = $db->prepare($query)
    3. foreach($_POST[] as ){
    4.   $stm->execute(['value' => $value])
    5. }

    Zudem fehlt beim Aufbau der Datenbankverbindung noch ein »;charset=utf8mb4« am Ende des DSN (bei dir die Variable $server) damit definiert ist in welcher Form du Daten bekommst bzw. in welcher Form sie die Datenbank erwartet - wenn du das weglässt bist du auf die Standardeinstellung angewiesen und die kann sich ändern.

  • Mann, mann, mann....*Ditsch*, *Ditsch*


    Danke Sempervivum.


    Er übermittelt die Werte einzeln in 2 verschiedene....Zeilen...sind das....:


    pasted-from-clipboard.png


    Bekomme ich fiat mit Komma neben volvo?


    Ja, soll man nicht...also mehrere Einträge in einer Spalte.....


    Keine Angst, ich warte nicht still auf deine Antwort, ich bemüh google in der Zeit....

  • Bekomme ich fiat mit Komma neben volvo?

    Sicher (implode hilft), aber wie du schon bemerkt hast: das macht man nicht. Bau das Datenbankdesign so um dass jeder Eintrag eine Zeile (in einer extra Tabelle) bekommt. Dir wird ein kaputtes Datenbankdesign sonst früher oder später auf die Füße fallen und du musst es unter großem Aufwand dann doch korrigieren, mach es also besser gleich richtig.

  • Und prepared Statements dabei natürlich richtig verwenden - so wie du das machst ist es falsch: im Query dürfen nur Platzhalter stehen, die Werte werden mit execute (bzw. eine bind-Methode) übergeben (Pseudocode):

    PHP
    1. $query = "INSERT INTO tabelle (spalte) VALUES (:value)"
    2. $stm = $db->prepare($query)
    3. foreach($_POST[] as ){
    4.   $stm->execute(['value' => $value])
    5. }

    Zudem fehlt beim Aufbau der Datenbankverbindung noch ein »;charset=utf8mb4« am Ende des DSN (bei dir die Variable $server) damit definiert ist in welcher Form du Daten bekommst bzw. in welcher Form sie die Datenbank erwartet - wenn du das weglässt bist du auf die Standardeinstellung angewiesen und die kann sich ändern.

    Sorry heute mittag überlesen.


    Besser so?


    Und keine Angst es ist nicht für meinen oder einen Pizzaservice. Es handelt sich um ein nicht kommerzielles Projekt.

    Das Beispiel fand ich treffend, da ich nun überlegen wollte wie ich den 'Belag' der ja aus mehreren Dingen bestehen kann, in eine DB sende damit ich eben nicht

    Salami, Schinken, Käse in der Spalte Belag stehen habe, weil man das ja nicht macht. :)


    Aber für heute Leute.....is der Tank leer.


    Danke soweit an alle.