php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 22.12.2008, 13:41  
Benutzer
 
Benutzerbild von echo
 
Registriert seit: 20.09.2008
Beiträge: 91
PHP-Kenntnisse:
Anfänger
echo ist zur Zeit noch ein unbeschriebenes Blatt
Standard 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
echo ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 22.12.2008, 13:44  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.709
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

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 Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline  
Alt 22.12.2008, 13:49  
Benutzer
 
Benutzerbild von echo
 
Registriert seit: 20.09.2008
Beiträge: 91
PHP-Kenntnisse:
Anfänger
echo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Danke für die schnelle Antwort!!

Zitat:
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?
echo ist offline  
Alt 22.12.2008, 13:58  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.709
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

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.

Zitat:
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 Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline  
Alt 23.12.2008, 02:42  
Benutzer
 
Benutzerbild von echo
 
Registriert seit: 20.09.2008
Beiträge: 91
PHP-Kenntnisse:
Anfänger
echo ist zur Zeit noch ein unbeschriebenes Blatt
Standard 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:



Geändert von echo (23.12.2008 um 02:50 Uhr).
echo ist offline  
Alt 23.12.2008, 06:40  
Erfahrener Benutzer
 
Registriert seit: 28.03.2008
Beiträge: 1.847
HPR1974 wird schon bald berühmt werden
Standard

Du kannst auch direkt Deine tabelle über JavaScript sortieren lassen, dafür gibts auch schon fertige scripte. Dann hast Du keine erneuten Serverausfrufe...
HPR1974 ist offline  
Alt 23.12.2008, 12:24  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.709
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Zur Sicherheit: deine Seite ist immer noch nicht sicher vor SQL-Injections (Stichwort: mysql_real_escape_string()).
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Warenverfügbarkeitslink inkl. User & Passwort mit MySQL & PHP solvero PHP Tipps 2008 11 21.08.2008 11:12
MYSQL Datenbank sortieren, nach PHP Variablen ArtAndLife PHP Tipps 2008 4 11.04.2008 10:45
MySQL Select: Nach Wortteil aus Spalte sortieren cytrobic Datenbanken 5 06.02.2008 17:12
[Erledigt] MySQL - ERROR 1044 bei erstellen einer Datenbank _youngenterpriser_ Datenbanken 2 05.02.2008 17:56
[Erledigt] sortieren von arrays aus mysql Datenbanken 7 28.04.2005 21:53
MySQL 4.x - SELECT `feld` LIKE 'ä' - Fehlerhaft MrNiceGuy Datenbanken 2 25.03.2005 14:13
[Erledigt] MySQL User erstellen Datenbanken 2 17.02.2005 17:23
Daten Sortieren aus meherern mySQL tabellen PHP Tipps 2004-2 1 12.12.2004 18:22
Access denied for user: '@localhost' / SYSTEM@localhost Datenbanken 0 10.11.2004 20:35
PHP & Mysql tabelle sortieren PHP Tipps 2004 1 03.11.2004 15:51
Password aus mySQL abfragen und vergleichen ob zu User passt PHP Tipps 2004 2 14.10.2004 10:15
.htaccess Schutz mit MYSQL User DB abgleichen... PHP Tipps 2004 0 28.09.2004 13:14
[Erledigt] MySQL: access denied for user Datenbanken 14 22.08.2004 13:47
[Erledigt] PHP5 &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;a m p; MySQL Datenbanken 5 01.08.2004 05:47
[Erledigt] mysql Daten abfragen und sortieren von b Datenbanken 2 11.06.2004 09:15

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
http://www.php.de/php-tipps-2008/50016-mysql-suchergebnisse-durch-user-nachtraeglich-neu-sortieren.html, php order by durch benutzer, php order by durch benutzer ändern, mysql datensätze nachträglich sortieren, mysql nachträglich sortieren, mysql suchergebnisse, php suchformular like wortteile, mysql php suchresultat sortieren, php mysql db nachträglich sortieren, mysql suchergebnis sortieren, php abfrage nachträglich sortieren, javascript sort mysql, php mysql abfrage nachträglich sortieren, mysql tabelle nachträglich sortieren, suchergebnisse sortieren php, php suchergebnisse sortieren, sql query nachträglich sortieren, sql tabellen nachträglich sortieren, ergebnis einer abfrage neu sortieren, mysql err 50016

Alle Zeitangaben in WEZ +2. Es ist jetzt 20:40 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum