Toon posts:

Hoe vertel ik mod_rewrite wat de id's zijn uit MySQL?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben niet de eerste en zal ook zeker niet de laatste zijn die met deze vraag worstelt.

Een site (php-mysql) met standaad URLs /?categoryid=3&postid=46 wil ik graag vertalen naar friendly urls als /categorienaam/titelvanpost. Het principe van mod_rewrite snap ik wel, maar waar ik niet uitkom is hoe ik mod_rewrite kan vertellen wat de id's zijn van mijn categorieën en posts.

De voorbeelden die ik vind rewriten /?categoryid=3&postid=46 in /3/46 en niet in /categorienaam/titelvanpost. Dat is dus geen oplossing voor mij (denk ik).

Ik weet even niet meer waarop te googelen. Een uitgespelde oplossing zoek ik niet, maar een tip in welke richting ik het moet zoeken is welkom.

Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 10:04
Niet, tenzij je ze er allemaal in wilt zetten. Pas je pagina aan zodat je ook de naam kan meegeven en titel en rewrite dan /categorienaam/titelvanpost naar bijv. /?category=categorienaam&post=titelvanpost

Acties:
  • +1 Henk 'm!

Verwijderd

Topicstarter
Damn. Als je ergens te lamg naar kijkt zie je het voor de hand liggende niet meer. Thanks.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Wat Caelorum zegt is een mogelijkheid maar je kan natuurlijk ook gewoon werken met reguliere expressies of gewoon de hele query string uitlezen in PHP zodat je gewoon met ID's kunt blijven werken.

Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 10:04
Dat is niet echt een oplossing. Die ID moet je ergens vandaan halen. Of door het in de pretty URL op te nemen of door aan de hand van de andere gegevens in die URL de ID ergens vandaan te toveren.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Caelorum schreef op vrijdag 12 juni 2015 @ 11:37:
Dat is niet echt een oplossing. Die ID moet je ergens vandaan halen.
Ja, die zit dus in de URL en die kun je daar uit halen ;)
Of door het in de pretty URL op te nemen of door aan de hand van de andere gegevens in die URL de ID ergens vandaan te toveren.
www.domein.nl/nieuws/1/mooie-naam-voor-je-artikel

Daar zit toch gewoon een 1 in die je kunt uitlezen als je alles naar index.php schrijft ;)

Als ik de TS was zou ik gewoon eens kijken naar een simpel framework als Silex of Laravel die dit soort dingen standaard al kunnen, scheelt je een hoop geklooi.

[ Voor 13% gewijzigd door Cartman! op 12-06-2015 21:20 ]


Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 10:04
Tja, om daar nou een heel frameworkl voor te kiezen ^^

Maar zoals ik al zei, je kan het wel in de pretty URL opnemen, maar dat is niet altijd wenselijk. Als je niet magische nummers er in wilt, zal je toch zoals ik al aangaf met andere zaken de content op moeten halen.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Een framework anno 2015 lijkt me zeer noodzakelijk.

Ik zie niet wat er mis is met ID's, sterker nog...voor dingen die kunnen veranderen van naam vind ik ze noodzakelijk zodat je bij een gewijzigde naam heel simpel naar de nieuwe url kunt wijzen zonder een geschiedenis bij te hoeven houden.

Een artikel "Titel" met url nieuws/1/titel terwijl het artikel nu "Titel Update" heet verwijs je naar nieuws/1/titel-update bijvoorbeeld :)

Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
en daar heb je dan gelijk een framework voor nodig?

Acties:
  • 0 Henk 'm!

  • n8n
  • Registratie: Juni 2007
  • Laatst online: 08-10 10:40

n8n

Cartman! schreef op zaterdag 13 juni 2015 @ 09:15:

Een artikel "Titel" met url nieuws/1/titel terwijl het artikel nu "Titel Update" heet verwijs je naar nieuws/1/titel-update bijvoorbeeld :)
Aanvullend: zorg dan dat de url nieuws/1/ werkt, en nieuws/1/abracadabra ook, check alleen op de id en verwijs dan door naar de juiste titel voor die mooie url. Zou ook nog zorgen dat domein.com/1 werkt, en domein.com/nieuws/1, domein.com/geennieuws/1 allemaal naar hetzelfde id verwijzen, zo kan je de content verplaatsen zonder je urls kapot te maken.

Voor een recent project heb ik zelf alleen een alfanumerieke hash gebruikt, het pad van een pagina wordt toch steeds vaker verborgen door browsers.

