Haruzept: PHP arrays mit onclick sortieren

Hallo,

ich bin neu im Thema PHP und habe folgendes Problem.
Ich habe folgendes script:

<?php  
$mysqlhost="localhost"; // MySQL-Host angeben  
$mysqluser="abc"; // MySQL-User angeben  
$mysqlpwd="abc"; // Passwort angeben  
$mysqldb="Projekte"; // Gewuenschte Datenbank angeben  
  
$connection=mysql_connect($mysqlhost, $mysqluser, $mysqlpwd) or die ("Verbindungsversuch fehlgeschlagen");  
mysql_select_db($mysqldb, $connection) or die("Konnte die Datenbank nicht waehlen.");  
$sql = "SELECT * FROM Projekt ORDER BY ID";  
$projekte_query = mysql_query($sql) or die("Anfrage nicht erfolgreich");  
$anzahl = mysql_num_rows($projekte_query);  
echo "Anzahl der Projekte: $anzahl";  
?>  
<body>  
<table cellpadding="1" cellspacing="1" border="1" frame="box">  
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">  
  
<thead>  
 <tr>  
 <td BGCOLOR="#D8D8D8"><b>ID</b></td>  
 <td BGCOLOR="#D8D8D8"><b>Kurzname</b></td>  
 <td BGCOLOR="#D8D8D8"><b>Langname</b></td>  
 <td BGCOLOR="#D8D8D8"><b>Beschreibung</b></td>  
 <td BGCOLOR="#D8D8D8"><b>Aufnahmedatum</b></td>  
 <td BGCOLOR="#D8D8D8"><b>Projektleiter</b></td>  
 <td BGCOLOR="#D8D8D8"><b>Bereich</b></td>  
 <td BGCOLOR="#D8D8D8"><b>Zeitbedarf</b></td>  
 <td BGCOLOR="#D8D8D8"><b>Prozent Fertig</b></td>  
 <td BGCOLOR="#D8D8D8"><b>Bearbeiter</b></td>  
 <td BGCOLOR="#D8D8D8"><b>Aktiv</b></td>  
 <td BGCOLOR="#D8D8D8"><b>Erledigt</b></td>  
 </tr>  
</thead>  
<?php  
  
while ($pro = mysql_fetch_array($projekte_query)){  
  
?>  
  
  
<tbody>  
 <td><?=$pro['ID']?></td>  
 <td><?=$pro['Kurzname']?></td>  
 <td><?=$pro['Langname']?></td>  
 <td><?=$pro['Beschreibung']?></td>  
 <td><?=$pro['Aufnamedatum']?></td>  
 <td><?=$pro['Projektleiter']?></td>  
 <td><?=$pro['Bereich']?></td>  
 <td><?=$pro['Zeitbedarf']?></td>  
 <td><?=$pro['Fertigstellungsgrad']?></td>  
 <td><?=$pro['Bearbeiter']?></td>  
 <td><?=$pro['Aktiv']?></td>  
 <td><?=$pro['Erledigt']?></td>  
 </tr>  
</tbody>  
<?php  
}  
?>  
</table>    

Jetzt möchte ich durch klicken auf z.B. Datum, dass die Daten sortiert werden. Nur wie mache ich das mit dem klick und der Funktion?

Gruß

