Tutorials
[ Zurück ]


GET-Variabeln austauschen in URL (Funktion)


Hallo

Einleitung:
Ich möchte euch in diesem Tutorial zeigen, wie man mit Hilfe einer Funktion in php beliebige $_GET Variablen austauschen kann.
Die Funktion wurde von mir entwickelt und wird laufend erweitert werden. ich habe im Internet lange nach etwas Ähnlichem gesucht und nichts gefunden, weshalb ich vor einiger Zeit damit begonnen habe diese Funktion zu entwickeln. Mittlerweile ist dies bereits Version 2.5 und es werden vermutlich noch weitere folgen, da ich laufend neues hinzulerne.
ich habe mich bemüht, die Funktion "sicher" zu gestalten und überprüfe deshalb die Variablen, obwohl es in vielen Fällen nicht wirklich nötig sein wird, diese wirklich zu überprüfen, wenn die Funktion nur von Seiten des Programmieres gefüttert wird. Falls dies der Fall ist, sollte es mit grundlegenden php-Kenntnissen problemlos möglich sein, diese Überprüfungen zu entfernen.

Zur Anwendung ein Beispiel:
Ich habe im Moment die URL http://hettelnet.cwsurf.de?show=home aufgerufen. Mit Hilfe dieser Funktion ist es nun ganz einfach möglich den Value von show in "gallery" umzuwandeln.

Was bringt mir diese Funktion?
Damit ist es möglich, auf einer einzigen index.php unterschiedliche Inhalte einzubauen (beispielsweise per include()). So kann man an einem zentralen Ort den Grundaufbau machen und hat wenig Arbeit, wenn man das Seitendesign ändern möchte. Als Beispiel könnt ihr meine eigene Homepage unter hettelnet.cwsurf.de anschauen und austesten.

Voraussetzungen:
Grundlegende php-Kenntnisse werden vorausgesetzt. Diese werden speziell zum Anpassen der Funktion benötigt, obwohl alle Teile zusammengesetzt eigentlich ohne weiteres Zutun funktionieren sollten.

Zum eigentlichen Code:

1. Zuerst müssen wir unsere Funktion definieren. Dies fällt etwas umfangreicher aus, als es vielleicht nötig wäre, da dies aber bereits Version 2.5 der Funktion ist, habe ich einige zusätzliche Features eingebaut. Diese können auch weggelassen werden.
function var_url_exchange($var_name_tmp , $var_replace_tmp , $get_url_tmp , $del_others_tmp) {

// ************************************************
// Function
// var_url_exchange.func.inc.php
// volume 2.5
// programmed by Hette
// all rights reserved
//
// comments are written in german
// ************************************************

// BESCHREIBUNG:
// Komplett ueberarbeitete Funktion (last version: vol 2.0)

// Diese Funktion wechselt Variablen aus einer URL aus, oder fuegt diese ein.
// Weiter kann man damit die URL bereinigen lassen und alle $_GET-Variablen entfernen.
// Es kann auch eine beliebige relative URL als Parameter anegegeben werden.

// Es duerfen nur relative URLs verwendet werden.
// Absolute URLs werden nicht zugelassen.
	
}
Wie ihr seht lasse ich 4 Variablen abfragen. Ich werde euch diese nun erläutern.
  • $var_name_tmp: Dies ist der Name der Variabel, deren Wert wir zu ändern gedenken.
  • $var_replace_tmp: Dies ist der Wert, der neu benutzt werden soll
  • $get_url_tmp: Auf diese Variable werde ich später eingehen. Sie ermöglicht es, beliebige URLs durch die Funktion zu jagen ohne das die gerade verwendete benutzt wird. Sie ist optional.
  • $del_others_tmp: Dieser Wert kann gesetzt werden, wenn der Benutzer alle anderen Variablen löschen möchte.
Ich bitte euch, den Kommentar stehen zu lassen, da er Informationen über den Stand der Funktion und deren Gebrauch gibt. Zudem wurde die Funktion von mir entwickelt und untersteht demnach meinem Copyright. Änderungen sind aber selbstverständlich erlaubt.


