Ankündigung

Einklappen
Keine Ankündigung bisher.

MySQL - Suchergebnisse durch User nachträglich neu sortieren

Einklappen

Neue Werbung 2019

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

  • MySQL - Suchergebnisse durch User nachträglich neu sortieren

    Hallo!

    Ich würde gerne wissen, was die beste Lösung für folgendes Problem ist:

    Eine Abfrage aus einer MySQL-Tabelle über sagen wir mal 6 Spalten ergibt beispielsweise 25 Ergebnisse, welche mittels PHP in einer HTML-Tabelle angezeigt werden.

    Nun möchte ich gerne eine Möglichkeit für den User einbauen, diese Suchergebnisse nachträglich neu zu sortieren. Auf manchen Seiten habe ich sowas schon gesehen, man klickt dann z.B. einfach auf einen beliebigen Spaltenkopf der Tabelle - und schwups wird die Tabelle neu sortiert.

    Meine bisherigen Recherchen ergaben, dass die beste Lösung, was Performance betrifft, wäre, es nochmal über MySql zu machen statt über PHP.
    nur ORDER BY ändern - Das Hilfe, HTML und Webmaster Forum

    Aber wie am besten technisch umsetzen? Ich habe es jetzt so gemacht:

    • Einen Link ins PHP-Skript einbauen.
    • Der Link hat als href $_SERVER['PHP_SELF'] ?abfrage=$neueabfrage
    • $neueabfrage = alte Abfrage + gewünschte Sortierung

    Problem: HTML (oder PHP?) übernimmt die Abfrage nicht richtig und fügt bei jedem Anführungszeichen (') noch ein \ ein; macht zum Beispiel "WHERE kunden.kd_nr LIKE \'9%\' " draus.

    Man könnte natürlich die Abfrage kodieren und dann wieder decodieren. PHP: base64_encode - Manual

    Aber gibt es denn keine bessere/elegantere Lösung?

    Danke und frohe Weihnachtszeit!
    Lisa

  • #2
    Hallo,

    du denkst zu kompliziert.
    ORDER BY ist korrekt und der einzig sinnvolle Weg. Über einen zusätzlich GET-Parameter kannst du dann angeben, wonach sortiert werden soll (ORDER BY $order). Aber Achtung: Diesen Parameter natürlich vorher gegen eine Whitelist validieren!

    Auch dir eine schöne Weihnachtszeit!
    Refining Linux: “[url=http://www.refining-linux.org/archives/65/Performing-push-backups-Part-1-rdiff-backup/]Performing Push Backups – Part 1: rdiff-backup[/url]”

    Kommentar


    • #3
      Danke für die schnelle Antwort!!

      Zitat von Manko10 Beitrag anzeigen
      Über einen zusätzlich GET-Parameter kannst du dann angeben, wonach sortiert werden soll (ORDER BY $order).
      Aber wo und wie speichere ich die ursprüngliche Abfrage, wenn diese
      • ebenfalls schon vom User bestimmt wurde, also variabel ist, und
      • das ganze mittels $_SERVER['PHP_SELF'] auf der selben Seite statt finden soll?

      Kommentar


      • #4
        Zunächst: statt $_SERVER['PHP_SELF'] solltest du $_SERVER['SCRIPT_NAME'] verwenden (um unerwünschte XSS-Effekte zu vermeiden).
        Die Abfrage ist genau die gleiche wie vorher auch, nur dass diesmal ein GET-Parameter hinzugefügt wurde.
        Sollte die alte Abfrage per POST gesendet worden sein, so bleibt dir wohl nichts anderes übrig, als sie hier über GET zu senden.

        Problem: HTML (oder PHP?) übernimmt die Abfrage nicht richtig und fügt bei jedem Anführungszeichen (') noch ein \ ein; macht zum Beispiel "WHERE kunden.kd_nr LIKE \'9%\' " draus.
        Das ist ein Problem der magic_quotes. Du musst in deinem Falle vorher ein stripslashes() ausführen. Aber du darfst auch auf keinen Fall die gesamte SQL-Abfrage übergeben, sondern wirklich nur den Suchbegriff. Die SQL-Abfrage erstellst du erst auf dem Server. Was meinst du, was da passiert, wenn jemand als Suchbegriff plötzlich
        Code:
        DELETE FROM kunden
        oder
        Code:
        SELECT name, passwort FROM kunden;
        eingibt? Auf jeden Fall solltest du dich mit SQL-Injections beschäftigen.
        Refining Linux: “[url=http://www.refining-linux.org/archives/65/Performing-push-backups-Part-1-rdiff-backup/]Performing Push Backups – Part 1: rdiff-backup[/url]”

        Kommentar


        • #5
          Fertig?

          Hallo Manko!

          Danke für Deine erneute Hilfe und Deinen Sicherheitstipp! Ich hätte doch glatt die GESAMTE Abfrage als GET-Parameter übergeben und damit die Möglichkeit für einen GAU geschaffen. Das ganze ist zwar erst mal nur lokal auf meinen "Heim-Server", aber trotzdem...

          Ich habe jetzt dank Deinen Anregungen das ganze so gelöst. Falls keiner eine bessere Idee hat oder noch mal einen Sicherheits-Schnitzer entdeckt, markiere ich diesen Thread dann als erledigt!
          PHP-Code:
          <?php
          if (!isset($_POST['suche_kunden']) )
          {
          ?>
          <form action="<?php echo $_SERVER['SCRIPT_NAME']?>" method="POST">

          [...das Formular...]

          <input type="submit" name="suche_kunden" value="Finden..."></td>
             
          </form>
          <?php
          }
          elseif (isset(
          $_POST['suche_kunden'])) //Falls die Anfrage durch das Suchformular kommt
          {

          foreach (
          $_POST AS $key=>$feld//Holt alle ausgefüllten Felder aus dem Suchformular, die für die Suche relevant sind und macht daraus den WHERE-Teil der DB-Abfrage
            
          {
            if(
          substr($key02) =="kd" AND $feld !="")
              {
                
          $abfrage_p4 .=  " kunden.".$key." LIKE '".$feld."%' AND";
               }
              
               
            }
          $abfrage_p4 substr($abfrage_p40, -3);

          }

          elseif (isset(
          $_GET['ab_2'])) //Falls die Suchanfrage schon feststeht und nur die Sortierreihenfolge geändert werden soll
          {
          $abfrage_p2 $_GET['ab_2'];
          $abfrage_p4 stripslashes($_GET['ab_4']);
          $abfrage_p5 $_GET['ord'];
          }

          if(isset(
          $_GET['ab_2']) OR isset($_POST['suche_kunden']))
          {


          $abfrage_p1 "SELECT ";
          $abfrage_p2 =  "*"//Hier könnten noch die Spalten ausgewählt werden, ggf auch über das Suchformular
          $abfrage_p3 " FROM kunden LEFT JOIN ansprechpartner ON kunden.kd_id = ansprechpartner.ap_kd_id WHERE";
          $abfrage =  $abfrage_p1.$abfrage_p2.$abfrage_p3.$abfrage_p4.$abfrage_p5//Setzt die Suchanfrage aus den einzelnen Stücken zusammen

          $ergebnis db_abfrage($abfrage); //Die Funktion db_abfrage sucht in der Datenbank
          $ergebnis_anz mysql_num_rows($ergebnis);

          $ergebnis_th db_abfrage_e($abfrage);
          $th mysql_fetch_object($ergebnis_th);

          if (
          $ergebnis_anz == FALSE)
          die(
          "<p><strong><em>Leider keine Treffer.</em></strong></p>");

          //AB HIER GEHT DIE EIGENTLICHE AUSGABE LOS
          echo "<p>Ihre Anfrage ergab $ergebnis_anz Treffer!</p>";
          tb_start('','100%',0,0,0);//(Kleine Funktion, die Tabelle startet)

          echo "<tr>\n";
          foreach(
          $th AS $key=>$feld)
              {
              if (
          $key == "kd_id")
              echo 
          "";
              else    
              
          //START TABELLENKOPF
              //Ein "ordentliche" Bezeichnung der Spalten liefert mir ein array ($labels)
              //Der Link neben dem Label führt zu einer Neusortierung der DB-Abfrage
              
          echo "<th align=\"left\">$labels[$key] <a href=\"".$_SERVER['SCRIPT_NAME']."?ab_2=".$abfrage_p2."&ab_4=".$abfrage_p4."&ord=ORDER BY ".$key." ASC\" title=\"Nach ".$labels[$key]." aufsteigend sortieren\"><img src=\"pics/down.png\" width=\"16\" height=\"16\"  border=\"0\"></a> 
              <a href=\""
          .$_SERVER['SCRIPT_NAME']."?ab_2=".$abfrage_p2."&ab_4=".$abfrage_p4."&ord=ORDER BY ".$key." DESC\" title=\"Nach ".$labels[$key]." absteigend sortieren\"><img src=\"pics/up.png\" width=\"16\" height=\"16\"  border=\"0\"></a>
              </th>\n"
          ;
              }
          echo 
          "</tr>\n";

          while(
          $row mysql_fetch_object($ergebnis))
          {
          //START TABELLENKÖRPER

          echo "<tr>";

              
              foreach(
          $row AS $feld)
              {
                  
                     echo 
          "<td>$feld</td>\n";
              
              
              
              }
              echo 
          "</tr>\n";
             }
          tb_end();//(Kleine Funktion, die Tabelle beendet

          }
          else
          {echo 
          "FEHLER!";}
          ?>
          Und so sieht's dann aus:


          Kommentar


          • #6
            Du kannst auch direkt Deine tabelle über JavaScript sortieren lassen, dafür gibts auch schon fertige scripte. Dann hast Du keine erneuten Serverausfrufe...

            Kommentar


            • #7
              Zur Sicherheit: deine Seite ist immer noch nicht sicher vor SQL-Injections (Stichwort: mysql_real_escape_string()).
              Refining Linux: “[url=http://www.refining-linux.org/archives/65/Performing-push-backups-Part-1-rdiff-backup/]Performing Push Backups – Part 1: rdiff-backup[/url]”

              Kommentar

              Lädt...
              X