Du befindest Dich im Archiv vom ABAKUS Online Marketing Forum. Hier kannst Du Dich für das Forum mit den aktuellen Beiträgen registrieren.

PHP: Frage zu kleinem Umleitungsscript

Ajax, Hijax, Microformats, RDF, Markup, HTML, PHP, CSS, MySQL, htaccess, robots.txt, CGI, Java, Javascript usw.
Neues Thema Antworten
webpilot
PostRank 6
PostRank 6
Beiträge: 417
Registriert: 24.03.2007, 17:03

Beitrag von webpilot » 06.03.2009, 18:54

Ich habe ein kleines Umleitungsscript geschrieben. Ziel ist es, mittels GET eine ID zu übergeben, nach dieser dann umgeleitet wird.

Code: Alles auswählen

<?php
	// Startseite definieren
	define &#40;'START', 'http&#58;//www.abakus-internet-marketing.de/'&#41;;
	
	// GET in Variable speichern
	$redirect_id = $_GET&#91;'id'&#93;;
	// Länge ermitteln
	$length = strlen&#40;$redirect_id&#41;;
	if &#40;is_int&#40;$redirect_id&#41; && &#40;$length == 4&#41;&#41; &#123;

		switch&#40;$redirect_id&#41; &#123;
		case 1001&#58;
		$site = 'http&#58;//www.google.de/';
		break;

		case 1002&#58;
		$site = 'http&#58;//www.microsoft.com/';
		break;

		case 1003&#58;
		$site = 'http&#58;//www.yahoo.com/';
		break;
		
		// Im Falle einer ungültigen ID wird START als Ziel definiert
		default&#58;
		$site = START;
		break;
		&#125;

	&#125; else &#123;

	$site = START;

	&#125;

	header&#40;'Status&#58; 301 Moved Permanently'&#41;;
    header&#40;'Location&#58;'.$site&#41;;
    exit;
?>
Ich habe erst eine IF-Abfrage implementiert, mit der ich prüfen wollte ob A: es sich beim übergegebenen Parameter um einen Integer handelt und B: ob dieser 4 Stellen hat (z.B. 1234). Trifft dies zu, wird eine Liste abgearbeitet, wo ich die Seiten definieren möchte. Wenn kein Wert zutrifft, kommt wieder die Default-Seite.

Leider greift die Switch-Anweisung nicht. Wenn ich die Seite mit index.php?id=1003 (yahoo.de) aufrufe, werde ich trotzdem auf die Default-seite umgeleitet. Ich vermute irgendwie ein Problem mit dem Integer-Variable.

Kann wer helfen? Gibt es vielelicht noch etwas bzgl. Sicherheit zu beachten? PHP ist noch etwas "gewöhnungsbedürftig" für mich... ;)

Anzeige von ABAKUS

von Anzeige von ABAKUS »

SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


MrTunes
PostRank 9
PostRank 9
Beiträge: 1128
Registriert: 01.05.2007, 20:25
Wohnort: Hier

Beitrag von MrTunes » 06.03.2009, 19:02

is_numeric?
aber wozu die fragerei.
die switch reicht doch.

webpilot
PostRank 6
PostRank 6
Beiträge: 417
Registriert: 24.03.2007, 17:03

Beitrag von webpilot » 06.03.2009, 19:14

Ich dachte mir, dass ich so bereits im Vorfeld faule GET-Werte eleminiere und nicht die ganze Switch-Schleife durchlaufen lassen muss. Du würdest also nur eine is_numeric Prüfung mit anschliessendem Switch machen?

Danke schon mal.

MrTunes
PostRank 9
PostRank 9
Beiträge: 1128
Registriert: 01.05.2007, 20:25
Wohnort: Hier

Beitrag von MrTunes » 06.03.2009, 19:17

ich hab ja überhauipt keine ahnung von php...
aber ich würde nur auf die werte prüfen.

Anonymous

Beitrag von Anonymous » 06.03.2009, 21:28

Code: Alles auswählen

....
$redirect_id = trim&#40;$_GET&#91;'id'&#93;&#41;;
....
leerzeichen am Anfang und Ende entfernen... können immer mal dazukommen, und schon stimmt die länge nicht mehr

Synonym
PostRank 10
PostRank 10
Beiträge: 3708
Registriert: 09.08.2008, 02:55

Beitrag von Synonym » 07.03.2009, 12:33

Zahlen die per GET übergeben werden sind in dem Sinne keine Zahlen (int) mehr, sondern ein String. is_int() funktioniert daher nicht.

is_numeric() währe ein Ansatz, kann aber nicht auf Ganzzahlen prüfen. 123.4 würde da auch zutreffen. Alternativ geht aber ctype_digit() falls vorhanden.

Ich würde auch das strlen() weg lassen und eher prüfen ob die Zahl größer 1000 und eventuell kleiner als eine maximaler Wert ist.

DanielS
PostRank 9
PostRank 9
Beiträge: 1179
Registriert: 03.08.2008, 08:45

Beitrag von DanielS » 07.03.2009, 13:15

Synonym hat geschrieben:Zahlen die per GET übergeben werden sind in dem Sinne keine Zahlen (int) mehr, sondern ein String. is_int() funktioniert daher nicht.
Das stimmt.
In den Kommentaren auf der Manual-Seite zu is_int() gibt ein paar weitere Alternativen: https://de.php.net/is_int

Mork vom Ork
PostRank 9
PostRank 9
Beiträge: 2557
Registriert: 08.07.2008, 11:07
Wohnort: Aufm Friedhof.

Beitrag von Mork vom Ork » 07.03.2009, 13:50

webpilot hat geschrieben:Gibt es vielelicht noch etwas bzgl. Sicherheit zu beachten? PHP ist noch etwas "gewöhnungsbedürftig" für mich... ;)
Zur Sicherheit nicht, aber zum Stil:

$_GET ist eine Variable wie jede andere auch, mit der Ausnahme, dass sie bereits vorab gefüllt wird. Es ist daher unnötig, den Inhalt von $_GET zur Nutzung erst in eine andere Variable zu kopieren. Dies:

Code: Alles auswählen

$redirect_id = $_GET&#91;'id'&#93;;
// Länge ermitteln
$length = strlen&#40;$redirect_id&#41;;
if &#40;is_numeric&#40;$redirect_id&#41; && &#40;$length == 4&#41;&#41; &#123;
kannst du genauso gut so schreiben:

Code: Alles auswählen

if &#40;is_numeric&#40;$_GET&#91;'id'&#93;&#41; && &#40;strlen&#40;$_GET&#91;'id'&#93;&#41; == 4&#41;&#41; &#123;
Ich finde dieses Eimerchen-Spiel (Daten von hier nach da nach dort kopieren, ohne tatsächlich mit ihnen zu arbeiten) zudem immer etwas verwirrend.

Davon unabhängig: Ich weiß nicht, wie lang deine switch-Liste werden soll und von wem sie aufgerufen wird, aber den Aufwand, erst zu prüfen, ob $_GET['id'] zweier Vorgaben entspricht, kannst du dir IMHO sparen. Du steckst da in der Summe der korrekten Angaben mehr unnütze Arbeit rein, als du bei den vermutlich seltenen Fehleingaben an Millisekunden einsparst.
Du würdest mehr sparen, würdest du zwei verschachtelte Blöcke bauen, der äußere prüft das erste Zeichen, die inneren die drei anderen Zeichen, (also quasi einen Index auf das erste Zeichen anlegen).

Was du allerdings vergessen hast, ist vor dem Zugriff auf $_GET['id'] mit isset() zu prüfen, ob $_GET['id'] überhaupt existiert.

Und wird die switch-Liste sehr lang, ist sie so oder so der falsche Weg, dann solltest du eine ordentliche Datenhaltung vorsehen. Das muss nicht gleich eine SQL-Datenbank sein, eine indizierte Datei im dbm-Stil reicht schon.

webpilot
PostRank 6
PostRank 6
Beiträge: 417
Registriert: 24.03.2007, 17:03

Beitrag von webpilot » 10.03.2009, 11:05

Danke für Eure Hilfe.

Antworten
  • Vergleichbare Themen
    Antworten
    Zugriffe
    Letzter Beitrag