Ankündigung

Einklappen
Keine Ankündigung bisher.

Dynamisches befüllen von Selectpicker mittels AJAX

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

  • Dynamisches befüllen von Selectpicker mittels AJAX

    Hallo,

    ich versuche schon seit längerem meine jQuery Dropdowns mittels AJAX zu befüllen. Das Ganze funktioniert bisher ungefiltert sprich es zeigt für jeden Dropdown alle möglichen Einträge an, nun möchte ich das ganze verbessern und für den zweiten Picker beispielsweise die ID des ersten als Filter setzen. Ich treffe bei dem Ganzen nun auf folgendes Problem: Ich sehe bei "Entwicklertools" unter Network und XHR, dass die ID des ersten dropdowns unter FormData aufgelistet ist, jedoch erhalte ich eine leere Query sobald ich das zweite Dropdown öffne bzw. es werden keine Optionen angezeigt. Ich habe das Gefühl, dass bei der PHP-Datei nicht ankommt, verstehe aber auch nicht zu 100% wie ich es am besten überprüfen kann.

    HTML-CODE:
    HTML-Code:
    <select class="form-control selectpicker unloadmsg" name="{NAME}" id="{NAME}"
    value="{NAME}" data-actions-box="true"
    data-live-search="true" title='{EINGABEINFO}'{ATTRIBUTE}> {OPTIONS} </select>

    JS-CODE:
    HTML-Code:
    $(document).ready(function () {
        $("#produkt").change(function () {
          var p_id = $(this).val();
         $.ajax({
                method: "POST",
                url: "modules/ausschuss/ausschuss.class.php",
                data: { prodID: $('#produkt').val() },
                async: true,
                dataType: 'text',
                success: function (data) {
                console.log(p_id);
          error: function () {
          alert("ERROR"); } }); });
    So sieht mein JS-Code aus, in der Console wird mir auch die entsprechende ID angezeigt, ich schaffe es jedoch nicht innerhalb von PHP auf diesen zuzugreifen. Die SQL-Abfrage erfolgt über eine Funktion in meiner PHP Datei, bei der mit einem Switch-case entschieden wird, um welchen Dropdown es sich handelt sprich Produkt/Linie usw. Ich denke das Problem ist, dass die ID an PHP zwar übergeben wird, die Funktion für die Datenbankabfrage jedoch nicht erneut aufgerufen wird um sich die Daten zu holen, sobald der erste Selectpicker ausgelöst wird.



    PHP-CODE:
    PHP-Code:
    case 'linie':
    $t $_POST['prodID'];
    $sql 'SELECT l.id, l.bezeichnung as bezeichnung ' 'FROM ' $this->ctb->config->dbprefix "ausschuss_linien l "
    'LEFT JOIN ' $this->ctb->config->dbprefix 'ausschuss_produkte p ON p.id=l.produkt_id '
    "WHERE l.produkt_id = ' .$t ' AND l.deleted=0 AND p.deleted=0
    AND l.archived=0 AND p.abteilung_id="
    $this->ctb->user->abteilung ' ' 'ORDER BY l.bezeichnung ';
    break; 

    Das ist die SQL Abfrage womit ich versuche die das ausgewählte Produkt als Filter zu nehmen. Ich habe es bereits mit

    HTML-Code:
    $('#linie').selectpicker('refresh');
    versucht jedoch ohne Erfolg. Vielleicht hat ja jemand eine Idee dazu oder ich mache etwas grundlegendes falsch. Danke im Vorraus!


  • #2
    Du hast in den Entwicklertools ein Tab "Antwort" oder "Answer" oder so ähnlich. Dort siehst du dann was Dein PHP-Script veranstaltet, würdest also auch sehen wenn es einen Fehler wirft oder würde Deine Testausgabe anzeigen. Alternativ könntest du in den Error-Log Deines Webservers schauen, falls ein Fehler auftritt.

    Könntest du das Ganze oben noch etwas gescheiter formatieren? Vielleicht sieht man dann einen Fehler eher. print_r würde ich übrigens nicht zu Debugzwecken nutzen, benutze var_dump().

    Kommentar


    • #3
      Sorry für die Formatierung! Unter Response steht bei mir "This request has no request data available."

      Kommentar


      • #4
        Dann dürfte Dein Ajax-Request nicht beim gezeigten PHP-Code ankommen. Anhand des gezeigten Ausschnitts kann man da natürlich nicht sagen weshalb. Falls das aber einen Klasse ist, wie weiss der Request welche Methode er aufrufen muss?

        Kommentar


        • #5
          Nur so am Rande, hast Du eine Sicherheitslücke hier:

          PHP-Code:
          case 'linie':
          $t $_POST['prodID'];
          $sql 'SELECT l.id, l.bezeichnung as bezeichnung ' 'FROM ' $this->ctb->config->dbprefix "ausschuss_linien l "
          'LEFT JOIN ' $this->ctb->config->dbprefix 'ausschuss_produkte p ON p.id=l.produkt_id '
          "WHERE l.produkt_id = ' .$t ' AND l.deleted=0 AND p.deleted=0
          AND l.archived=0 AND p.abteilung_id="
          $this->ctb->user->abteilung ' ' 'ORDER BY l.bezeichnung ';
          break; 

          Kommentar


          • #6
            case 'linie' - woher kommt der Fall?
            Denke mal, jonas3344 hat Recht, der PHP Code wird einfach nicht erreicht.
            Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

            Kommentar


            • #7
              Zitat von jonas3344 Beitrag anzeigen
              Dann dürfte Dein Ajax-Request nicht beim gezeigten PHP-Code ankommen. Anhand des gezeigten Ausschnitts kann man da natürlich nicht sagen weshalb. Falls das aber einen Klasse ist, wie weiss der Request welche Methode er aufrufen muss?
              Gut das macht Sinn, die Funktion heißt bei mir GetChoosableOptions, bei der ein String übergeben wird, welcher entsprechend entweder Produkt usw. ist und der dann durch ein Query die auswählbaren Optionen liefert. Wie kann ich denn im Request einfügen, dass es an eine Funktion gehen soll? Ich dachte bisher, dass die bei der URL nur die gesamte Klasse angegeben werden muss.


              EDIT: Es ist eine Funktion in der Klasse : "ausschuss.class.php" Sorry!

              Kommentar


              • #8
                Zitat von strub Beitrag anzeigen
                Nur so am Rande, hast Du eine Sicherheitslücke hier:
                Meinst du wegen SQL-Injection? Das steht bereits auf meiner TO-DO Liste

                Kommentar


                • #9
                  Zitat von lstegelitz Beitrag anzeigen
                  case 'linie' - woher kommt der Fall?
                  Denke mal, jonas3344 hat Recht, der PHP Code wird einfach nicht erreicht.
                  Ich benutze die Funktion "getChoosableOptions" für mehrere Tabellen, um das ganze zu vereinfachen habe ich sie einmal geschrieben und benutze sie dann für alle Tabellen. Um das mal kurz zu erklären:
                  Tabelle A hat die Werte Fahrrad, Auto, Motorrad
                  Tabelle B hat die Werte Computer, Laptop, Maus.

                  Wenn ich jetzt innerhalb dieser Tabellen einen neuen Eintrag hinzufügen möchte, werden mir aus der Funktion die auswählbaren Möglichkeiten für die Jeweilige Spalte angezeigt.

                  Kommentar


                  • #10
                    Zitat von rysf67 Beitrag anzeigen
                    Wie kann ich denn im Request einfügen, dass es an eine Klasse gehen soll?
                    Am besten gar nicht. Klassen sollten von aussen nicht erreichbar sein.

                    Zitat von rysf67 Beitrag anzeigen
                    Ich dachte bisher, dass die bei der URL nur die gesamte Klasse angegeben werden muss.
                    Nein, du gibst eine ausführbare Datei an, dass kann eine PHP Datei sein muss es aber nicht, gibt ja noch andere Serversprachen.
                    Das heisst, du musst dir da wohl noch was schreiben was die Anfrage entgegen nimmt die klasse aufruft und Daten zum Beispiel als JSON wieder zurück gibt.

                    Kommentar


                    • #11
                      Zitat von protestix Beitrag anzeigen
                      Am besten gar nicht. Klassen sollten von aussen nicht erreichbar sein.


                      Nein, du gibst eine ausführbare Datei an, dass kann eine PHP Datei sein muss es aber nicht, gibt ja noch andere Serversprachen.
                      Das heisst, du musst dir da wohl noch was schreiben was die Anfrage entgegen nimmt die klasse aufruft und Daten zum Beispiel als JSON wieder zurück gibt.
                      Alles klar, vielen Dank dann probiere ich das erstmal so aus.

                      Kommentar


                      • #12
                        Zitat von protestix Beitrag anzeigen
                        Am besten gar nicht. Klassen sollten von aussen nicht erreichbar sein.


                        Nein, du gibst eine ausführbare Datei an, dass kann eine PHP Datei sein muss es aber nicht, gibt ja noch andere Serversprachen.
                        Das heisst, du musst dir da wohl noch was schreiben was die Anfrage entgegen nimmt die klasse aufruft und Daten zum Beispiel als JSON wieder zurück gibt.
                        Also ich habe es jetzt soweit geschafft, dass die Auswahl in einer PHP Datei erkannt wird und auch unter Response die richtige ID angezeigt wird, wie genau kann ich jetzt diese ID an meine Klasse, die Auswahlmöglichkeiten übergibt, weitergeben?

                        Bzw. könntest du kurz erklären was du mit "[...]und Daten zum Beispiel als JSON wieder zurück gibt." meinst?

                        Kommentar


                        • #13
                          Also ich habe jetzt noch eine php-datei und habe beim JS-Teil folgendes hinzugefügt:

                          HTML-Code:
                            $(document).ready(function () {
                              $("#produkt").change(function () {  
                                           var p_id = $(this).val();        
                                   $.ajax({             method: "POST",          
                                          url: "modules/ausschuss/testing.php",          
                                           data: {                
                                           act: 'get_opt1' ,                
                                           prod_data:{produktID:p_id}            
                                              },            
                                      async: true,            
                                      dataType: 'json',              
                               success: function (data) {                
                                       console.log(data);                
                                       var result = data;                
                            $("#linie").html(data).selectpicker('refresh');            
                                      },            
                             error: function () {                
                            alert("ERROR");            
                                }        
                               });    
                             });


                          PHP-Code:
                          switch ($_REQUEST["act"]) {    
                                 case 
                          'get_opt1':        
                                           
                          $prod_id $_REQUEST["prod_data"]["produktID"];  
                                           
                          $return $prod_id;    
                                           
                          $x json_encode($return);        
                                           
                          $connect mysqli_connect("localhost""root""""ctb");        
                                           
                          $output '';           $query  'SELECT * FROM beta_ausschuss_linien l '            
                                           
                          ."WHERE produkt_id = " .$x" AND deleted=0 AND archived=0 "            
                                           
                          ."ORDER BY bezeichnung";          $result mysqli_query($connect$query);        
                                                  
                          $output .= '<option value="">Linie auswählen</option>';      
                                                  while(
                          $row mysqli_fetch_array($result))        {          
                                                  
                          $output .= '<option value="'.$row["id"].'" data-subtext>'.$row["bezeichnung"].'</option>';         }        
                                                  echo 
                          $output;                  
                                             break; 



                          Ich bin nun soweit, dass mir als Response, die gefilterte Auswahl angezeigt wird, jedoch verstehe ich nicht ganz wie Ich diese Antwort verarbeiten kann, also sie in den Selectpicker bekomme, hat jemand vielleicht einen Ansatzpunkt für mich, ich stehe nämlich ganz schön auf dem Schlauch.

                          Kommentar


                          • #14
                            Wenn du Javascript nicht verstehst mache es doch erst mal ohne, damit du die Zusammenhänge siehst. Lasse dabei CSS, Class-Atribute und alles sontige überflüssige erst mal weg und beschränke dich nur auf die Funktionalität.
                            D.h. du hast ein Formlar und schickst es ab.
                            Danach kommt die 2 Seite mit dem Ergebnis aus dem Select von der ersten Seite, damit erstellst dann dein Picker oder 2. Select.

                            Denn im Moment ist das auch für Aussenstehende nicht so leicht zu durchschauen, da du lediglich Ausschnitte zeigst und keine Ergebnisse lieferst was denn nun ankommt.

                            Erst wenn das sauber läuft, stellst du auf Jquery Ajax um.

                            Kommentar


                            • #15
                              Ich kenn das Plugin, welches du verwendest (Selectpicker) nicht. Lass das doch mal weg und erstell einen einfachen select.

                              Da gibts dann 2 Möglichkeiten, entweder du schickst alle Daten an den Client und baust Dir den Select dort zusammen. Oder du tust dies server-seitig und schickst dann alles (inkl. dem <select>-Tag) an den Client.
                              Dort speicherst du das dann in einen vorbereiteten Container, z.b.
                              HTML-Code:
                              <div id="select"></div>
                              mit
                              HTML-Code:
                              $('#select').html(data);
                              Zudem:
                              - Verwende nicht mehr $_REQUEST sondern $_POST (oder $_GET)
                              - Du hast da eine SQL-Injection-Lücke drin, lies das doch mal noch nach.

                              Kommentar

                              Lädt...
                              X