Ankündigung

Einklappen
Keine Ankündigung bisher.

jquery autocomplete mit MySQL

Einklappen

Neue Werbung 2019

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

  • jquery autocomplete mit MySQL

    Ich nutze für ein Suchfeld das "Plugin" Autocomplete von jquery. Die Abfrage funktioniert auch, allerdings würde ich die Resultate der Suche gerne mit einer weiteren Info aus der Datenbank verlinken.

    PHP-Code:
      <!doctype html> <html lang="en">
    <
    head>  
    <
    meta charset="utf-8">  
    <
    title>Demo</title>  
    <
    link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.1/themes/base/minified/jquery-ui.min.css" type="text/css" />  
    </
    head>
    <
    body>      
    <
    form action='' method='post'>        
    <
    p><label>Country:</label><input type='text' name='country' value='' class='auto'></p>    
    </
    form>  
    <
    script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.min.js">
    </script>
    <script type="text/javascript" src="http://code.jquery.com/ui/1.10.1/jquery-ui.min.js"></script>    
    <script type="text/javascript">
    $(function() {          
    //autocomplete    
    $(".auto").autocomplete({        
    source: "search.php",        
    minLength: 1     });                  
    });
    </script>
    </body>
    </html> 
    search.php
    PHP-Code:
     <?php
    define
    ('DB_SERVER''localhost');
    define('DB_USER''root');
    define('DB_PASSWORD''***');
    define('DB_NAME''***');  
    if (isset(
    $_GET['term'])){    
    $return_arr = array();  
    try {         
    $conn = new PDO("mysql:host=".DB_SERVER.";port=8889;dbname=".DB_NAMEDB_USERDB_PASSWORD);  
          
    $conn->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);        
             
    $stmt $conn->prepare('SELECT name FROM personenliste WHERE name LIKE :term');    
        
    $stmt->execute(array('term' => '%'.$_GET['term'].'%'));              
       while(
    $row $stmt->fetch()) {      
          
    $return_arr[] =  $row['name'];      
      }  
       } catch(
    PDOException $e) {    
        echo 
    'ERROR: ' $e->getMessage();     }    
      
    /* Toss back results as json encoded array. */  
      
    echo json_encode($return_arr); }  
    ?>
    Wie gesagt, die Suche funktioniert, ich würde aber die angezeigten Resultate gerne als Links darstellen. Dafür würde ich aus der Datenbank noch die ID abfragen, damit die Ausgabe später <a href="url/id">Resultat</a> ist. Wie gesagt, die Dokumentation hab ich mir angeschaut, aber ich habe nicht die passende Lösung für mein Problem gefunden.

    PS: Wie genau funktioniert eigentlich diese [PHP] Funktion? ich will die 2 Datein eigentlich nur hervorgehoben anzeigen und nicht unleserlich in einer Zeile ausgeben
    PS2: mit manuellem nachbearbeiten werden immerhin die Zeilensprünge richtig angezeigt, aber so ist es ja immernoch alles andere als wirklich leserlich ...

  • #2
    so etwa:

    select name, id ..

    hinter while

    $itemObject = new stdClass();
    $itemObject -> name = $row['name'];
    $itemObject -> id = $row['id'];
    $json[]=$itemObject;


    return json_encode($json);

    Kommentar


    • #3
      Das speichern der ID funktionert auch ohne eine stdClass, mein größter Knackpunkt ist eben das Problem, das ich nicht weiß wo ich beeinflussen kann das meine Resultate Links werden und ich die id in den href packen kann.

      Kommentar


      • #4
        Zitat von xSonicPN Beitrag anzeigen
        Das speichern der ID funktionert auch ohne eine stdClass, mein größter Knackpunkt ist eben das Problem, das ich nicht weiß wo ich beeinflussen kann das meine Resultate Links werden und ich die id in den href packen kann.
        Alles funktioniert immer irgendwie auch anders, kann ja jeder machen wie er will. Mit einem simplen Ajaxrequest baust Du Dir dein eigenes "autocomplete" -- ist doch zigtausendfach im Netz beschrieben.

        Kommentar


        • #5
          Zitat von kaminbausatz Beitrag anzeigen
          so etwa:

          select name, id ..

          hinter while

          $itemObject = new stdClass();
          $itemObject -> name = $row['name'];
          $itemObject -> id = $row['id'];
          $json[]=$itemObject;


          return json_encode($json);
          WTF… soll das werden?

          PHP-Code:
          return json_encode$row ); 
          Mehr braucht er nicht…

          Kommentar


          • #6
            Zitat von Messier 1001 Beitrag anzeigen

            WTF… soll das werden?

            PHP-Code:
            return json_encode$row ); 
            Mehr braucht er nicht…
            WTF und ähnliches solltest Du Dir sparen.

            Erst lesen, dann denken, dann schreiben wäre besser.

            Er will nicht nur eine Zeile (und die sofort) zurückgeben....

            Schau Dir folgenden Code an, eine einfache Abfrage einer SQLite-Datenbank:

            PHP-Code:
            <?php
            $datenbank
            ='sqlite:xxx.sqlite3';
            try {
                
            $db = new PDO($datenbank);
                }
                catch(
            PDOException $e){
                    echo 
            $e->getMessage();
                }

            $sql"select id, bezeichnung from websites order by parent,sort";
            $result $db->query($sql);
            $rows $result->fetchAll();

            $json = array();
            $jsonObject = array();
            foreach(
            $rows as $rowKind) {

                
            $json[]=$rowKind;

                
            $itemObject = new stdClass();
                
            $itemObject -> id $rowKind['id'];
                
            $itemObject -> bezeichnung $rowKind['bezeichnung'];
                
            $jsonObject[]=$itemObject;

            }
            echo 
            '<pre>';
            echo 
            json_encode($json);
            echo 
            '<pre>';

            echo 
            '<pre>';
            echo 
            json_encode($jsonObject);
            echo 
            '<pre>';
            ?>
            JSON Ausgabe für $json und auch Dein ach so einfaches "return json_encode( $rows )", welches ich von row auf rows korrigierte, damit die Aufgabe halbwegs gelöst wird :

            Code:
             [{"id":"39","0":"39","bezeichnung":"Befehl","1":"Befehl"},{"id":"33","0":"33","bezeichnung":".......
            JSON Ausgabe für $jsonObject :

            Code:
            [{"id":"39","bezeichnung":"Befehl"},{"id":"33","bezeichnung":"Befehl-01"},{"id":"19","bezeichnung........
            Noch Fragen?

            Heilbar ist es mit fetch(PDO::FETCH_ASSOC).... dann stimmt Deine Aussage (allerdings nur bei return json_encode($rows) )

            Kommentar


            • #7
              PHP-Code:
              echo json_encode($db->query("SELECT id, bezeichnung FROM temp")->fetchAll(PDO::FETCH_CLASS));
              // [{"id":"1","bezeichnung":"foo"},{"id":"2","bezeichnung":"bar"},{"id":"3","bezeichnung":"baz"}] 

              Kommentar


              • #8
                Zitat von hellbringer Beitrag anzeigen
                PHP-Code:
                echo json_encode($db->query("SELECT id, bezeichnung FROM temp")->fetchAll(PDO::FETCH_CLASS));
                // [{"id":"1","bezeichnung":"foo"},{"id":"2","bezeichnung":"bar"},{"id":"3","bezeichnung":"baz"}] 
                Danke für deine Antwort, damit hats geklappt.

                Kommentar


                • #9
                  ...wobei das Ergebnis bei FETCH_ASSOC und FETCH_CLASS gleich ist...

                  Kommentar


                  • #10
                    Ich hoffe der Rest deiner Anwendung passt auch noch in die eine Zeile.......
                    [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

                    Kommentar


                    • #11
                      Zitat von kaminbausatz Beitrag anzeigen
                      WTF und ähnliches solltest Du Dir sparen.
                      Mit welchen Worten ich meiner Verwunderung Ausdruck verleihe kann Dir doch egal sein. an WTF ist nix negatives

                      Zitat von kaminbausatz Beitrag anzeigen
                      Erst lesen, dann denken, dann schreiben wäre besser.
                      Wow! Das war als Spoiler gedacht.

                      Zitat von kaminbausatz Beitrag anzeigen
                      Heilbar ist es mit fetch(PDO::FETCH_ASSOC).... dann stimmt Deine Aussage (allerdings nur bei return json_encode($rows) )
                      Ach was? Geht doch.

                      PS.: Sei mal bitte nicht immer so überempfindlich bei Worten. Du hängst Dich schon das zweite mal an einer simplen Wortwahl von mir auf die praktisch nur aus dem Leben gegriffen ist. Ist doch nix dabei wenn man mal jemanden das ein oder andere Wort sagt was der Zuhörer/Leser möglicher Weise als Rau empfindet. Wenn Du das persönlich nimmst bist Du der Einzige von uns beiden.


                      Kommentar


                      • #12
                        Zitat von Messier 1001 Beitrag anzeigen
                        Ach was? Geht doch.
                        Bei $rwos - Du bist bei Deinem return schon vorzeitig ausgestiegen. Hier fehlt einfach die Exaktheit.

                        Kommentar


                        • #13
                          Zitat von xSonicPN Beitrag anzeigen
                          Das speichern der ID funktionert auch ohne eine stdClass, mein größter Knackpunkt ist eben das Problem,
                          das ich nicht weiß wo ich beeinflussen kann das meine Resultate Links werden und ich die id in den href packen kann.
                          @xSonicPN,

                          auch wenn du dein Problem gelöst hast, siehe #8, noch ein Lösungsvorschlag. Du kannst die Verlinkung eines Suchergebnis mit einer Website auch direkt in autocomplete vornehmen.

                          Das Script, um das autocomplete-Feld zu füllen:

                          PHP-Code:
                          <?php
                          $conn 
                          = new PDO("mysql:host=localhost;dbname=test""guenni""guenni");
                          function 
                          personenliste($db){
                           
                          $query "select id, nachname from tabelle22 where nachname like '".$_REQUEST['term']."%' order by nachname";
                           
                          $stmt $db->prepare($query);   
                           
                          $stmt->execute();
                           
                          $return_arr = array();             
                           while(
                          $row $stmt->fetch(PDO::FETCH_ASSOC)){
                            
                          $return_arr[] = array("label" => $row["nachname"], "id" => $row["id"], "link" => "http://server/__abfrage_details.php");
                           } 
                           return 
                          json_encode($return_arr);
                          }
                          print_r(personenliste($conn));
                          ?>
                          Der Link im Array ist jetzt für jeden Datensatz gleich. Sollten zu Begriffen unterschiedliche Seiten abgefragt werden, hätte jeder Datensatz eine Spalte z.B. "website".

                          Dann wäre das Element im Array "link" => $row["website"]. Im autocomplete-Feld ist nachher nur das Element "label" sichtbar.

                          Das autocomplete-Feld:

                          PHP-Code:
                          <script type="text/javascript">
                          <!--
                          $(
                          document).ready(function(){ 
                           
                          //ID des Textfelds       
                           
                          $("#search").autocomplete({       
                            
                          source"__abfrage_script.php",       
                            
                          minLength1,
                            
                          select: function(eventui) {window.location.href=ui.item.link+"?q="+ui.item.id;}    
                           });
                          });
                          //-->
                          </script> 
                          Sobald man einen der oben gesuchten Nachnamen im autocomplete-Feld anklickt, wird die Funktion hinter "select:" ausgeführt.

                          Dort werden an window.location.href der link aus dem Array + eine Variable für das $_GET-Array + die id aus dem Array angehangen.

                          Gruß
                          Günni

                          PS.: Es wird zwar kein Link angezeigt, das Ergebnis dürfte aber das Gleiche sein, als wenn du dir den Link aus dem return-Array zusammen schusterst.

                          Kommentar

                          Lädt...
                          X