2. Als nächstes müssen wir zuerst die URL auswerten:
// URL auseinandernehmen
	$url_basename = basename($_SERVER[REQUEST_URI]);
	if (preg_match('#^[a-zA-Z0-9\.\?=&_\-]+$#i' , $url_basename) == 1) {
		// URL wurde auf schaedliche zeichen geprueft
		$url_query = parse_url($url_basename);
		if (empty($url_query[path])) {
			$url_query[path] = 'index.php';
		}
	}
Zu diesem Zweck lasse ich mir per $_SERVER[REQUEST_URI] die letzte benutzte URL ausgeben. basename() ist eine Funktion, die eine URL soweit kürzt, dass nur noch die aufgrufene Datei und die angehängten $_GET vorhanden sind (hier also: index.php?show=home). Diese wird dann per RegEx auf nicht zulässige Zeichen untersucht.
Die Funktion parse_url() dient dazu den string weiter aufzutrennen. Es wird der Teil vor dem Fragezeichen in der Variable $url_query[path] und der Teil hinter dem Fragezeichen in der Variable $url_query[query] abgespeichert.
In der If-Anweisung wird bei leerer path-Variable der Standardwert "index.php" gespeichert.


3. Anschliessend werden die weiteren Variablen geprüft.
// Vars ueberpruefen
	if (isset($var_name_tmp) && !empty($var_name_tmp)) {
		$var_name = htmlentities($var_name_tmp);
	} else {
		$var_name = false;
	}
	if (isset($var_replace_tmp) && !empty($var_replace_tmp)) {
		$var_replace = htmlentities($var_replace_tmp);
	} else {
		$var_replace = false;
	}
	if (isset($get_url_tmp) && !empty($get_url_tmp)) {
		$url_basename = basename($get_url_tmp);
		if (preg_match('#^[a-zA-Z0-9\.\?=&_\-]+$#i' , $url_basename) == 1) {
			// URL wurde auf schaedliche zeichen geprueft
			$url_query_tmp = parse_url($url_basename);
			$url_query = $url_query_tmp;
			if (empty($url_query[path])) {
				$url_query[path] = 'index.php';
			}
		}
	}
Zu diesem Block werde ich nicht viel erläutern, da er mit ein wenig Grundverständnis eigentlich leicht zu verstehen ist.
Der Teil, in dem $get_url_tmp überprüft wird, ist optional und kommt nur zum Zug, wenn in der Funktion ein Wert dafür angegeben wurde. Dann wird nicht der benutzte URL verwendet, sondern der in der Funktion angegebene. Die Überprüfung funktioniert gleich, wie oben.


4. Wenn die Variable $del_other_tmp gesetzt wurde, kommt eine weitere Anweisung zum Zug.
if ($del_others_tmp == 'del') {
		$del_others = true;
	} else {
		$del_others = false;
	}
Wenn $del_others_tmp == 'del' gesetzt wurde wird $del_others = true gesetzt, ansonsten ist sie false. Dies dient wie oben erwähnt dazu, dass man alle anderen $_GET Variablen löschen kann und ist optional.


