Hi leute ich möchte gerne eine Internetpräsentation wie eine "Mappe" anlegen das heist es sind Datensätze vorhanden mit namen. Jetzt möchte ich eine auswahl mit A,B,C,D... und dann sollten alle namen mit dem anfang a erscheinen , mit b, mit c,....
hab jetzt halt folgende links erstellt:
index.php?sort=a
index.php?sort=b
und so weiter
und die mysql_abfrage lautet: mysql_query(blablabla WHERE name='".$_GET[sort]."')
so holt er mir den namen aber nur mit dem konkreten a und nicht nur die was mit a anfangen.mit WHERE LIKE gehts auch nicht... wie löst man sowas?
vielen dank für eure mühe
Seite 1 von 1
Datenbank Abfrage
Anzeige
#2
geschrieben 31. Juli 2007 - 11:26
Hi,
erstmal was du hier machst ist sehr gefährlich. Da du die GET Variable nicht überprüfst, kann hier jeder beliebige Befehle von MySQL ausführen lassen. (Stichwort SQL Injection)
Besser geht das so:
Die Switch Anweisung prüft den Inhalt von $_GET['sort'] (das strtolower wandelt alles in Kleinbuchstaben um, damit auch ?sort=A funktioniert). Falls der $_GET['sort'] == 'a' ist, dann wird $sort = "a%", usw. Default heißt, wenn kein Fall zutrifft, dann wird das in dem default: ausgeführt. In diesem Fall bricht das Skript ab und gibt die Fehlermeldung aus.
Bei LIKE ist % der Platzhalter für beliebige Zeichen (siehe http://dev.mysql.com...n-matching.html). Also wenn man alle Datensätze haben will deren name mit A beginnt schreibt man:
... WHERE name LIKE 'a%'; usw.
Gruß,
Stefan
erstmal was du hier machst ist sehr gefährlich. Da du die GET Variable nicht überprüfst, kann hier jeder beliebige Befehle von MySQL ausführen lassen. (Stichwort SQL Injection)
Besser geht das so:
switch (strtolower($_GET['sort'])) { case 'a': $sort = "a%"; break; case 'b': $sort = "b%"; break; default: die("Keine gültige Mappe ausgewählt!<br />"); } $res = mysql_query("SELECT blablabla FROM bla WHERE name LIKE '".$sort."';");
Die Switch Anweisung prüft den Inhalt von $_GET['sort'] (das strtolower wandelt alles in Kleinbuchstaben um, damit auch ?sort=A funktioniert). Falls der $_GET['sort'] == 'a' ist, dann wird $sort = "a%", usw. Default heißt, wenn kein Fall zutrifft, dann wird das in dem default: ausgeführt. In diesem Fall bricht das Skript ab und gibt die Fehlermeldung aus.
Bei LIKE ist % der Platzhalter für beliebige Zeichen (siehe http://dev.mysql.com...n-matching.html). Also wenn man alle Datensätze haben will deren name mit A beginnt schreibt man:
... WHERE name LIKE 'a%'; usw.
Gruß,
Stefan
#3
geschrieben 31. Juli 2007 - 12:10
vielen dank für die super erklärung
hab aber noch eine kleine frage:
also das a-z funktioniert jetzt supper
aber bei einer Mappe gibts ja noch 0-9
hab jetzt probiert obs so geht:
Das funktioniert aber leider nicht wie löse ich das problem?
edit. hab das problem gelöst trotzdem dankesehr
hab aber noch eine kleine frage:
also das a-z funktioniert jetzt supper
aber bei einer Mappe gibts ja noch 0-9
hab jetzt probiert obs so geht:
case '0-9': $sort = "(0% OR 1% OR 2% OR 3%...)"; break;
Das funktioniert aber leider nicht wie löse ich das problem?
edit. hab das problem gelöst trotzdem dankesehr
Dieser Beitrag wurde von Party bearbeitet: 31. Juli 2007 - 13:42
#4
geschrieben 31. Juli 2007 - 13:28
Hi,
achso du willst das ganze Alphabet in der Mappe nutzen. Ich hab da mal was kürzeres gebastelt:
Dieses Skript prüft, ob ?sort= existiert. Falls nicht, dann brauchst du keine Suchklausel und $where bleibt leer.
Falls es existiert, wird geprüft, ob $sort ==
Das mit dem REGEXP steht ebenfalls auf der MySQL Seite.
Gruß,
Stefan
achso du willst das ganze Alphabet in der Mappe nutzen. Ich hab da mal was kürzeres gebastelt:
$where = null; if (isset($_GET['sort'])) { $sort = substr(trim(strtolower(urldecode($_GET['sort']))),0,1); if ($sort == "0") { $where = " WHERE name REGEXP '^[0-9]'"; } elseif ((ord($sort) >= ord("a")) && (ord($sort) <= ord("z"))) { $where = " WHERE name LIKE '".$sort."%'"; } } $res = mysql_query("SELECT blablabla FROM bla".$where.";");
Dieses Skript prüft, ob ?sort= existiert. Falls nicht, dann brauchst du keine Suchklausel und $where bleibt leer.
Falls es existiert, wird geprüft, ob $sort ==
- 0 ist, dann werden alle Einträge mit den Zahlen abgerufen.
- ein Buchstabe von a-z ist, dann werden die jeweiligen Einträge mit diesen Anfangsbuchstaben abgerufen
Das mit dem REGEXP steht ebenfalls auf der MySQL Seite.
Gruß,
Stefan
#5
geschrieben 31. Juli 2007 - 15:19
Wow vielen dank für deine Bemühung.
hab zwar auch eine Lösung gefunden aber die ist einige Code Zeilen länger
kannst du mir den code noch einwenig erklären.
aufjedenfall vielen Dank für deine Bemühungen
hab zwar auch eine Lösung gefunden aber die ist einige Code Zeilen länger
kannst du mir den code noch einwenig erklären.
//klar: Hier wird die startvariable definiert wenn kein SORT im link eingegeben wird $where = "WHERE rfirma LIKE 'a%'"; //klar: Wenn Sort im link gesetzt ist dann if (isset($_GET['sort'])) { //klar: trim entfernt Whitespaces am anfang und ende der varibale (braucht ich doch nicht unbedingt) //unklar: substr gibt sozusagen nur den ersten buchstaben zurück (zwischen 0,1) oder? //klar: strtolower macht kleine Buchstaben draus //unklar: was macht urldecode? $sort = substr(trim(strtolower(urldecode($_GET['sort']))),0,1); if ($sort == "0") { //Das muss ich mir noch auf der einen seite genau durchlesen. $where = " WHERE rfirma REGEXP '^[0-9]'"; //und das auch :) } elseif ((ord($sort) >= ord("a")) && (ord($sort) <= ord("z"))) { $where = " WHERE rfirma LIKE '".$sort."%'"; } //mach ich für das Anzeigen aller datensätze if ($_GET["sort"]=="all") {unset($where);} }
aufjedenfall vielen Dank für deine Bemühungen
#6
geschrieben 31. Juli 2007 - 15:39
Hi,
also das urldecode war nur ein Überbleibsel, da habe ich was mit Umlauten getestet, das kannste raustun Denn im Endeffekt macht das der Webserver schon, wenn er die $_GET Variablen an PHP übergibt. Der macht praktisch Zeichen aus %##.
Mit dem substr stelle ich sicher, dass wir nur das erste Zeichen von $sort nehmen (falls ein Spassvogel mal probieren sollte, was passiert, wenn er da was anderes eingibt). Damit und mit den Überprüfungen ist es sicher, dass keiner einen Schaden anrichten kann.
Mit der Abfrage elseif ((ord($sort) >= ord("a")) && (ord($sort) <= ord("z"))) testen wir, ob der eine Buchstaben in $sort zwischen dem ASCII Wert von a und dem von z liegt (siehe ord()) und somit ein Buchstabe des Alphabets ist.
Gruß,
Stefan
also das urldecode war nur ein Überbleibsel, da habe ich was mit Umlauten getestet, das kannste raustun Denn im Endeffekt macht das der Webserver schon, wenn er die $_GET Variablen an PHP übergibt. Der macht praktisch Zeichen aus %##.
Mit dem substr stelle ich sicher, dass wir nur das erste Zeichen von $sort nehmen (falls ein Spassvogel mal probieren sollte, was passiert, wenn er da was anderes eingibt). Damit und mit den Überprüfungen ist es sicher, dass keiner einen Schaden anrichten kann.
Mit der Abfrage elseif ((ord($sort) >= ord("a")) && (ord($sort) <= ord("z"))) testen wir, ob der eine Buchstaben in $sort zwischen dem ASCII Wert von a und dem von z liegt (siehe ord()) und somit ein Buchstabe des Alphabets ist.
Gruß,
Stefan
Thema verteilen:
Seite 1 von 1