[ Voor 14% gewijzigd door n8n op 13-06-2015 10:32 ]


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
P.O. Box schreef op zaterdag 13 juni 2015 @ 10:15:
en daar heb je dan gelijk een framework voor nodig?
Waarom zou je het wiel opnieuw uitvinden en alle valkuilen in lopen die er zijn als een ander dat al voor je gedaan heeft?
n8n schreef op zaterdag 13 juni 2015 @ 10:29:
Aanvullend: zorg dan dat de url nieuws/1/ werkt, en nieuws/1/abracadabra ook, check alleen op de id en verwijs dan door naar de juiste titel voor die mooie url.
Dat bedoelde ik ja :)
Zou ook nog zorgen dat domein.com/1 werkt, en domein.com/nieuws/1, domein.com/geennieuws/1 allemaal naar hetzelfde id verwijzen, zo kan je de content verplaatsen zonder je urls kapot te maken.
Daar ben ik t niet helemaal mee eens..."domein.com/1" zegt niks en waarom zou iemand daar op terecht komen? Hou een url gewoon beschrijvend, net zo makkelijk.
Voor een recent project heb ik zelf alleen een alfanumerieke hash gebruikt, het pad van een pagina wordt toch steeds vaker verborgen door browsers.
Als die hash jouw unieke index is lijkt me dat een prima oplossing, als het iets representeert als een nieuwsartikel en intern verwijst naar een numeriek id dan zou ik dat een loze omweg vinden.

[ Voor 69% gewijzigd door Cartman! op 13-06-2015 10:59 ]


Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 10:04
Cartman! schreef op zaterdag 13 juni 2015 @ 10:55:
[...] Waarom zou je het wiel opnieuw uitvinden en alle valkuilen in lopen die er zijn als een ander dat al voor je gedaan heeft?[...]
Een framework gebruiken doe je niet voor 1 feature. Het ligt dus helemaal aan wat de TS verder van plan is of een framework wel zinnig of zelfs wenselijk is. Want je vergroot je codebase er ook mee en daarmee dus ook het aantal bugs en security issues.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Ik denk dat een framework altijd goed is bij PHP, in dit geval ook voor 1 feature. Hoeveel verschillende eigen brouwsels ik al niet gezien heb die volzitten met security leaks...oef :) Gezien de TS ook een database gebruikt is dat ook een feature die standaard wel in een framework zit en is dat ook meteen (als je de stappen volgt) veilig. Die codebase wordt groter maar als jij niet alles gebruikt hoeft dat niet perse een risico te zijn, daarnaast wordt die grote codebase goed getest en bekeken door meerdere personen, zo goed ga je dat in je eentje als beginnende ontwikkelaar nooit kunnen.

Acties:
  • 0 Henk 'm!

  • afraca
  • Registratie: April 2009
  • Laatst online: 13-08 16:46

afraca

Open Source!

Als je enkel routing gewoon leuk wilt aanpakken, dan kan je ook een losse 'router' nemen. Nikic, bekende ontwikkelaar van de php interpreter, heeft zelf een goede router gemaakt:

https://github.com/nikic/FastRoute

Gebruik is vrij eenvoudig:

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
<?php

require '/path/to/FastRoute/src/bootstrap.php';

$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) {
    $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0');
    $r->addRoute('GET', '/user/{id:[0-9]+}', 'handler1');
    $r->addRoute('GET', '/user/{name}', 'handler2');
});

$routeInfo = $dispatcher->dispatch($httpMethod, $uri);
switch ($routeInfo[0]) {
    case FastRoute\Dispatcher::NOT_FOUND:
        // ... 404 Not Found
        break;
    case FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
        $allowedMethods = $routeInfo[1];
        // ... 405 Method Not Allowed
        break;
    case FastRoute\Dispatcher::FOUND:
        $handler = $routeInfo[1];
        $vars = $routeInfo[2];
        // ... call $handler with $vars
        break;
}

IMDB vote history | Next-gen OS, audio en video player, search engine en Movie DB


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Pak de rest dan meteen ook leuk aan zou ik denken :)

Acties:
  • 0 Henk 'm!

Verwijderd