Haruzept

  1. Jetzt möchte ich durch klicken auf z.B. Datum, dass die Daten sortiert werden. Nur wie mache ich das mit dem klick und der Funktion?

    Du musst das ORDER BY Kriterium dynamisch setzt - je nach gewähltem Spaltenkopf.

    Zusätzlich würde ich das mit JavaScript lösen, ein Tablesort-Plugin erspart dir viel Traffic und dem Benutzter viel Wartezeit.

    1. Könntest du mir zeigen, wie ich ORDER dynamisch mache?
      Und wie würde so ein JavaScript aussehen?
      Wie gesagt bin neu in diesem Gebiet

      1. Moin,

        Könntest du mir zeigen, wie ich ORDER dynamisch mache?

        Eine Möglichkeit wäre, das Kriterium per GET zu übermitteln und entsprechend in den Query einzubinden:
        $column = $_GET["sortby"];
        $sql = "SELECT * FROM Projekt ORDER BY ".$column;
        (Dieser Quelltext ist extrem unsicher, muss also angepasst werden)

        Und wie würde so ein JavaScript aussehen?

        Per Javascript würdest du die Sortierung nicht mit einem neuen SQL-Query vornehmen, sondern direkt in der Tabelle.

        Wie gesagt bin neu in diesem Gebiet

        Alle waren mal neu...

        Grüße Marco

        1. $column = $_GET["sortby"];
          $sql = "SELECT * FROM Projekt ORDER BY ".$column;
          (Dieser Quelltext ist extrem unsicher, muss also angepasst werden)

          Und das traust du dich hinzuschreiben? Meinst du der OP liest das? Der kopiert idR. deinen Code und ignoriert den Rest.

          http://xkcd.com/327/

          1. Moin,

            $column = $_GET["sortby"];
            $sql = "SELECT * FROM Projekt ORDER BY ".$column;
            (Dieser Quelltext ist extrem unsicher, muss also angepasst werden)

            Und das traust du dich hinzuschreiben? Meinst du der OP liest das? Der kopiert idR. deinen Code und ignoriert den Rest.

            Tut mir leid *Asche aufs Haupt*.
            Sicherer Code - selbst bei diesem simplen Problem - erfordert aber ein paar Zeilen zuviel, als dass ich das jetzt hier komplett vorkaue. Es soll ja nur ein Ansatz sein.

            Grüße Marco

            1. Sicherer Code - selbst bei diesem simplen Problem - erfordert aber ein paar Zeilen zuviel, als dass ich das jetzt hier komplett vorkaue. Es soll ja nur ein Ansatz sein.

              Dann schreib' Pseudocode, der auf jeden Fall nicht mehr funktioniert wenn man ihn kopier.

  2. Ich habe folgendes script:

    ...sagen wir mal es ist in der index.php untergebracht.

    Zunächst mal musst Du php eine Variable zukommen lassen, die die Spalte bezeichnet, nach der Du sortieren möchtest. Dann musst Du diese Variablen in eine MySQL-Sortieranweisung verwenden.

    a) Definiere Links im Header der Tabelle

    <thead>
    <tr>
    <td BGCOLOR="#D8D8D8"><a href='./index.php?sort=ID'>ID</a></td>

    etc...

    b) empfange diese Variable in der index.php

    if(isset($_GET["sort"])){  
      $sortiere_nach = $_GET["sort"];  
    }
    

    c) bastel eine MySQL-Anweisung. Achte dabei auch Angriffs-Schwachstellen (Stichwort injections)!

    PS: dir fehlt glaube ich ein öffnendes <tr> im body.

    Liebe Grüße,
    LSpreee

  3. Hallo,

    ich bin neu im Thema PHP und habe folgendes Problem.
    Ich habe folgendes script:

    <?php

    $mysqlhost="localhost"; // MySQL-Host angeben
    $mysqluser="abc"; // MySQL-User angeben
    $mysqlpwd="abc"; // Passwort angeben
    $mysqldb="Projekte"; // Gewuenschte Datenbank angeben

    $connection=mysql_connect($mysqlhost, $mysqluser, $mysqlpwd) or die ("Verbindungsversuch fehlgeschlagen");
    mysql_select_db($mysqldb, $connection) or die("Konnte die Datenbank nicht waehlen.");
    $sql = "SELECT * FROM Projekt ORDER BY ID";
    $projekte_query = mysql_query($sql) or die("Anfrage nicht erfolgreich");
    $anzahl = mysql_num_rows($projekte_query);
    echo "Anzahl der Projekte: $anzahl";
    ?>
    <body>
    <table cellpadding="1" cellspacing="1" border="1" frame="box">
    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">

    <thead>
    <tr>
    <td BGCOLOR="#D8D8D8"><b>ID</b></td>
    <td BGCOLOR="#D8D8D8"><b>Kurzname</b></td>
    <td BGCOLOR="#D8D8D8"><b>Langname</b></td>
    <td BGCOLOR="#D8D8D8"><b>Beschreibung</b></td>
    <td BGCOLOR="#D8D8D8"><b>Aufnahmedatum</b></td>
    <td BGCOLOR="#D8D8D8"><b>Projektleiter</b></td>
    <td BGCOLOR="#D8D8D8"><b>Bereich</b></td>
    <td BGCOLOR="#D8D8D8"><b>Zeitbedarf</b></td>
    <td BGCOLOR="#D8D8D8"><b>Prozent Fertig</b></td>
    <td BGCOLOR="#D8D8D8"><b>Bearbeiter</b></td>
    <td BGCOLOR="#D8D8D8"><b>Aktiv</b></td>
    <td BGCOLOR="#D8D8D8"><b>Erledigt</b></td>
    </tr>
    </thead>
    <?php

    while ($pro = mysql_fetch_array($projekte_query)){

    ?>

    <tbody>
    <td><?=$pro['ID']?></td>
    <td><?=$pro['Kurzname']?></td>
    <td><?=$pro['Langname']?></td>
    <td><?=$pro['Beschreibung']?></td>
    <td><?=$pro['Aufnamedatum']?></td>
    <td><?=$pro['Projektleiter']?></td>
    <td><?=$pro['Bereich']?></td>
    <td><?=$pro['Zeitbedarf']?></td>
    <td><?=$pro['Fertigstellungsgrad']?></td>
    <td><?=$pro['Bearbeiter']?></td>
    <td><?=$pro['Aktiv']?></td>
    <td><?=$pro['Erledigt']?></td>
    </tr>
    </tbody>
    <?php
    }
    ?>
    </table>

    
    >   
    >   
    > Jetzt möchte ich durch klicken auf z.B. Datum, dass die Daten sortiert werden. Nur wie mache ich das mit dem klick und der Funktion?  
    >   
    >   
    > Gruß  
    >   
    >   
    > Haruzept  
      
    Das gibts zwei Möglichkeiten.  
    Wenn das ganze eine Tabelle sein soll, dann kannst du ein Javascript "Grid" benutzen. Da gibt es sehr machtvolle Frameworks, die dir eine Tabelle inklusive Sortierung und Filterung bauen. Der Vorteil ist eine sehr sehr schnelle verarbeitung, da die Daten im Javascript vorliegen und somit vom Browser Sortiert bzw. gefiltert werden. Nachteil wäre, dass man alle Daten bei der Initialisierung übermitteln muss. Ergo hast du eine lange Anfangsladezeit (es sein den die Daten werden nach und nach per Ajax geholt), dann jedoch eine schnelle Ausführungszeit.  
      
    Zweite Möglichkeit wäre das ganze im PHP zu machen. Dann brauchst du aber Dynamische Punkte um die Sortierreinfolge von Außen zu beeinflussen. Rudimentär sieht das so aus:  
    if($\_GET["sort"] == "name\_asc")  
    {  
    $orderby = "NAME ASC";  
    } else if($\_GET["sort"] == "mail\_asc")  
    {  
    $orderby = "MAIL ASC";  
    }  
      
    je nachdem was in $\_GET["sort"] steht reagierst du mit einer entsprechend anderen suche. Das ganze kann man wie "suit" bereits angedeutet hat noch kürzer darstellen. Ungefähr so:  
    //--- $\_GET["sort"] = "NAME ASC"  
    $orderby = $\_GET["sort"];  
      
    Die Variable $orderby musst du dann noch entsprechend in deinen MySQL Code einpflegen.  
      
    Gruß  
    Europapark geschädigter  
    T-Rex  
    
    
    1. if($_GET["sort"] == "name_asc")
      {
      $orderby = "NAME ASC";
      } else if($_GET["sort"] == "mail_asc")
      {
      $orderby = "MAIL ASC";
      }

      Erstmal, danke für eure/deine Hilfe.

      Und wie passe ich das jetzt an?

      Könntest du mir das ganze für eine einfache Tabelle zeigen?
      Weil zur Zeit verstehe ich nur Bahnhof.

      1. Und wie passe ich das jetzt an?

        Weil zur Zeit verstehe ich nur Bahnhof.

        Von dir als Teilnehmer erwarten wir [PHP]-Grundkenntnisse, sowie die Bereitschaft, zunächst erst einmal mit der Suchfunktion im Archiv nach ähnlichen Problemen zu suchen. Lies unsere FAQ, dort sind häufig gestellte Fragen direkt beantwortet.

  4. Habe es jetzt geschaft :)

    Danke für eure hilfe