[PHP/HTML] Pretty URL's met de POST method

Pagina: 1
Acties:
  • 141 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • k0ewl
  • Registratie: December 2003
  • Laatst online: 18-08-2023
Hoi,

ik ben bezig een van mijn eerste pagina's ooit om te zetten naar wat mooiers en daarbij wil ik graag url's kunnen gebruiken als http://www.eensite.nl/nieuws

op dat moment leest een script van mij uit of dat bestand bestaat in een directory, zoja dan include die de normale index en dan met dat bestand erin. Zo nee, zoekt hij in de database naar een pagina die gegenereerd wordt door PHP met die titel. Dan include hij een pagina genaamd text.php en geeft deze url mee als zoekvariabele voor de database.

Nou is er alleen 1 probleem. Als ik een formulier heb, en ik gebruik method = post voor de veiligheid met emailadressen etc, dan kan ik deze niet ophalen met de $_POST['veld'] functie van PHP.

Is hier een oplossing voor of pak ik zowiezo alles verkeerd aan?

Voorbeeld:
http://www.vraaggestuurdventileren.nl/test/

[ Voor 17% gewijzigd door k0ewl op 25-07-2006 00:22 ]

A byte walks into a bar and orders a pint. Bartender asks him "What's wrong?" Byte says "Parity error." Bartender nods and says "Yeah, I thought you looked a bit off."


Acties:
  • 0 Henk 'm!

  • ripperke
  • Registratie: Augustus 2003
  • Laatst online: 19-08 16:06

ripperke

w00t!

je doet het volledig verkeerd :)
je moet naar mod_rewrite van apache kijken
http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html

If TCP/IP handshaking was less formal, perhaps SYN/ACK would be YO/WASSUP


Acties:
  • 0 Henk 'm!

  • aex351
  • Registratie: Juni 2005
  • Laatst online: 02:04

aex351

I am the one

Ik gebruik daarnaast ipv POST de QUERY_STRING.

< dit stukje webruimte is te huur >


Acties:
  • 0 Henk 'm!

  • k0ewl
  • Registratie: December 2003
  • Laatst online: 18-08-2023
Lijkt me geweldig interessant die mod_rewrite methode van Apache. Gelukkig heeft de server ook Apache.

1 Ding alleen nog, ik kan nergens vinden of ik dan ook zeg maar kan kijken of ik via de mysql database kan achterhalen of ik een bestand of parameter moet hebben.
Bijvoorbeeld is de frequently asked questions een apart bestand en de pagina van Verf, of weet ik veel wat je aan kunt klikken allemaal, een tekst die geinclude moet worden bij text.php welke weer geinclude wordt bij index.php.

Lang verhaal kort: kan ik hiermee ook kijken of er een bestand van bestaat of dat ie voorkomt in de database?

A byte walks into a bar and orders a pint. Bartender asks him "What's wrong?" Byte says "Parity error." Bartender nods and says "Yeah, I thought you looked a bit off."


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
k0ewl schreef op dinsdag 25 juli 2006 @ 00:48:
Lang verhaal kort: kan ik hiermee ook kijken of er een bestand van bestaat of dat ie voorkomt in de database?
Ja, dat kan. Ik gebruik zelf meestal (een variant op, afhankelijk van serverconfig) onderstaande rewirterules:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Multiviews enabled for readable uri's
Options +MultiViews +FollowSymlinks

#Apache2 needs explicit pathinfo
#AcceptPathInfo On

# All multiviews uri get passed to /index.php
RewriteEngine on
RewriteBase   /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index/$1

