Avatar billede reffo Nybegynder
31. marts 2012 - 15:49 Der er 16 kommentarer og
1 løsning

Tilføj et nummer til url hvis denne ikke er unik

Hej eksperter.

Jeg opretter mine sider i en database, og systemet står selv for at oprette links osv.

Der opstår dog et lille problem, når jeg opretter to sider med samme titel (linket er nemlig titlen i lowercase med bindestreg i stedet for mellemrum)

Hvordan kan jeg tilføje et tal efter linket, så der ikke er to ens links i databasen?

Så hvis jeg opretter flere sider med samme titel kommer linkene til at se således ud

info-om-alt
info-om-alt-2
info-om-alt-3

Håber i kan hjælpe.
Avatar billede olebole Juniormester
31. marts 2012 - 16:00 #1
<ole>

Du begynder med at gøre titelfeltet unikt. Når du sætter siden ind i DB'en tjekker du, om du får en fejl 1062. Gør du det, sætter du et tal efter:

$sql = 'INSERT INTO `my_table` ....';
mysql_query($sql);
if (mysql_errno()==1062) {
    $title = $title.'-'.3;
}

Det er ikke den kønneste løsning, men den kan fungere. Du burde nok indrette dit system, så det 'er klar over', du er ved at skrive på en side, som er del af en serie

/mvh
</bole>
Avatar billede reffo Nybegynder
31. marts 2012 - 16:07 #2
Tak for dit svar.

Hvordan finder jeg ud af hvilket tal jeg skal sætte efter?

I tilfældet af at der allerede er to sider, der har samme titel.
Avatar billede olebole Juniormester
31. marts 2012 - 16:18 #3
Du er nødt til at kalde databasen og tjekke for, om der er sider med samme navn og et tal. I min optik er udganspunktet som sagt forkert, og den løsning, du eftersøger, er bare lapperier
Avatar billede reffo Nybegynder
31. marts 2012 - 16:21 #4
Hvordan ville du så gøre det fra starten af?

Det er ikke sider som er del af en serie. Det er bare blog-posts-lignende sider, så overtiden kunne der godt opstå to titler, der hedder det samme.
Avatar billede olsensweb.dk Ekspert
31. marts 2012 - 16:32 #5
>Det er bare blog-posts-lignende sider,
men har hver post/indlæg ikke en id ??
du skal ikke referrer til postens overskrift, men til dens id (internt), men bare vise overskriften til brugeren
Avatar billede reffo Nybegynder
31. marts 2012 - 16:34 #6
Hvordan ville du gøre det? Jeg bruger titlen i url'en.
Avatar billede olebole Juniormester
31. marts 2012 - 16:51 #7
"Det er bare blog-posts-lignende sider, så overtiden kunne der godt opstå to titler, der hedder det samme".

Så må du sørge for, det ikke sker. Hvis du gør titelfeltet unikt, og du får en fejl 1062 ved forsøg på indsætning, vælger du bare et andet navn ... simple as that  =)
Avatar billede olsensweb.dk Ekspert
31. marts 2012 - 16:52 #8
jeg ville sende både id og indlægs tittel med over, noget ala
$param="id=42&title=tittel på indlæg";
"inlaeg.php?".urlencode($param);
når du nu vil have titlen med over.

så dette indlæg er et child til indlæg med id 42, jeg ville slet ikke bruge titlen til noget
Avatar billede reffo Nybegynder
31. marts 2012 - 16:53 #9
Muligheden for at oprette to sider med samme titel skal være der. Så den løsning dur desværre ikke.
Avatar billede reffo Nybegynder
31. marts 2012 - 16:58 #10
Jeg bruger .htaccess til at omskrive linkene. For at få pænere urls.

Et link til en side ser derfor sådan her ud

www.domæne.dk/info-om-alt

det tolkes som

www.domæne.dk/index.php?link=info-om-alt

Derfor skal titlen med.
Avatar billede olebole Juniormester
31. marts 2012 - 17:48 #11
Hvis ingen forbedringer er mulige, har du vel fået svaret  =)
Avatar billede reffo Nybegynder
31. marts 2012 - 18:11 #12
Jeg har fået lavet denne kode der gør det jeg ønsker, så nu vil jeg bare høre om det samme kan gøres på en bedre måde. Er der nogle steder hvor det kan optimeres?

//CHECK LINK
        $sql = "SELECT * FROM `content` WHERE `link`='" . $link . "'";
       
        $query = mysql_query("$sql") OR DIE (mysql_error());
       
        IF    (mysql_num_rows($query) != '0')
       
                {
           
            $addNum = '1';
               
            $sql = "SELECT * FROM `content` WHERE `link` REGEXP '" . $link . "-[0-9]*'";
               
            $query = mysql_query("$sql");
           
            WHILE    ($check = mysql_fetch_array($query))
           
                    {
                   
                $numCheck = substr(strrchr($check['link'], '-'),1);
               
                IF    ($numCheck >= $addNum)
               
                        {
                       
                    $addNum = $numCheck + 1;
                       
                        }
                   
                    }
               
            $link .= '-' . $addNum;
               
                }

Tak for hjælpen.
Avatar billede olebole Juniormester
31. marts 2012 - 18:29 #13
Generelt bør du kikke på prepared statements i stedet for det gamle MySQL-API.

Dernæst ville jeg stadig lave en anden struktur, hvor siderne kan have undersider/versioner. At sider har samme navn, giver kun god mening, hvis de hænger naturligt sammen i en eller anden form for serie.

Du kan godt gøre, som du gør. Jeg synes bare ikke, det er en særlig elegant løsning  =)
Avatar billede reffo Nybegynder
31. marts 2012 - 18:54 #14
Ok. Tak for hjælpen.

Dette script er også kun til for, at der ikke skal ske en fejl på siden, hvis man laver to sider med samme titel. Som udgangspunkt vil det slet ikke forekomme. Det er bare mere brugervenligt i mine øjne.

Tak for linket. Det må jeg jo lige få opdateret til med det samme.

Vil du smide et svar?
Avatar billede olebole Juniormester
31. marts 2012 - 18:56 #15
Ellers tak, jeg samler ikke point. Spørg ronols  =)
Avatar billede olsensweb.dk Ekspert
31. marts 2012 - 19:01 #16
springer også over
Avatar billede reffo Nybegynder
31. marts 2012 - 19:03 #17
Det er ok.
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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