Caelorum schreef op zaterdag 06 juni 2015 @ 19:30:
Niet, tenzij je ze er allemaal in wilt zetten. Pas je pagina aan zodat je ook de naam kan meegeven en titel en rewrite dan /categorienaam/titelvanpost naar bijv. /?category=categorienaam&post=titelvanpost
Hoe gaat dat dan precies in zijn werk indien (nog) niet van alle categorieen en posts een SEO-naam is meegegeven? Check je dan voor het meegeven in je PHP of de SEO-naam niet NULL is en een lengte heeft, zo ja, dan geef je de naam mee en anders het id? En op de 'ophaalpagina' dan check je gewoon of de meegegeven category en post een integer zijn (dan is het een id) of wat anders, dan is het blijkbaar de naam. En dan doe je met 1 van die 2 de query om de rest van het product op te halen. Zoiets?

Acties:
  • 0 Henk 'm!

  • Firefly III
  • Registratie: Oktober 2001
  • Niet online

Firefly III

Bedrijfsaccount Firefly III
-

[ Voor 99% gewijzigd door Firefly III op 21-10-2019 09:58 . Reden: Leeg ivm privacy ]

Hulp nodig met Firefly III? ➡️ Gitter ➡️ GitHub ➡️ Mastodon


Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 10:04
Verwijderd schreef op donderdag 19 mei 2016 @ 10:24:
[...]
Hoe gaat dat dan precies in zijn werk indien (nog) niet van alle categorieen en posts een SEO-naam is meegegeven? Check je dan voor het meegeven in je PHP of de SEO-naam niet NULL is en een lengte heeft, zo ja, dan geef je de naam mee en anders het id? En op de 'ophaalpagina' dan check je gewoon of de meegegeven category en post een integer zijn (dan is het een id) of wat anders, dan is het blijkbaar de naam. En dan doe je met 1 van die 2 de query om de rest van het product op te halen. Zoiets?
Zoiets. Gewoon altijd de ID pakken tenzij die niet is meegegeven, dan kan je aan de hand van de categorie en titel de post opzoeken.
Maar eenvoudigste is nog steeds om gewoon altijd het ID mee te geven, zoals al eerder is aangegeven (maar dat was je vraag niet ^^)

Acties:
  • 0 Henk 'm!

Verwijderd

Caelorum schreef op donderdag 19 mei 2016 @ 10:38:
[...]

Zoiets. Gewoon altijd de ID pakken tenzij die niet is meegegeven, dan kan je aan de hand van de categorie en titel de post opzoeken.
Maar eenvoudigste is nog steeds om gewoon altijd het ID mee te geven, zoals al eerder is aangegeven (maar dat was je vraag niet ^^)
Aha okee. Ja, ik vond persoonlijk www.domein.nl/nieuws/1/mooie-naam-voor-je-artikel lelijker dan www.domein.nl/nieuws/mooie-naam-voor-je-artikel (dus zonder die 1), maar ik ben geloof ik al om. :)

Wat JCE ook zegt vandaag en Cartman eerder, dat is eigenlijk wel een stukje makkelijker ja. Gewoon altijd het id meegeven en als er een mooie SEO-naam ingevuld is, die er achter plakken, voor 'erbij'.

Acties:
  • 0 Henk 'm!

Verwijderd

Cartman! schreef op vrijdag 12 juni 2015 @ 21:18:
[...]
www.domein.nl/nieuws/1/mooie-naam-voor-je-artikel

Daar zit toch gewoon een 1 in die je kunt uitlezen als je alles naar index.php schrijft ;)
Nou, na ruim een jaar post ik hier dan maar eens - voor het archief :) - wat ik hiervoor in mijn eigen .htaccess heb gezet. Ik zet mijn regels er zelf dus allemaal los in, want ik hoef niet zo heel veel te rewriten.

code:
1
2
3
RewriteEngine On
RewriteRule ^nieuws/([^/]+)/$ nieuws.php?id=$1 [L]
RewriteRule ^nieuws/([^/]+)/([^/]+)$ nieuws.php?id=$1&slug=$2 [L]


Met deze 2 regels werkt het voor zowel 1 als 2 meegegeven variabelen. Als ik die 2 regels probeer te combineren, lukt het me niet. Maar dit werkt dus. Mocht het beter kunnen, dan hoor ik het graag. :)

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Verwijderd schreef op zondag 13 augustus 2017 @ 18:46:
Mocht het beter kunnen, dan hoor ik het graag. :)
Zoals alles rewriten naar 1 file en daar uitzoeken wat er moet gebeuren bijvoorbeeld zoals 2 jaar geleden al gezegd werd? ;)