Wat dit doet is in eerste instantie multiviews aanzetten. Dat zorgt ervoor dat apache bij een request naar /foo/bar/quux eerst gaat kijken in de directory /foo/bar/ of er een bestand quux staat (met een willekeurige extensie). Zo ja, dan wordt dat bestand geserveerd. Zo nee dan wordt er gezocht naar een bestand bar in de directory /foo/, etcetera.
De rewriterule erna zorgt ervoor dat wanneer er geen bestand (of directory) wordt gevonden, dat index(.php) wordt aangeroepen. In PHP kun je vervolgens op basis van $_SERVER["REQUEST_URI"] achterhalen wat de bezoeker wenst te bekijken en een passende response geven. Op die manier heb je een redelijke generiek methode voor mooie URL's, maar ook wat extra verantwoordelijkheden en/of romplslomp omdat je altijd zelf je URL's moet parsen (en netjes 404's moet sturen).

Een andere manier is om met behulp van rewriterules het URL om te schrijven naar een GET request. Je hoeft dan de URL-afhandeling niet zelf te regelen in PHP, je kunt gewoon scripten zoals je gewend bent. Je zult alleen wat meer (en specifiek op je site gerichte) rewriterules moeten schrijven.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • k0ewl
  • Registratie: December 2003
  • Laatst online: 18-08-2023
maar zo klopt het bij mij dus niet, ik moet altijd index.php hebben, maar afhankelijk van wel of geen bestand moet ie dus iets includen, zal wel een lekker simpel scriptje worden dan, want alles moet naar index.php :P

A byte walks into a bar and orders a pint. Bartender asks him "What's wrong?" Byte says "Parity error." Bartender nods and says "Yeah, I thought you looked a bit off."


Acties:
  • 0 Henk 'm!

  • megamuch
  • Registratie: Februari 2001
  • Laatst online: 08-12-2024

megamuch

Tring Tring!

T-MOB schreef op dinsdag 25 juli 2006 @ 01:21:
[...]
Op die manier heb je een redelijke generiek methode voor mooie URL's, maar ook wat extra verantwoordelijkheden en/of romplslomp omdat je altijd zelf je URL's moet parsen (en netjes 404's moet sturen).
Op welke manier voor jij dat door in je scripts? Door een bepaalde bootstrap file halen die vervolgens de juiste scripts weer aanroept?

Ik heb deze methode altijd interessant gevonden, maar nooit een mooie manier kunnen maken om het generiek in *al* mijn pagina's te gebruiken zonder code toch weer te moeten copy pasten.

[ Voor 6% gewijzigd door megamuch op 25-07-2006 05:05 ]

Verstand van Voip? Ik heb een leuke baan voor je!


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
megamuch schreef op dinsdag 25 juli 2006 @ 05:05:
[...]

Op welke manier voor jij dat door in je scripts? Door een bepaalde bootstrap file halen die vervolgens de juiste scripts weer aanroept?
Index PHP ziet er ongeveer zo uit - ik denk dat dat wel ongeveer is wat jij bedoeld met een bootstrap file.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
require_once 'framework/init.php';

$URL = &URLhandler::getInstance();

$moduleType = (!empty($URL->uriArgs[0])) ? $URL->uriArgs[0] : '';

//try to fetch the correct module
$module = moduleFactory::getModule($moduleType);


//init the module
if (!is_null($module) && $module->init($URL->uriArgs)) {

    if (empty($module->isIndependant)) {
        $outputHandler = new output();
        $outputHandler->content = &$module;
        $outputHandler->render();
    }

} else {

    $module = moduleFactory::getModule('404');
    $module->init();
}
?>

De URLhandler zorg voor het afhandelen van het URL (doh). Op basis van de eerste parameter wordt een module geladen. Als de module afhankelijk is dan wordt ie doorgegeven aan een outputhandler die boel combineerd met templates e.d. Is de module onafhankelijk dan genereerd ie zijn eigen content (bijvoorbeeld om afbeeldingen te serveren).
Qua copy-paste valt het reuze mee. Een module extend op een basisklasse en voor de rest hoef ik eigenlijk alleen zorg te dragen voor de juiste data.

[ Voor 8% gewijzigd door T-MOB op 25-07-2006 08:09 ]

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • André
  • Registratie: Maart 2002
  • Laatst online: 12-09 14:32

André

Analytics dude

PHP hoort in Programming

Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

@ T-MOB: Multiviews zijn bah, gevaarlijk en resourceintensief. Waarom je ze in godesnaam nog zou willen aanzetten als je ook de correcte mod_rewrite oplossing implementeert snap ik al helemaal niet.

TS zoekt overigens dit stukje .htaccess, rechtstreeks uit de Wordpress sourcetree die hetzelfde doet:
code:
1
2
3
4
5
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Oftewel: indien de opgevraagde file geen file of directory is, herschrijf alles naar index.php. Vervolgens kun je daar idd met $_SERVER["REQUEST_URI"] zelf parsen wat je wilt aan de opgegeven string.

Bij minder versatiele sites is het overigens vaak net zo handig om het rewritewerk puur in de htaccess te houden ipv in de code zelf.

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
curry684 schreef op dinsdag 25 juli 2006 @ 09:17:
@ T-MOB: Multiviews zijn bah, gevaarlijk en resourceintensief. Waarom je ze in godesnaam nog zou willen aanzetten als je ook de correcte mod_rewrite oplossing implementeert snap ik al helemaal niet.
Mja, goed punt. De reden om multiviews erin te houden was dat er scripts waren die uitgingen van multiviews. Maar goed, nu kunnen ze idd wel uit.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • k0ewl
  • Registratie: December 2003
  • Laatst online: 18-08-2023
curry684 schreef op dinsdag 25 juli 2006 @ 09:17:
@ T-MOB: Multiviews zijn bah, gevaarlijk en resourceintensief. Waarom je ze in godesnaam nog zou willen aanzetten als je ook de correcte mod_rewrite oplossing implementeert snap ik al helemaal niet.

TS zoekt overigens dit stukje .htaccess, rechtstreeks uit de Wordpress sourcetree die hetzelfde doet:
code:
1
2
3
4
5
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Oftewel: indien de opgevraagde file geen file of directory is, herschrijf alles naar index.php. Vervolgens kun je daar idd met $_SERVER["REQUEST_URI"] zelf parsen wat je wilt aan de opgegeven string.

Bij minder versatiele sites is het overigens vaak net zo handig om het rewritewerk puur in de htaccess te houden ipv in de code zelf.
nou, het is eigenlijk niet wat ik bedoelde,

het is namelijk voor mij bijna onnodig om de rewriterules te hebben, want alles moet naar mijn index.php gaan. Dit komt omdat alles zowiezo door mijn index.php geinclude moet worden.

dus als je tikt: www.eenswebsite.nl/kommaarop/

dan wil ik dat index.php aangeroepen wordt en dan het bestand kommaarop geinclude wordt.

A byte walks into a bar and orders a pint. Bartender asks him "What's wrong?" Byte says "Parity error." Bartender nods and says "Yeah, I thought you looked a bit off."


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

k0ewl schreef op dinsdag 25 juli 2006 @ 10:53:
dan wil ik dat index.php aangeroepen wordt en dan het bestand kommaarop geinclude wordt.
Dat is juist een ideale toepassing voor mod_rewrite? :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

k0ewl schreef op dinsdag 25 juli 2006 @ 10:53:
[...]

nou, het is eigenlijk niet wat ik bedoelde,

het is namelijk voor mij bijna onnodig om de rewriterules te hebben, want alles moet naar mijn index.php gaan. Dit komt omdat alles zowiezo door mijn index.php geinclude moet worden.

dus als je tikt: www.eenswebsite.nl/kommaarop/

dan wil ik dat index.php aangeroepen wordt en dan het bestand kommaarop geinclude wordt.
Dat is exact wat ik beschrijf lieverd ;) Implementeer die .htaccess maar eens en zet dan dit in je index.php:
PHP:
1
2
3
echo "<pre>";
print_r($_SERVER);
echo "</pre>";

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • megamuch
  • Registratie: Februari 2001
  • Laatst online: 08-12-2024

megamuch

Tring Tring!

T-MOB schreef op dinsdag 25 juli 2006 @ 08:09:
[...]

Index PHP ziet er ongeveer zo uit - ik denk dat dat wel ongeveer is wat jij bedoeld met een bootstrap file.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
require_once 'framework/init.php';

$URL = &URLhandler::getInstance();

$moduleType = (!empty($URL->uriArgs[0])) ? $URL->uriArgs[0] : '';

//try to fetch the correct module
$module = moduleFactory::getModule($moduleType);


//init the module
if (!is_null($module) && $module->init($URL->uriArgs)) {

    if (empty($module->isIndependant)) {
        $outputHandler = new output();
        $outputHandler->content = &$module;
        $outputHandler->render();
    }

} else {

    $module = moduleFactory::getModule('404');
    $module->init();
}
?>

De URLhandler zorg voor het afhandelen van het URL (doh). Op basis van de eerste parameter wordt een module geladen. Als de module afhankelijk is dan wordt ie doorgegeven aan een outputhandler die boel combineerd met templates e.d. Is de module onafhankelijk dan genereerd ie zijn eigen content (bijvoorbeeld om afbeeldingen te serveren).
Qua copy-paste valt het reuze mee. Een module extend op een basisklasse en voor de rest hoef ik eigenlijk alleen zorg te dragen voor de juiste data.
Ziet er duidelijk uit, maar toch heb ik nog 1 opmerking. In veel pagina's heb ik terugkomende stukken layout. Laten we als voorbeeld even een useronline text nemen. Als ik vervolgens url/taal/categorie/id aanroep, waar roep ik dan het stukje logic aan van $users online?

triviaal voorbeeldje, maar dat is voor mij echt elke keer een struikelblok om deze structuur te gebruiken. Ik blijf dan altijd maar in alle modules code copy pasten / files includen, omdat ik dat toevallig ook nodig heb. Dat is imho niet optimaal.

offtopic:
btje topic kaping dit :X

[ Voor 9% gewijzigd door megamuch op 25-07-2006 14:19 ]

Verstand van Voip? Ik heb een leuke baan voor je!


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
megamuch schreef op dinsdag 25 juli 2006 @ 14:19:
[...]
Ziet er duidelijk uit, maar toch heb ik nog 1 opmerking. In veel pagina's heb ik terugkomende stukken layout. Laten we als voorbeeld even een useronline text nemen. Als ik vervolgens url/taal/categorie/id aanroep, waar roep ik dan het stukje logic aan van $users online?
offtopic:
btje topic kaping dit :X
Ik snap je voorbeeldje niet helemaal - en het probleem denk ik ook niet. Zaken die op elke pagina voorkomen implementeer ik in de basisklasse waarop de modules uitbreidingen zijn. Wil ik op elke pagina een tellertje weer (kunnen) geven met het aantal users dan zal ik in de basisklasse dus een methode getUsersOnline() implementeren die dat nummertje (of een object met statistieken) teruggeeft. Het template bepaalt of usersOnline weergegeven moet worden (en dus of de logica erachter moet worden uitgevoerd).

Regeren is vooruitschuiven

Pagina: 1