WinFuture-Forum.de: Datenbank Abfrage - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Datenbank Abfrage


#1 Mitglied ist offline   Party 

  • Gruppe: aktive Mitglieder
  • Beiträge: 501
  • Beigetreten: 16. Januar 04
  • Reputation: 0

geschrieben 31. Juli 2007 - 10:16

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
0

Anzeige



#2 Mitglied ist offline   Diewie 

  • Gruppe: aktive Mitglieder
  • Beiträge: 409
  • Beigetreten: 18. Juni 06
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Geisenhausen / München

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:
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
0

#3 Mitglied ist offline   Party 

  • Gruppe: aktive Mitglieder
  • Beiträge: 501
  • Beigetreten: 16. Januar 04
  • Reputation: 0

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:
	   	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

0

#4 Mitglied ist offline   Diewie 

  • Gruppe: aktive Mitglieder
  • Beiträge: 409
  • Beigetreten: 18. Juni 06
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Geisenhausen / München

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:

$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
0

#5 Mitglied ist offline   Party 

  • Gruppe: aktive Mitglieder
  • Beiträge: 501
  • Beigetreten: 16. Januar 04
  • Reputation: 0

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.

//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
0

#6 Mitglied ist offline   Diewie 

  • Gruppe: aktive Mitglieder
  • Beiträge: 409
  • Beigetreten: 18. Juni 06
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Geisenhausen / München

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
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0