NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: URl název titulku

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Michal Kuba
Tvůrce
Avatar
Michal Kuba:2.9.2015 11:15

Ahoj
Rozšířil jsem tabulku v db o sloupec "url", tedy url adresa každého inzerátu. Mám funkci, která by měla text titulku převést do potřebné url podoby:

 public function upravTitulek($titulek){
            static $convertTable = array (
        'á' => 'a', 'Á' => 'A', 'ä' => 'a', 'Ä' => 'A', 'č' => 'c',
        'Č' => 'C', 'ď' => 'd', 'Ď' => 'D', 'é' => 'e', 'É' => 'E',
        'ě' => 'e', 'Ě' => 'E', 'ë' => 'e', 'Ë' => 'E', 'í' => 'i',
        'Í' => 'I', 'ï' => 'i', 'Ï' => 'I', 'ľ' => 'l', 'Ľ' => 'L',
        'ĺ' => 'l', 'Ĺ' => 'L', 'ň' => 'n', 'Ň' => 'N', 'ń' => 'n',
        'Ń' => 'N', 'ó' => 'o', 'Ó' => 'O', 'ö' => 'o', 'Ö' => 'O',
        'ř' => 'r', 'Ř' => 'R', 'ŕ' => 'r', 'Ŕ' => 'R', 'š' => 's',
        'Š' => 'S', 'ś' => 's', 'Ś' => 'S', 'ť' => 't', 'Ť' => 'T',
        'ú' => 'u', 'Ú' => 'U', 'ů' => 'u', 'Ů' => 'U', 'ü' => 'u',
        'Ü' => 'U', 'ý' => 'y', 'Ý' => 'Y', 'ÿ' => 'y', 'Ÿ' => 'Y',
        'ž' => 'z', 'Ž' => 'Z', 'ź' => 'z', 'Ź' => 'Z',
    );
    $titulek = strtolower(strtr($titulek, $convertTable));
    $titulek = preg_replace('/[^a-zA-Z0-9]+/u', '-', $titulek);
    $titulek = str_replace('--', '-', $titulek);
    $titulek = trim($titulek, '-');
    return $titulek;
}

To by bylo hezký, ale chci za každý takový řetězec přidat ještě ID inzerátu, aby se v případě dvou totožných inzerátů dalo rozlišit který je který. Narážím opět na problém, že když se ID vytvoří až po vytvoření řádku se všemi informacemi, nemám jak toto číslo přidat za řetězec URL.

takto se zpracovává uložení inzerátu:

if ($_POST)
                {

           $_SESSION['inzerat']= $inzerat = array(
                                        'ID' => $_POST["ID"],
                        'titulek' => $_POST['titulek'],
               'url' => $url,
                        'text' => $_POST["text"],
                        'kategorie' => $_POST["kategorie"],
                        'upresneni' => $_POST['upresneni_' . $_POST['kategorie']],
                        'mesto' => $_POST["mesto"],
                         'autor' => $_SESSION['uzivatel']['login']);
            if(empty( $_SESSION['inzerat']['titulek'])){
                $this->pridejZpravu('Vyplňte titulek inzerátu!');

            }
           else if(empty( $_SESSION['inzerat']['text'])){
                $this->pridejZpravu('Vyplňte text inzerátu!');

            }
            else if(empty( $_SESSION['inzerat']['upresneni'])){
                $this->pridejZpravu('Vyplňte kategorii inzerátu!');

            }
            else if(empty( $_SESSION['inzerat']['mesto'])){
                $this->pridejZpravu('Vyplňte město!');

                }

             else if(! $_SESSION['inzerat']['ID']){


                    $klice = array( 'titulek','url' ,'text', 'kategorie', 'upresneni', 'mesto', 'autor');
                        $inzerat = array_intersect_key($inzerat, array_flip($klice));
// Uložení článku do DB
                        $spravceInzeratu->ulozInzerat($_SESSION['inzerat']['ID'], $inzerat);
                        $this->pridejZpravu('Inzerát byl úspěšně uložen.');
                        $this->presmeruj('nejnovejsi');
                }
                else if($_SESSION['inzerat']['ID']){
                    $klice = array( 'titulek','url' ,'text', 'kategorie', 'upresneni', 'mesto', 'autor');
                        $inzerat = array_intersect_key($inzerat, array_flip($klice));
// Uložení článku do DB
                        $spravceInzeratu->ulozInzerat($_SESSION['inzerat']['ID'], $inzerat);

                        $this->pridejZpravu('Inzerát byl úspěšně upraven.');
                        $this->presmeruj('nejnovejsi');
                }


                }

Mám to ještě nějak do kódu vecpat nebo bude lepší, když to tam nějak přidám dodatečně?

 
Odpovědět
2.9.2015 11:15
Avatar
Odpovídá na Michal Kuba
Patrik Valkovič:2.9.2015 11:31

Co takhle použít urlencode?
http://php.net/…rlencode.php
myslím, že je to bezpečnější, než mít explicitně určené znaky.
Jinak proč bys do url přidával zároveň i ID? ID musíš mít přeci uložené již v jiném sloupci, takže při generování odkazu budeš brát data z url a ID a spojíš je za sebe, stejně tak budeš vyhledávat.
Duplicitní informace by se v databázi vyskytovat neměli.

Nahoru Odpovědět
2.9.2015 11:31
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Patrik Valkovič
Michal Kuba:2.9.2015 12:26

Máš pravdu, to připojím až potom asi zvlášť :)

Ale urlencode ukládá nějaké takovéto nesmysl (n%C4%9Bjak%C­3%BD+titulek) - původné titulek který se předělal byl "nějaký titulek".. asi zůstanu u toho svého "editoru" url a připojím nějak ID :)

 
Nahoru Odpovědět
2.9.2015 12:26
Avatar
Odpovídá na Michal Kuba
Uživatel sítě :2.9.2015 12:51

Vytvoř rovnou seo url (Takže i nový sloupec) při ukládání do db a přiřaď id k ní, pokud se najde duplicitní hodnota.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
2.9.2015 12:51
Chybami se člověk učí, běžte se učit jinam!
Avatar
Odpovídá na Patrik Valkovič
Uživatel sítě :2.9.2015 12:54

Duplicitní informace by se v databázi vyskytovat neměli.

Jak v kterých případech, u článků, inzerátů či novinek v tom nevidím problém.

Nahoru Odpovědět
2.9.2015 12:54
Chybami se člověk učí, běžte se učit jinam!
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Uživatel sítě
Michal Kuba:2.9.2015 13:35

Tak zatím vytvářím URL přímo z titulku a jako odkaz k detailu je inzerat/url titulek/id inzerátu

To už dokáží vyhledávače najít ne, pokud je třeba adresa inzeraty/prodam-automobil-skoda/345 ?

Tak jsi myslel sloupec v db? Mám navíc sloupec url

 
Nahoru Odpovědět
2.9.2015 13:35
Avatar
Nahoru Odpovědět
2.9.2015 13:59
Neaktivní uživatelský účet
Avatar
Odpovídá na Michal Kuba
Uživatel sítě :2.9.2015 14:55

Provedl bych to tak, jak se to většinou dělá. Při vytvoření inzerátu si rovnou vygeneruj url přes tvoji funkci, přes které se bude na ten inzerát chodit. Zároveň zkontroluj zda se již nenachází v DB a pokud ano, přiřadíš aktuální přiřazené id, třeba.

inzeraty/prodam-automobil-skoda/345

Nahraď tímto:

inzeraty/prodam-automobil-skoda
inzeraty/prodam-automobil-skoda-345 či inzeraty/345-prodam-automobil-skoda//Druhý inzerát se stejným titulkem

Edit: Použij aktuální sloupec na url, který máš určený, myslel jsem, že máš url z id. Btw: Vyhledávači je v podstatě jedno jaké máš url.

Editováno 2.9.2015 14:57
Nahoru Odpovědět
2.9.2015 14:55
Chybami se člověk učí, běžte se učit jinam!
Avatar
Neaktivní uživatel:2.9.2015 15:45

Já to mam tak, že hledám pomoci url & ID, takže url vypadá nějak takhle: "titulek-inzeratu/2653"

Nahoru Odpovědět
2.9.2015 15:45
Neaktivní uživatelský účet
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Michal Kuba:2.9.2015 16:10

Zatím to taky tak mam ale bylo mi řečeno, že z pohledu SEO je to celé špatně, takže budu rovnou inzerátu přidávat id za pomlcku za poslední slovo..

 
Nahoru Odpovědět
2.9.2015 16:10
Avatar
Nahoru Odpovědět
2.9.2015 16:13
Chybami se člověk učí, běžte se učit jinam!
Avatar
Odpovídá na Michal Kuba
Neaktivní uživatel:2.9.2015 17:50

Co je na tom špatně? Jaký je rozdíl mezi "titulek-inzeratu/111" a "titulek-inzeratu-111" ? :D, však to je jedno a to samé, jen mi první varianta, připadá přehlednější, nebo mi něco uniklo?

Editováno 2.9.2015 17:52
Nahoru Odpovědět
2.9.2015 17:50
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Uživatel sítě :2.9.2015 18:06

Řekl bych, že v podstatě nic. Na SEO by to nemělo mít žádný vliv.
Jde spíže o uživatelský dojem, zapamatování, apod..

To lomítko mi říká něco ve smyslu 'Hele další sekce/akce či stránka'.

Nahoru Odpovědět
2.9.2015 18:06
Chybami se člověk učí, běžte se učit jinam!
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Michal Kuba:2.9.2015 18:12

Z hlediska SEA to je patrně rozdíl, i když si taky myslím, že za tím lomítkem bych to nechat mohl.. Ještě bych měl prý i oddělat "inzerat", takže adresa nebude "inzerat/automobil-na-prodej/234" ale "automobil-na-prodel-135".. nevím jaký je tam rozdíl, ani ted nevím přesně, jak odstranit to inzerat - protože tak se jmenuje poled a Kontroler, který načítá ten detail.. Tím slovem inzerát volám Kontroler a jeho pohled na výpis inzerátu, snad to půjde vynechat..

 
Nahoru Odpovědět
2.9.2015 18:12
Avatar
Odpovídá na Michal Kuba
Neaktivní uživatel:2.9.2015 18:20

Taky tam mám "inzerát", když ho oddělám, tak mi to vola úplně jiný controller, proto se s tím nepatlám, nevidím v tom žádný problém.

PS: SEO ti nepřivede lidi na web, takže radši propaguj, místo řešení jak oddělat "inzerát", atd ..

Editováno 2.9.2015 18:23
Nahoru Odpovědět
2.9.2015 18:20
Neaktivní uživatelský účet
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Michal Kuba:2.9.2015 18:25

Jde o to že jsem našel zájemce o koupi systému až ho dodělám a on to úplně nechce, ale asi ho přesvědčím :)

Btw. jakou máš ty inzreci? link?

 
Nahoru Odpovědět
2.9.2015 18:25
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Michal Kuba:2.9.2015 22:27

Použil jsem uniqID, ale jak to přesně funguje? Nemůže to náhodou vygenerovat stejnou ID a ještě větší náhodou u inzerátu s naprosto stejným titulkem? :-O

 
Nahoru Odpovědět
2.9.2015 22:27
Avatar
Odpovídá na Michal Kuba
Neaktivní uživatel:2.9.2015 23:01

Nevím jak přesně funguje, každopádně se zkus podívat na URL tohoto vlákna - odpověď na tvou otázku: Doufám, že ne :D

Editováno 2.9.2015 23:02
Nahoru Odpovědět
2.9.2015 23:01
Neaktivní uživatelský účet
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Michal Kuba:2.9.2015 23:04

Tak jsem musel uniqid oddělat, člověk, který bude ode mě odkupovat hotový systém nechce, aby v url za upraveným titulkem byl takovýto kod, ale skutečné ID.

Jen se zeptám, když při odeslání formuláře zjistím ID posledního záznamu, přičtu jedničku a připojím k řetězci, nemělo by se nikdy stát, že některý inzerát bude mít v URL uložené jiné ID. Je malá šance, že dva lidé na dvou PC ve stejný zlomek vteřiny podají inzerát a oba titulky budou mít přiřazené umělé ID v URL, ale číslo ve sloupci ID bude vždy správné a unikátní..

 
Nahoru Odpovědět
2.9.2015 23:04
Avatar
Odpovídá na Michal Kuba
Uživatel sítě :2.9.2015 23:22

Co používáš za ovladač? V PDO je na to funkce (lastInsertId).

Nahoru Odpovědět
2.9.2015 23:22
Chybami se člověk učí, běžte se učit jinam!
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Uživatel sítě
Michal Kuba:2.9.2015 23:39

Ovladač? Funguje to na MVC, který jsem se učil na zdejších tutoriálech, ale je to upraveno pro moje potřeby. Ve správci inzerátu vybírám z DB největší ID, pouze jedno, to pak v kontroleru zvětším o jedna a připojím to k řetězci, který je upravený titulek do formy URL. Funguje to zatím dobře, mělo by to stačit :-)

 
Nahoru Odpovědět
2.9.2015 23:39
Avatar
Odpovídá na Michal Kuba
Uživatel sítě :3.9.2015 10:01

Pokud používáš zdejší DB wrapper tak to je PDO.

Pokud ti stav aplikace vyhovuje tak to je v podstatě jedno, hlavně, že to funguje.
Avšak, je lepší tyto věci nechat na té funkci, která je k tomu určená.. :)

Min. ušetříš 1 dotaz.

Nahoru Odpovědět
3.9.2015 10:01
Chybami se člověk učí, běžte se učit jinam!
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Uživatel sítě
Michal Kuba:3.9.2015 10:04

Právě že mi to dává špatné ID do řetězce, pokud předcházející jeden nebo více inzerátů vymažu. Databáze používá AI, takže když nějaké záznamy vymažu, použije prostě další ID a ne to co by mělo následovat. Ale když ukládám takhle "první" inzerát za vymazané, za takovou "mezeru", tak to vezme ID posledního inzerátu v databázi a zvětší o jedna a pak nesedí v jednom záznamu číslo v ID a na konci URL.. Je to spíš matoucí pro uživatele, systém to koneckonců pak tahá jen podle tvaru URL a to číslo tam je aby se nenašly dva uplně totožné inzeráty se stejným titulkem..

 
Nahoru Odpovědět
3.9.2015 10:04
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 23 zpráv z 23.