Acties:
  • 0 Henk 'm!

Verwijderd

@Cartman! Ja, dat zou helemaal mooi zijn. Bedoel je dat bestand zoals @afraca zegt hier afraca in "Hoe vertel ik mod_rewrite wat de id's zijn uit MySQL?" in zijn post? Want daar begrijp ik niets van. :)

Stel, je hebt een site met de volgende soorten pagina's:
www.domein.nl/nieuws/1/mooie-naam-voor-je-nieuwsartikel
www.domein.nl/projecten/3/5/mooie-naam-voor-zeg-een-stad/mooie-naam-voor-je-project
www.domein.nl/assortiment/8/12/mooie-naam-voor-je-categorie/mooie-naam-voor-het-product
www.domein.nl/diensten/74/mooie-naam-voor-je-dienst

Hoe ziet dan dat ene bestand er dan ongeveer uit? Want als je bijvoorbeeld een index.php maakt met 4 soorten PHP redirects erin, is dat misschien niet echt handig qua performance of google indexering?

Of bedoel je dat je eigenlijk alle 4 de soorten pagina's combineert in 1 index.php pagina, gescheiden door een case of een if? Dan krijg je wel een lange pagina. :) Ik heb 10 jaar geleden wel eens zo gewerkt, dat heette toen de fusebox methode, als ik me het goed herinner.

[ Voor 82% gewijzigd door Verwijderd op 14-08-2017 01:41 ]


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Dat is je 2 jaar geleden ook uitgelegd, lees het nog eens door :)

[ Voor 5% gewijzigd door Cartman! op 14-08-2017 14:28 ]


Acties:
  • 0 Henk 'm!

  • afraca
  • Registratie: April 2009
  • Laatst online: 13-08 16:46

afraca

Open Source!

Heh, leuk zo'n notification, kom je nog eens in een topic van 2 jaar oud. Ik wil best m'n post en de werking nog even toelichten, want jouw verwachting (rewriten met htaccess) en mijn post zijn eigenlijk verschillende oplossingen.

Van url 'x' naar bepaalde actie 'y' komen doet men tegenwoordig niet zo vaak meer met het herschrijven van urls (Apache) voor je in PHP terechtkomt. Dat is moeilijk om te onderhouden, werkt anders dan PHP wat je zelf al kent en is ook niet altijd aan te passen.

De enige rewriting die bijvoorbeeld het framework Laravel tegenwoordig doen is zorgen dat index.php niet in url verschijnt:
https://github.com/larave...b9bef09f/public/.htaccess

In index.php starten ze dan hele framework op. Onderdeel van dat opstarten is het uitlezen van de 'routes'. Die beschrijven hoe een bepaald patroon in de url ( gebruikers/{id}/profiel ) naar een bepaalde methode van class moet.

Wat ik dus wou zeggen is, je kan zonder framework wel zo'n router-systeem gebruiken zoals die van Nikic, en het is vrij eenvoudig. Dus zonder .htaccess :
https://github.com/nikic/...38864215d/README.md#usage

Iets duidelijker?

IMDB vote history | Next-gen OS, audio en video player, search engine en Movie DB


Acties:
  • 0 Henk 'm!

Verwijderd

Cartman! schreef op maandag 14 augustus 2017 @ 07:59:
Dat is je 2 jaar geleden ook uitgelegd, lees het nog eens door :)
Ik had gisteren het hele topic natuurlijk nog eens doorgelezen. Maar ik zie nergens waar dit uitgelegd wordt, of het moet de tip zijn om een framework te gebruiken of op de post van afraca slaan? Wat ik heb opgevold is deze Caelorum in "Hoe vertel ik mod_rewrite wat de id's zijn uit MySQL?" en dat werkt goed.
Enne, ik ben ik niet de TS he? :) Ik zit er 'maar' ruim 1 jaar in. ;)

@afraca Ja, het is iets duidelijker, maar niet genoeg dat ik het snap. Als je dit ziet
code:
1
2
// Matches /user/foobar, but not /user/foo/bar
$r->addRoute('GET', '/user/{name}', 'handler');
dan zie ik dat /user/foobar voldoet maar ik zie niet wat de handler dan precies doet, of hoe of waar er naar de pagina wordt 'gesprongen' die de boel afhandelt die dan moet gebeuren.

Maar goed, via htaccess werkt het goed hier. Maar het is altijd interessant om nieuwe dingen te leren natuurlijk. :)
Pagina: 1