Autor Zpráva
quatzael
Profil
Potřeboval bych vygenerovat nějaký unikátní kód, který ještě nikdy předtím nebyl vygenerován.

Jde mi o to, že potřebuju vygenerovat kód jako část URL, pod kterým najdu řádek v databázi s hodnotami, které potom odešlu pomocí POST na další stránku.

Nebo jinak řečeno: když si klient vyplní formulář a odešle ho, zobrazí se mu na další stránce nabídka, vygenerována na základě zadaných hodnot ve formuláři.

A chci, aby si uživatel následně mohl zkopírovat link, který se mu tam objeví a vede ke stejné nabídce.

Mám tedy dohromady 3 dotazy:
1. jak vygenerovat unikátní kód, který ještě nikdy vygenerován nebyl?
2. jak zpracovat URL, aby mi odkázala na konkrétní stránku?

ad.2: Jde totiž o to, že běžně se pro tyto účely používá URL ve tvaru: domena.cz/nabidka/f58r7e2w (kde f58r7e2w je ten unikátní kód).
Dokážu si to představit s proměnnou GET takto: domena.cz/nabidka/index.php?id=f58r7e2w
Jde ta první varianta udělat i bez .htaccess?

A která varianta se vám jeví vhodnější pro SEO/uživatele?

Díky za rady.
mimochodec
Profil
quatzael:
1. jak vygenerovat unikátní kód, který ještě nikdy vygenerován nebyl?

Předpokládám, že ty kódy máš v databázi. Vygeneruj vždy prostě náhodný kód, pak prověř, jestli je v databázi a toto dělej tak dlouho, dokud nevygeneruješ takový, který tam není. Při tom rozsahu znaků a té délce, kterou jsi naznačil, je málo pravděpodobné, že bys musel opakovat víc než jednou z desítek tisíc případů.
quatzael
Profil
mimochodec:
No tohle mě samozřejmě napadlo. Věřím pravděpodobnosti, takže nepředpokládám, že by vnikaly problémy s opakovaným duplicitním generováním, ale myslel jsem, že by existovalo vhodnější řešení..
Chro.
Profil
function getuniqid($length = 10)
{
$chars = array_merge(range(0, 9), range('a', 'z'));
$id = '';
for ($i = 0; $i < $length; $i++)
{
$id.= $chars[rand(0, 35)];
}
return $id;
}

echo getuniqid(8);
//m9ie64zd
Při délce unik. kódu 8 znaků je velice nepravděpodobné, že by se kdy během 100 let při použití funkce 100000 denně vygenerovaly dva stejné kódy.

URL domena.cz/nabidka/f58r7e2w bez úpravy htaccess by šla udělat tak, že kód bude název existující složky, v ní bude soubor index.php a v něm nějaký skript např. s přesměrováním.
quatzael
Profil
Chro.:
Při délce unik. kódu 8 znaků je velice nepravděpodobné, že by se kdy během 100 let při použití funkce 100000 denně vygenerovaly dva stejné kódy.
Supr, za těch xxx let až se to začne kousat se maximálně budu kvůli tomu obracet v hrobě..:o)

by šla udělat tak, že kód bude název existující složky
No, ale to znamená, že bych tam musel vytvořit xxx složek a v nich odpovídající počet souborů.. To nezní moc ok, když bude v jednom adresáři 10 tis. složek tak to načítání už zabere dost velký čas, ne?
mimochodec
Profil
Chro.:
Při délce unik. kódu 8 znaků je velice nepravděpodobné, že by se kdy během 100 let při použití funkce 100000 denně vygenerovaly dva stejné kódy.

Ta pravděpodobnost je 1:773, což mi připadá jako poměrně značné riziko. A to i když si to posunu o dva řády, což už se blíží reálným aplikacím.
Chci jen upozornit, že to, co jsem navrhoval já, toto riziko nemá. Psal jsem o pravděpodobnosti toho, že by se muselo generovat ještě jednou, což není vůbec žádný problém. Jediné skutečné riziko, které v tom mém postupu je, že dojde k vygenerování dvou stejných hesel dvěma lidem a následnému dotazu ještě předtím, než se to tomu druhému člověku vloží do databáze. A tam už bych si troufl říct, že toto riziko je dostatečně malé.

Tady jsem to někomu psal: Nasobeni stejneho cisla v php funkci/cyklu. A doporučoval bych přečíst i na mě navazujícího juriada, který radí nějaký sofistikovanější postup.
quatzael
Profil
mimochodec:
Ta pravděpodobnost je 1:773
Jak jsi to spočítal? Mě vyšlo 2.25 E12..
mimochodec
Profil
quatzael:
Tohle číslo jsem vydělil číslem 100*365*100000.
Chro.
Profil
Ta nepravděpodobnost kolize byla samozřejmě myšlena s nadsázkou - asi nebudeš generovat 100000x denně po dobu 100 let. Nevyvíjíš nové youtube...

Není to moc OK, ale ptal ses, jak to udělat bez úpravy v htaccess. Btw. já bych použil např.

domena.cz/nabidka/?m1e4fdf

což je ekvivalent

domena.cz/nabidka/index.php?m1e4fdf(dále nic nebo =hodnota)

a ten klíč resp. unik. kód bych si vytáhnul ve skriptu z pole GET.
list($id) = array_keys($_GET);
echo $id;
quatzael
Profil
mimochodec:
No realističtější předpoklady by asi vypadaly takto: 20*365*60000 a i to je hodně přetažený. Takhle to vychází na 1:5141.
Dan Charousek
Profil
Já bych místo té matematiky a spoléhání se na štěstinu, generování kódu obalil do do-while loopu a bylo by :).
<?php
do {
    $kod = genNewCode();
} while(codeExists($kod));
Taps
Profil
quatzael:
mrkni na http://jecas.cz/id-pismena
quatzael
Profil
Ok. Díky za rady.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: