Avatar billede discotk Nybegynder
22. februar 2010 - 18:22 Der er 8 kommentarer og
2 løsninger

mod_rewrite, doorway hallway og url simplificering

Hej eksperter!

Jeg har siddet og læst en masse artikler om hvordan man søge optimere ordentligt og doorway/hallway kommer op igen og igen..

Derfor er jeg nu gået igang med at ændre mine links så det bliver simplificeret.

Jeg har startet med at ændre min .htaccess fil så jeg nu kan skrive:

domain.com/read/15

istedet for

domain.com/read.php?id=15

Men jeg vil gerne gøre så det bliver til

domain.com/read/navn-paa-id

Det vil altså sige at istedet for at bruge id'et i tabellen, så bruge navnet istedet, i url'en...

Nogen der ved hvordan man gør dette på den rigtige måde?
Avatar billede danco Nybegynder
22. februar 2010 - 20:19 #1
Jeg tillader mig at smide en ubrugelig kommentar udelukkende for at overvåge.
Jeg sidder selv med samme problemstilling.
Avatar billede repox Seniormester
22. februar 2010 - 21:48 #2
Jeg forstår ikke problematikken?
Er det fordi du ikke kan finde ud af at lave domain.com/read.php?id=15 om til domain.com/read.php?name=navn-paa_id?
Avatar billede exp Juniormester
22. februar 2010 - 22:38 #3
I din tabel laver (finder) du en unik værdi, som du fx kalder "url". Bemærk, at den skal være unik for hver enkelt række i tabellen.

Herefter kalder du den i scriptet (index.php?url=unik-url), og bruger den i sql-udtrækket:
select * from `tabel` where `url` = $unik-url LIMIT 1

And you're up and running.

(Husk at have behørig sikkerhed koblet på, så du ikke risikerer sql-injections)
Avatar billede discotk Nybegynder
23. februar 2010 - 12:41 #4
#3, nu skriver du "Bemærk, at den skal være unik for hver enkelt række i tabellen."
- Jeg ved godt hvorfor, men hvordan får jeg den til at auto-generere dette?

EKS: Jeg har to af de samme sider (af en eller anden grund) - Skal jeg så lave en løkke der går alle mine sider igennem i databasen for at se at der er et match, og hvis der er, lave en if/else-funktion, for at den derfor kan kalde siden "side-navn2" eller lign?.

- det ville nemlig være smart hvis jeg bare kunne skrive følgende:

Navn: Side 1
Tekst: Lorem bla bla bla...
-> Submit

og så blev url'en automatisk til "domain.com/read/side-1", uden at man skal side selv og huske hvad man har kaldt sin url førhen.
Avatar billede skelboe Nybegynder
24. februar 2010 - 09:21 #5
er det så ikke bare noget at lave en

$uniq_url = strtolower( str_replace(' ', '-', $name) );

Det kan godt være du lave en preg_replace og fjerne uønskede karaktere
Avatar billede discotk Nybegynder
24. februar 2010 - 18:01 #6
Jo, det var ihvertfald det jeg havde tænkt mig... Men det løser vel ikke mit problem hvis jeg har en side jeg kalder samme navn.

altså...
Side 1 (nr 1) = domain.com/side-1

Side 1 (nr 2) = domain.com/side-1

skal istedet være f.eks...
Side 1 (nr 1) = domain.com/side-1

Side 1 (nr 2) = domain.com/side-1_2
Avatar billede skelboe Nybegynder
24. februar 2010 - 18:17 #7
Kunne man mån ikke gøre noget ala.

$uniq_url = 'side-1';

// checke om der er andre url der matcher
SELECT COUNT(*) AS url_count FROM table WHERE url REGEXP '$newurl[_0-9]' OR url = $uniq_url;

Jeg er ikke lige helt inde i REGEXP men ovenstående linie skulle gerne tælle hvis "side-1" eksistere, og hvis "side-1_1" osv. eksistere, og så er det bare at lægge til,

Hvis det giver mening
Avatar billede skelboe Nybegynder
24. februar 2010 - 18:19 #8
REGEXP '$newurl[_0-9]' skal vidst være REGEXP '$newurl[_0-9]+'
Avatar billede discotk Nybegynder
26. februar 2010 - 16:05 #9
Undskyld den sene tilbagemelding...

Jeg har kigget lidt på det og har lavet en lille "alpha kode"

<?php
// Bearbejd specielle tegn
function CleanFileName( $Raw ){
    $Raw = trim($Raw);
    $RemoveChars  = array( "([\40])" , "([^a-zæøåÅÀàÁáÂâÃãÄä&#256;&#257;&#258;&#259;&#260;&#261;&#506;&#507;&#508;&#509;&#262;&#263;Çç&#268;&#269;&#264;&#265;&#266;&#267;&#270;&#271;&#272;&#273;ÐðÈèÉé&#282;&#283;ÊêËë&#274;&#275;&#276;&#277;&#280;&#281;&#278;&#279;ƒ&#64258;&#290;&#291;&#284;&#285;&#286;&#287;&#288;&#289;ÌìÍíÎî&#296;&#297;Ïï&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#305;&#306;&#307;&#308;&#309;&#310;&#311;&#312;&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#323;&#324;&#325;&#326;&#327;&#328;Ññ&#329;&#330;&#331;ÒòÓóÔôÕõÖö&#332;&#333;&#334;&#335;&#336;&#337;&#510;&#511;Œœ&#340;&#341;&#342;&#343;&#344;&#345;&#346;&#347;&#350;&#351;Šš&#348;&#349;&#383;ß&#354;&#355;&#356;&#357;&#358;&#359;ÞþÙùÚúÛû&#360;&#361;Üü&#366;&#367;&#362;&#363;&#364;&#365;&#370;&#371;&#368;&#369;&#7808;&#7809;&#7810;&#7811;&#372;&#373;&#7812;&#7813;&#7922;&#7923;Ýý&#374;&#375;Ÿÿ&#377;&#378;Žž&#379;&#380;A-ZÆØÅ0-9-])", "(-{2,})", "/æ|Æ/", "/ø|Ø/", "/å|Å/", "/À|à|Á|á|Â|â|Ã|ã|Ä|ä|&#256;|&#257;|&#258;|&#259;|&#260;|&#261;|&#506;|&#507;|&#508;|&#509;/", "/&#262;|&#263;|Ç|ç|&#268;|&#269;|&#264;|&#265;|&#266;|&#267;/", "/&#270;|&#271;|&#272;|&#273;|Ð|ð/", "/È|è|É|é|&#282;|&#283;|Ê|ê|Ë|ë|&#274;|&#275;|&#276;|&#277;|&#280;|&#281;|&#278;|&#279;/", "/ƒ|&#64258;/", "/&#290;|&#291;|&#284;|&#285;|&#286;|&#287;|&#288;|&#289;/", "/Ì|ì|Í|í|Î|î|&#296;|&#297;|Ï|ï|&#298;|&#299;|&#300;|&#301;|&#302;|&#303;|&#304;|&#305;|&#306;|&#307;/", "/&#308;|&#309;/", "/&#310;|&#311;|&#312;/", "/&#313;|&#314;|&#315;|&#316;|&#317;|&#318;|&#319;|&#320;|&#321;|&#322;/", "/&#323;|&#324;|&#325;|&#326;|&#327;|&#328;|Ñ|ñ|&#329;|&#330;|&#331;/", "/Ò|ò|Ó|ó|Ô|ô|Õ|õ|Ö|ö|&#332;|&#333;|&#334;|&#335;|&#336;|&#337;|&#510;|&#511;|Œ|œ/", "/&#340;|&#341;|&#342;|&#343;|&#344;|&#345;/", "/&#346;|&#347;|&#350;|&#351;|Š|š|&#348;|&#349;|&#383;|ß/", "/&#354;|&#355;|&#356;|&#357;|&#358;|&#359;|Þ|þ/", "/Ù|ù|Ú|ú|Û|û|&#360;|&#361;|Ü|ü|&#366;|&#367;|&#362;|&#363;|&#364;|&#365;|&#370;|&#371;|&#368;|&#369;/", "/&#7808;|&#7809;|&#7810;|&#7811;|&#372;|&#373;|&#7812;|&#7813;/", "/&#7922;|&#7923;|Ý|ý|&#374;|&#375;|Ÿ|ÿ/", "/&#377;|&#378;|Ž|ž|&#379;|&#380;/");
    $ReplaceWith = array("-", "", "-", "ae", "oe", "aa", "a", "c", "d", "e", "f", "g", "i", "j", "k", "l", "n", "o", "r", "s", "t", "u", "w", "y", "z");
    return strtolower(preg_replace($RemoveChars, $ReplaceWith, $Raw));
}

$uniq_url = CleanFileName('!"@#$%&/{([)]=}? abcdefghijklmnopqrstuvwxyzæøå ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ ÀàÁáÂâÃãÄä&#256;&#257;&#258;&#259;&#260;&#261;&#506;&#507;&#508;&#509; &#262;&#263;Çç&#268;&#269;&#264;&#265;&#266;&#267; &#270;&#271;&#272;&#273;Ðð ÈèÉé&#282;&#283;ÊêËë&#274;&#275;&#276;&#277;&#280;&#281;&#278;&#279; ƒ&#64258; &#290;&#291;&#284;&#285;&#286;&#287;&#288;&#289; ÌìÍíÎî&#296;&#297;Ïï&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#305;&#306;&#307; &#308;&#309; &#310;&#311;&#312; &#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322; &#323;&#324;&#325;&#326;&#327;&#328;Ññ&#329;&#330;&#331; ÒòÓóÔôÕõÖö&#332;&#333;&#334;&#335;&#336;&#337;&#510;&#511;Œœ &#340;&#341;&#342;&#343;&#344;&#345; &#346;&#347;&#350;&#351;Šš&#348;&#349;&#383;ß &#354;&#355;&#356;&#357;&#358;&#359;Þþ ÙùÚúÛû&#360;&#361;Üü&#366;&#367;&#362;&#363;&#364;&#365;&#370;&#371;&#368;&#369; &#7808;&#7809;&#7810;&#7811;&#372;&#373;&#7812;&#7813; &#7922;&#7923;Ýý&#374;&#375;Ÿÿ &#377;&#378;Žž&#379;&#380;');

// Se om url matcher andre eksisterende
mysql_select_db($database_cms, $cms);
$query_rsUrl = "SELECT COUNT(*) AS url_count FROM sideindhold WHERE url REGEXP '($uniq_url)(_)([0-9]+)' OR url REGEXP '$uniq_url'";
$rsUrl = mysql_query($query_rsUrl, $cms) or die(mysql_error());
$row_rsUrl = mysql_fetch_array($rsUrl);

// Find højeste url
$query_rsUrl_highest = "SELECT * FROM sideindhold WHERE url REGEXP '($uniq_url)(_)([0-9]+)' ORDER BY url DESC LIMIT 1";
$rsUrl_highest = mysql_query($query_rsUrl_highest, $cms) or die(mysql_error());
$row_rsUrl_highest = mysql_fetch_array($rsUrl_highest);

// Hent kun nummeret på siden og læg en til
$uniq_number = trim($row_rsUrl_highest['url'], $uniq_url . "_")+1;
$var = ($row_rsUrl['url_count'] > 0) ? "INSERT INTO tabel url VALUES " . $uniq_url . "_" . $uniq_number:"INSERT INTO tabel url VALUES " . $uniq_url;
echo $var;

mysql_close($cms);
?>


Ændrer selvfølgelig så det passer ind i en form, ved at lave noget ala:

...
  $insertSQL = sprintf("INSERT INTO tabel(url) VALUES (%s)",
...

for at undgå injections

Tak for hjælpen.

exp og skelboe smid et svar
Avatar billede skelboe Nybegynder
26. februar 2010 - 16:49 #10
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester