Daten aus Datenbank in ein Modal übergeben per a link

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Daten aus Datenbank in ein Modal übergeben per a link

    Hallo liebe Forengemeinde.

    Ich arbeite gerade an einem einfach Anzeigenscript für Events. Die Anzeigenblöcke werden per Array erstellt und soweit funktioniert alles auch super. Nun sollen die Details zu den Anzeigen in einem Modal eingeblendet werden. Das Modal öffnet sich auch, allerdings wird immer nur die letzte zur Tabelle hinzugefügte Zeile ausgegeben. Wie bekomme ich es hin, dass die Daten aus der Anzeige in das Modal übernommen wird.

    Hier die Sliderfunktion in der die Anzeigen eingeblendet werden:

    PHP-Code:
    <!-- Swiper -->
         <div class="container mx-auto  swiper mySwiper">
          <div class="mb-16 swiper-wrapper">
          <?php
                $statement 
    $pdo->prepare("SELECT * FROM anzeigen WHERE anzeigen.id = id");
                
    $statement->execute();
                
    $anzeigen $statement->fetchAll(PDO::FETCH_ASSOC);
                    if (
    is_array($anzeigen) || is_object($anzeigen))
                        {
                            foreach (
    $anzeigen as $anz) { ?>
      <div class="swiper-slide">
      <div id="slider-1" class="container mx-auto">
            <div class="bg-cover bg-center  h-auto text-white py-24 px-10 object-fill" style="background-image: url(<?php echo htmlentities($anz['a_img']); ?>">
           <div class="md:w-1/2">
            <p class="font-bold text-sm uppercase"><?php echo htmlentities($anz['datum']); ?></p>
            <p class="text-3xl font-bold"><?php echo htmlentities($anz['a_titel']); ?></p>
            <p class="text-2xl mb-10 leading-none"><?php echo htmlentities($anz['a_smdesc']); ?></p>
            <a href="#modal" data-target="#modal" class="btn bg-purple-800 py-4 px-8 text-white font-bold uppercase text-xs rounded hover:bg-gray-200 hover:text-gray-800">
            <?php echo htmlentities($anz['a_ort']); ?>
                            </a>
            </div>  
        </div> <!-- container -->
          <br>
          </div>
            </div>
            <?php
                            
    }
                        }
                    
    ?>
          </div>
          <div class="swiper-pagination"></div>
        </div>​
    Hier das Modal in welches die Daten geladen werden sollen

    PHP-Code:
    <div id="modal" class="modal">
     <div class="modal-container">
     <?php
    $statement 
    $pdo->prepare("SELECT * FROM anzeigen WHERE anzeigen.id = id");
        
    $statement->execute();
                {
                    
    $anzeigen $statement->fetch(PDO::FETCH_ASSOC); { ?>
     <div style="width:100%;" class="relative w-full h-full md:h-auto">
            <!-- Modal content -->
            <div style="width:100%;" class="relative bg-white rounded-lg shadow dark:bg-gray-700">
                <!-- Modal header -->
                <div class="flex items-start justify-between p-4 border-b rounded-t dark:border-gray-600">
                    <h3 class="text-xl font-semibold text-gray-900 dark:text-white">
                    <?php echo htmlentities($anz['a_titel']); ?>
                    </h3>
                    <button type="button" class="text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm p-1.5 ml-auto inline-flex items-center dark:hover:bg-gray-600 dark:hover:text-white" data-modal-toggle="staticModal">
                        <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" clip-rule="evenodd"></path></svg>  
                    </button>
                </div>
                <!-- Modal body -->
                <div class="p-6 space-y-6">
                <div class="flex flex-col-reverse lg:flex-row w-full bg-white dark:bg-gray-800 shadow rounded">
                                <div class="w-full lg:w-1/2">
                                    <div aria-label="card" class="pt-4 lg:pt-6 pb-4 lg:pb-6 pl-4 lg:pl-6 pr-4 lg:pr-6">
                                        <div class="flex justify-between items-center lg:items-start flex-row-reverse lg:flex-col">
                                            <h4 class="text-base text-indigo-700 dark:text-indigo-600 tracking-normal leading-4">12:00pm</h4>
                                            <h4 class="lg:mt-3 text-gray-600 dark:text-gray-400 text-base font-normal"><?php echo $anz['a_titel']?></h4>
                                        </div>
                                        <a tabindex="0" class="focus:outline-none focus:underline focus:text-gray-500 hover:text-gray-500 cursor-pointer text-gray-800 dark:text-gray-100" ><h2 class=" mt-4 mb-2 tracking-normal text-xl lg:text-2xl font-bold">CES - The Global Stage for Innovation</h2></a>
                                        <p class="mb-6 font-normal text-gray-600 dark:text-gray-400 text-sm tracking-normal w-11/12 lg:w-9/12">The Consumer Technology Association’s CES 2020 will take place on 7-10 January at the Las Vegas Convention Center in Nevada. It will bring together over 150,000 delegates and 4,500 exhibitors to explore the business of consumer technologies.</p>
                                        <div class="flex lg:items-center items-start flex-col lg:flex-row">
                                            <div class="flex items-center">
                                                <div class="border-2 border-white dark:border-gray-700 shadow rounded-full w-6 h-6">
                                                    <img class="w-full h-full overflow-hidden object-cover rounded-full" src="https://dh-ui.s3.amazonaws.com/assets/webapp/layout/grid_cards/grid_card8.jpg" alt="avatar" />
                                                </div>
                                                <div class="-ml-2 border-2 border-white dark:border-gray-700 shadow rounded-full w-6 h-6">
                                                    <img class="w-full h-full overflow-hidden object-cover rounded-full" src="https://dh-ui.s3.amazonaws.com/assets/webapp/layout/grid_cards/grid_card9.jpg" alt="avatar" />
                                                </div>
                                                <div class="-ml-2 border-2 border-white dark:border-gray-700 shadow rounded-full w-6 h-6">
                                                    <img class="w-full h-full overflow-hidden object-cover rounded-full" src="https://dh-ui.s3.amazonaws.com/assets/webapp/layout/grid_cards/grid_card10.jpg" alt="avatar" />
                                                </div>
                                                <div class="-ml-2 border-2 border-white dark:border-gray-700 shadow rounded-full w-6 h-6">
                                                    <img class="w-full h-full overflow-hidden object-cover rounded-full" src="https://dh-ui.s3.amazonaws.com/assets/webapp/layout/grid_cards/grid_card11.jpg" alt="avatar" />
                                                </div>
                                                <div class="-ml-2 border-2 border-white dark:border-gray-700 shadow rounded-full w-6 h-6">
                                                    <img class="w-full h-full overflow-hidden object-cover rounded-full" src="https://dh-ui.s3.amazonaws.com/assets/webapp/layout/grid_cards/grid_card12.jpg" alt="avatar" />
                                                </div>
                                                <a tabindex="0" class="cursor-pointer text-gray-600 focus:outline-none focus:underline focus:text-gray-400 hover:text-gray-500"><p class=" dark:text-gray-400 text-xs font-normal ml-1">+12 Attendees</p></a>
                                            </div>
                                            <button class="text-gray-600 dark:text-gray-400 focus:outline-none hover:text-indigo-700 focus:text-indigo-700 mt-4 lg:mt-0 ml-0 lg:ml-12 flex items-end">
                                                <span class="mr-1 ">
                                                    <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-map-pin" width="20" height="20" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
                                                        <path stroke="none" d="M0 0h24v24H0z" />
                                                        <circle cx="12" cy="11" r="3" />
                                                        <path d="M17.657 16.657L13.414 20.9a1.998 1.998 0 0 1 -2.827 0l-4.244-4.243a8 8 0 1 1 11.314 0z" />
                                                    </svg>
                                                </span>
                                                <p class=" text-sm tracking-normal font-normal text-center">Las Vegas, Nevada</p>
                                            </button>
                                        </div>
                                    </div>
                                    <div class="px-5 lg:px-5 md:px-10 py-3 lg:py-4 flex flex-row items-center justify-between border-t border-gray-300">
                                        <div class="flex items-center">
                                            <div class="flex items-center">
                                                <div class="bg-white rounded-full w-5 h-5 flex flex-shrink-0 justify-center items-center relative">
                                                    <input aria-labelledby="id1" checked type="radio" name="radio" class="checkbox appearance-none focus:outline-none border rounded-full border-gray-400 absolute cursor-pointer w-full h-full checked:border-none" />
                                                    <div class="check-icon hidden border-4 border-black dark:border-gray-700 rounded-full w-full h-full z-1"></div>
                                                </div>
                                                <p id="id1" class="ml-3 text-base leading-4 font-normal text-gray-800 dark:text-gray-100">Going</p>
                                            </div>
                                            <div class="flex items-center ml-6">
                                                <div class="bg-white rounded-full w-5 h-5 flex flex-shrink-0 justify-center items-center relative">
                                                    <input aria-labelledby="id2" type="radio" name="radio" class="checkbox appearance-none focus:outline-none border rounded-full border-gray-400 absolute cursor-pointer w-full h-full checked:border-none" />
                                                    <div class="check-icon hidden border-4 border-black dark:border-gray-700 rounded-full w-full h-full z-1"></div>
                                                </div>
                                                <p id="id2" class="ml-3 text-base leading-4 font-normal text-gray-800 dark:text-gray-100">Not Going</p>
                                            </div>
                                        </div>
                                        <div class="flex items-center">
                                            <button aria-label="save" class="focus:outline-none focus:text-gray-400 hover:text-gray-500  text-gray-600 dark:text-gray-400  cursor-pointer mr-4">
                                                <svg class="feather feather-bookmark" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
                                                    <path d="M19 21l-7-5-7 5V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z"></path>
                                                </svg>
                                            </button>
                                            <button aria-label="share" class="text-indigo-700 dark:text-indigo-600  hover:text-indigo-500  focus:outline-none focus:text-indigo-500 cursor-pointer">
                                                <svg class="feather feather-share-2" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
                                                    <circle cx="18" cy="5" r="3"></circle>
                                                    <circle cx="6" cy="12" r="3"></circle>
                                                    <circle cx="18" cy="19" r="3"></circle>
                                                    <line x1="8.59" y1="13.51" x2="15.42" y2="17.49"></line>
                                                    <line x1="15.41" y1="6.51" x2="8.59" y2="10.49"></line>
                                                </svg>
                                            </button>
                                        </div>
                                    </div>
                                </div>
                                <div class="relative w-full h-64 lg:h-auto lg:w-1/2 rounded-t lg:rounded-t-none lg:rounded-r inline-block">
                                    <img class="w-full h-full absolute inset-0 object-cover rounded-t lg:rounded-r lg:rounded-t-none" src="https://tuk-cdn.s3.amazonaws.com/assets/components/grid_cards/gc_27.png" alt="banner" />
                                </div>
                                <style>
                                    .checkbox:checked {
                                        border: none;
                                    }
                                    .checkbox:checked + .check-icon {
                                        display: flex;
                                    }
                                </style>
                            </div>
                </div>
                <!-- Modal footer -->
                <div class="flex items-center p-6 space-x-2 border-t border-gray-200 rounded-b dark:border-gray-600">
                    <a href="#" class="text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800">I accept</a>
                </div>
            </div>
        </div>
        <?php
                    
    }
            }      
                    
    ?>
     </div>
    </div>​
    Hinweis: Es handelt sich nicht um ein Bootstrap Modal sondern reines HTML.

  • #2
    Hi!

    Ich werde nicht ganz schlau aus deinem WHERE-Teil der Datenbankabfragen. Ich hätte etwas in der folgenden Richtung erwartet.

    Beim Slider:
    PHP-Code:
    $statement $pdo->prepare("SELECT * FROM anzeigen ORDER BY id DESC LIMIT 20"); // 20 neusten auslesen, neuste zuerst
    $statement->execute();
    $anzeigen $statement->fetchAll(PDO::FETCH_ASSOC);​ 

    Beim Modal:
    PHP-Code:
    $statement $pdo->prepare("SELECT * FROM anzeigen WHERE anzeigen.id = :id"); // Details zur anzeige mir der id aus dem Parameter "id"
    $statement->execute([ "id" => $_REQUEST["id"] ]);​  // Parameter "id" aus den GET/POST variablen in die query übergeben
    $anzeige $statement->fetch(PDO::FETCH_ASSOC);​ 

    Für den Modal-Code bin ich davon ausgegangen, dass dieser per AJAX mit der entsprechenden ID als parameter nachgeladen wird, was meiner Meinung nach der gängigste weg ist. Alternativ könnte man beim Slider noch die Daten maschinenlesbar im HTML mit ausgeben (z.B. ein <script>-Block mit den Daten im JSON-Format) und dann per Javascript in das Modal übertragen (entweder manuell oder per eine js-template engine wie z.B. mustache) oder gar direkt ein Modal für jedes element mit ausgeben und einfach einblenden wenn benötigt. Insbesondere von letzerer Lösung würde ich aber klar abraten, da es unnötig viel overhead beim laden der Seite produziert und diese damit größer/langamer macht.

    Kommentar


    • #3
      Vielen Dank für die Antwort. Ich habe den Code bei den Abfragen geändert und es macht deutlich mehr Sinn so. Mit Ajax beschäftige ich mich erst seit kurzem und ich bin noch recht neu bei PHP und Java, daher zum Verständnis beim Modal:

      Es handelt sich nicht um ein Bootstrapmodal und das laden erfolgt simpel über einen Link in der Schreibe href="#modal". Daher verwende ich dabei auch kein Java. Daher meine hoffentlich nicht zu viel verlangte Bitte wie so etwas in diesem Fall aussehen könnte, da ich davon jetzt keine Vorstellung habe.

      Viele liebe Grüße MattOhl

      Kommentar


      • #4
        Zitat von MattOhl Beitrag anzeigen
        Vielen Dank für die Antwort. Ich habe den Code bei den Abfragen geändert und es macht deutlich mehr Sinn so. Mit Ajax beschäftige ich mich erst seit kurzem und ich bin noch recht neu bei PHP und Java, daher zum Verständnis beim Modal:

        Es handelt sich nicht um ein Bootstrapmodal und das laden erfolgt simpel über einen Link in der Schreibe href="#modal". Daher verwende ich dabei auch kein Java. Daher meine hoffentlich nicht zu viel verlangte Bitte wie so etwas in diesem Fall aussehen könnte, da ich davon jetzt keine Vorstellung habe.

        Viele liebe Grüße MattOhl
        Das "#modal" ist nur eine Sprungmarke. Ohne javascript ist das höchste der Gefühle was dadurch passiert, dass das Browser-Fenster ein Stück nach unten scrollt. Wenn sich bei dir also per Klick ein Modal öffnet, dann musst du irgendeine Bibliothek laden die das per Javascript umsetzt. Die einfachste aber definitiv unschöne Lösung sähe ungefähr so aus:

        PHP-Code:
        <!-- Swiper -->
        <div class="container mx-auto  swiper mySwiper">
          <div class="mb-16 swiper-wrapper">
            <?php
              
        // Slider hinzufügen
              
        $statement $pdo->prepare("SELECT * FROM anzeigen ORDER BY id DESC LIMIT 20"); // 20 neusten auslesen, neuste zuerst
              
        $statement->execute();
              
        $anzeigen $statement->fetchAll(PDO::FETCH_ASSOC);
              if (
        is_array($anzeigen)) {
                foreach (
        $anzeigen as $anz) {
                
        ?>
                <div class="swiper-slide">
                  <div id="slider-1" class="container mx-auto">
                    <div class="bg-cover bg-center  h-auto text-white py-24 px-10 object-fill" style="background-image: url(<?=htmlentities($anz['a_img'])?>)">
                      <div class="md:w-1/2">
                        <p class="font-bold text-sm uppercase"><?=htmlentities($anz['datum']);?></p>
                        <p class="text-3xl font-bold"><?=htmlentities($anz['a_titel']);?></p>
                        <p class="text-2xl mb-10 leading-none"><?=htmlentities($anz['a_smdesc']);?></p>
                        <a href="#modal-<?=$anz['id']?>" data-target="#modal-<?=$anz['id']?>" class="btn bg-purple-800 py-4 px-8 text-white font-bold uppercase text-xs rounded hover:bg-gray-200 hover:text-gray-800">
                            <?=htmlentities($anz['a_ort']);?>
                        </a>
                      </div>
                    </div>
                  </div> <!-- container -->
                  <br>
                </div>
                <?php
                
        }
              }
            
        ?>
          </div>
          <div class="swiper-pagination"></div>
        </div>
        <?php
        // Modals hinzufügen
        if (is_array($anzeigen)) {
          foreach (
        $anzeigen as $anz) {
            
        ?>
            <div id="modal-<?=$anz['id']?>" class="modal">
              <div class="modal-container">
                <div style="width:100%;" class="relative w-full h-full md:h-auto">
                  <!-- Modal content -->
                  <div style="width:100%;" class="relative bg-white rounded-lg shadow dark:bg-gray-700">
                    <!-- Modal header -->
                    <div class="flex items-start justify-between p-4 border-b rounded-t dark:border-gray-600">
                      <h3 class="text-xl font-semibold text-gray-900 dark:text-white">
                          <?=htmlentities($anz['a_titel'])?>
                      </h3>
                      <button type="button" class="text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm p-1.5 ml-auto inline-flex items-center dark:hover:bg-gray-600 dark:hover:text-white" data-modal-toggle="staticModal">
                        <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
                          <path fill-rule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" clip-rule="evenodd"></path>
                        </svg>
                      </button>
                    </div>
                    <!-- Modal body -->
                    <div class="p-6 space-y-6">
                      <div class="flex flex-col-reverse lg:flex-row w-full bg-white dark:bg-gray-800 shadow rounded">
                          <!-- Gekürzt -->
                      </div>
                    </div>
                    <!-- Modal footer -->
                    <div class="flex items-center p-6 space-x-2 border-t border-gray-200 rounded-b dark:border-gray-600">
                      <a href="#" class="text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800">
                        I accept
                      </a>
                    </div>
                  </div>
                </div>
              </div>
            </div>
            <?php
          
        }
        }

        Die wichtigen Änderungen dabei:
        - Verwendung von PHP "Short-Tags" für Variablen-Ausgaben - <?=$anz['id']?> bewirkt das selbe wie <?php echo(anz['id']); ?> ist aber deutlich kürzer und lesbarer.
        - Der Link Verweist nicht einfach auf "#modal" sondern auf "#modal-<?=$anz['id']?>" (z.B. "#modal-4711" für die Anzeige mit der id 4711) und erlaubt es damit pro Anzeige ein entsprechendes Modal vorzubereiten
        - Nach der Ausgabe des Sliders wird für jede Anzeige ein eigenes Modal erzeugt, welches dann entsprechend eingeblendet werden kann. Das ist wie gesagt absolut keine schöne Lösung, aber die einfachste.

        Um das ganze besser zu lösen würde ich auf jeden Fall mal einen Blick in Richtung Javascript und AJAX werfen, denn wenn ich richtig einschätze was du da vor hast wirst du schnell an den Punkt kommen an dem alles andere a) sehr ineffizent und b) unnötig kompliziert ist.

        Kommentar


        • #5
          Ja, das reale leben hat mich eingeholt. Ich wollte mich auf jeden Fall aber noch bedanken für die hilfreichen Tipps und die Empfehlung mit Ajax. Da arbeite ich mich gerade ein. Vielen vielen Dank und ich hoffe, besser spät als nie :-)

          Kommentar

          Lädt...
          X