08. november 2005 - 19:59Der er
8 kommentarer og 1 løsning
Smart omskrivning af url - kan det lade sig gøre?
Jeg har følgende url som jeg gerne vil have omskrivet (via mod_rewrite). Jeg er ikke sikker på at dette kan lade sig gøre, så spørgsmålet går vel også lidt på det.
urls'ne viser 3 forskellige hints til titel "doom4"
Jeg ønsker at omskrive disse urls så de ikke fylder så meget. Mit problem ligger især i at jeg ikke vil have de lange id tal med i omskrivningen, men derimod omskrive id tallene til at de definerers på følgende måde:
www.domæne.com/ps2/doom4/hints-1.html - har nummer 1 fordi det er det første (altså laveste id) hint der er tilføjet.- Id "13120" www.domæne.com/ps2/doom4/hints-2.html - Id "22788" www.domæne.com/ps2/doom4/hints-3.html - Id "23405"
Jeg har intet problem med at omskrive urls'ne hvis der bruges id , feks;
For den nederste løsning burde dette kunne gøre det:
RewriteEngine on RewriteRule ^/(.*)/(.*)/(.*)-(.*).html /viewtitle.php?platform=$1&title=$2&type=$3&id=$4
Den første KAN godt lade sig gøre, men den vil kræve at du bygger noget kontrol ind i viewtitle.php der finder ud af hvilket id der er det rigtige. Udover dette er det dog det samme
bufferzone > tak, men gav mig ikke nogen umiddelbart løsning..
pidgeot > Jeg har ingen problemer med nederste løsning, det er nu mere den første løsning jeg er interesseret i :) Men du siger at det godt kan lade sig gøre, kan du eventuelt uddybe hvilken slags kontrol det er du omtaler?
Den går ud på at du i viewtitle.php foretager et opslag i din database, hvor du finder ud af hvilken post du skal have fat i.
Dette kunne gøres med en query som følgende (hvis vi bruger dit eksempel):
SELECT * FROM tabel WHERE platform='ps2' AND title='doom4' AND type='hints' ORDER BY id ASC LIMIT 2, 1
eller mere generelt:
SELECT * FROM tabel WHERE platform=$platform AND title=$title AND type=$type ORDER BY id ASC LIMIT ($id-1), 1
Denne foretages så i stedet for den query du normalt bruger til at hente data ud. (Husk dog at tilpasse til dine data, og kontroller for fejl hvis brugeren prøver at skrive et negativt id...)
Vær opmærksom på at du i din query skal trække X fra $id, hvor X er den laveste værdi $id må have - i dette tilfælde 1.
Ok, det lyder egentligt smart nok. $id er vel antallet af fundne hints. Kan jeg få antallet af fundne hints i samme sql sætning, så jeg slipper for at lave en query der først finder antallet af hints?
Du behøver ikke checke på antallet af hints så længe du kontrollerer at du får en række tilbage. Skulle der komme til at stå et id der er for stort, får du blot et tomt sæt, og hvis det er for småt (dvs. 0 eller under), vil MySQL smide en fejl.
Hvis du mente at det var til en optælling senere på siden, så vil det være pænest/mest praktisk at bruge en seperat query, da du ikke vil få et resultat hvis nu der er indtastet noget ugyldigt. Men ellers ville det kunne gøres sådan her:
SELECT (query ovenfor) UNION SELECT COUNT(*) FROM tabel WHERE (blablabla)
hvor den sidste række så vil indeholde antallet af fundne hints i $row[0] (her skal du så bruge mysql_fetch_array, og ikke mysql_fetch_assoc).
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.