5. Jetzt kommt das Herzstück der Funktion, welches etwas umfangreicher ist und wohl einiger Erklärung bedarf.
// URL generieren
	if ($del_others === true) {
		// Alles loeschen und Vars anhaengen
		if ($var_name != false && $var_replace != false) {
			// Vars sind nicht false
			$url = $url_query[path] . '?' . $var_name . '=' . $var_replace;
		} else {
			// Vars sind false
			$url = $url_query[path];
		}
	} else {
		if (empty($url_query[query])) {
			// Es gibt keine $_GET Vars. Die Variablen werden einfach hinten angehaengt.
			if ($var_name != false && $var_replace != false) {
				// Die Vars existieren und werden angehaengt
				$url = $url_query[path] . '?' . $var_name . '=' . $var_replace;
			} else {
				// Die Variablen existieren nicht. Es wird nur der path ausgegeben
				$url = $url_query[path];
			}
		} else {
			// $url_query[query] ist gefuellt
			// Zerlegen von $url_query[query] in Einzelstuecke nach dem Schema 'x=y'
			$url_query_pieces = explode('&' , $url_query[query]); // 'x=y'
			foreach ($url_query_pieces as $value) {
				// Jede Variable nach dem Muster 'x=y' wird nochmals beim '=' zerlegt
				$value_pieces = explode('=' , $value);
				if (count($value_pieces) == 2 && !empty($value_pieces[0]) && !empty($value_pieces[1])) {
					// Es muessen genau 2 Teile vorhanden sein ('x' und 'y') ansonsten wird das Stueck verworfen
					if ($value_pieces[0] == $var_name) {
						// die $_GET Variable ist die Gleiche, wie die Gesuchte
						$url_pieces[] = $value_pieces[0] . '=' . $var_replace;
						$var_found = true; // $var_name gefunden
					} else {
						// Die $_GET Variable ist nicht die Gleiche wie die Gesuchte
						$url_pieces[] = $value_pieces[0] . '=' . $value_pieces[1];
					}
				}
			}
			// $url_pieces zur url implodieren
			if ($var_found == true) {
				// $var_name wurde gefunden und ersetzt
				$url = $url_query[path] . '?' . implode('&' , $url_pieces);
			} else {
				// $var_name wurde nicht gefunden und wird jetzt hinten angehaengt
				if (!empty($url_pieces)) {
					// $url_pieces enthaelt etwas
					$url = $url_query[path] . '?' . implode('&' , $url_pieces) . '&' . $var_name . '=' . $var_replace;
				} else {
					// $url_pieces ist leer
					$url = $url_query[path] . '?' . $var_name . '=' . $var_replace;
				}
			}
		}
	}
In diesem Abschnitt wird die URL generiert. Da es einige "Zustände" gibt, die abzudecken sind, ist dieser Teil etwas umfangreich. Es gibt wieder einige optionale Teile, auf die ich hinweisen werde.
  • Zeile 1 bis 10: Dieser Bereich ist optional und wird nur aktiviert, wenn die Variable $del_others === true ist. Dies ist die einfachste Variante. Alle anderen vorhandenen Variablen werden "gelöscht". Somit kann man an "index.php" nur noch den Variablenname und den Wert anhängen (mit dem richtigen Syntax natürlich).
  • Der restliche Teil des Codes wird benutzt, wenn $del_others !== true ist.
    Zeile 12 bis 20: Wenn es keine $_GET Variablen gibt, also nur index.php aufgerufen wurde, werden die gewünschte Variable und deren Wert einfach hinten angehängt. Es kann dabei vorkommen, dass entweder der Variablenname oder der zu ersetzende Wert den Überprüfungen nicht standgehalten haben. In diesem Falle ist eine oder beide Variablen == false ($var_name, $var_replace). In diesem Fall wird nur index.php ausgegeben.
  • Zeile 22 bis Ende: Diese Zeilen werden gebraucht für den Fall, dass andere $_GET Variablen vorhanden sind. Dieser Fall wird wohl am Meisten vorkommen und ist auch am aufwändigsten zum programmieren. Ich hoffe ihr versteht die weiteren Schritte:
    • Die Variable $url_query[query] enthält zur Zeit alle $_GET Variablen und deren Werte in einem einzigen String. Es gilt nun diesen String in Einzelpakete aufzutrennen, so dass am Schluss jeden Variablenname und ihren Wert in einem Array gespeichert werden kann. Dies geschieht mit einem explode(), durch welches beim Zeichen "&" getrennt wird. Die folgende foreach-Schleife geht dann sämtliche Werte des arrays $url_query_pieces durch und zerlegt die einzelnen Fragmente weiter beim "=".
    • Es wird überprüft, ob bei den Variablennamen jeweils auch ein passender Wert angegeben wurde. Falls dies nicht der Fall ist, wird dieser Teil verworfen.
    • Als nächstes werden die Variablennamen durchsucht, ob einer gleich ist, wie der in der Funktion eingegebene. Falls dies der Fall ist, wird der Wert mit dem in der Funktion angegeben ersetzt. Zusätzlich wird die Variable $var_found = true gesetzt (Bedeutet: der Wert wurde ersetzt). Falls nicht, wird der alte Wert wieder angehängt.
  • Da alle neuen $_GET Variablen und ihre Werte in einem array gespeichert wurden, muss man mit der Funktion implode() wieder einen string daraus machen. Wenn $var_found === true ist, wurde der gesuchte Wert ersetzt und man kann einfach die neue URL generieren. Andernfalls muss man den Variablenname und den Wert hinten anhängen.
     
6. Der Wert sollte natürlich noch ausgegeben werden. Dazu fügt ihr diese Zeile in die Funktion ein:
return ($url);


7. Jede Funktion sollte ausführlich getestet werden. Zu diesem Fall habe ich einige Beispiele aufgeführt, welche die Funktionsweise demonstrieren sollen. Dieser Abschnitt muss selbstverständlich nicht in den Code eingefügt werden.
// Test fuer die Funktion
/* echo '************** richtige Funktion **************';

echo 'variable ersetzen';
echo var_url_exchange('show' , 'home' , '' , '');
echo 'Es wird nichts angegeben';
echo var_url_exchange('' , '' , '' , '');
echo 'Es wird nur eine haelfte (var_name) angegeben';
echo var_url_exchange('show' , '' , '' , '');
echo 'Es wird nur eine haelfte (var_replace) angegeben';
echo var_url_exchange('' , 'jhfsdg' , '' , '');
echo 'Variable ersetzen in gegebener URL index.php?hehe=gugus&muahaha=hihi';
echo var_url_exchange('show' , 'home' , 'index.php?hehe=gugus&muahaha=hihi' , '');
echo 'Variable ersetzen in gegebener URL, in der alle anderen Variablen geloescht wurden index.php?hehe=gugus&muahaha=hihi';
echo var_url_exchange('show' , 'home' , 'index.php?hehe=gugus&muahaha=hihi' , 'del');
echo 'Variable ersetzen mit 1 $_GET index.php?show=gugus';
echo var_url_exchange('show' , 'home' , 'index.php?show=gugus' , '');
echo 'Variable ersetzen mit 3 $_GET index.php?hehe=gugus&show=gugus&hallo=hdfkj';
echo var_url_exchange('show' , 'home' , 'index.php?hehe=gugus&show=gugus&hallo=hdfkj' , '');

echo '************** fehlerhafte Angaben **************';
echo 'index.php?hehe';
echo var_url_exchange('show' , 'home' , 'index.php?hehe' , '');
echo 'index.php?hehe=';
echo var_url_exchange('show' , 'home' , 'index.php?hehe=' , ''); */
Die Kommentarzeichen müssen vor Gebrauch selbstverständlich entfernt werden.


Schlusswort:
So. Hiermit bin ich am Ende meines Tutorials und hoffe ihr konntet meine Überlegungen alle nachvollziehen. ich bitte euch zu berücksichtigen, dass Erklärungen von Programmiercode niemals eine einfache Angelegenheit sind und es schnell zu Unklarheiten kommen kann. in diesem Fall bitte ich euch, mich zu benachrichtigen, auf das ich eine entsprechende Anmerkung bzw. Änderung anbringen kann.
ich freue mich über allfällige Danke's und Kommentare, sofern diese konstruktiv sind.

Hinweis:
Diese Funktion kann Sicherheitslücken enthalten und sollte niemals bedenkenlos eingesetzt werden. Der Author ist in jeder Hinsicht bemüht allfällige Fehler zu beseitigen.

Erstellt:14.03.12 22:29
Autor: stoerchu

Letzte Änderung: 14.03.12 22:30
Geändert von: stoerchu

Bewertungen:1
Bewertung: 5.0

Freigeschaltet: Ja
Views 4769

Klicke einfach auf einen Stern!
Wollen Sie wirklich das Tutorial löschen?
Wollen Sie wirklich dieses Tutorial zulassen?
Betreff: Report tutorial [id = 620] !
Absender:
Kommentar:
Wollen Sie wirklich dieses Tutorial zulassen?
Absender:
Kommentar:
Folgende User sind hier gerade aktiv:
-

ANZEIGE