NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s podporou uplatnění od 0 Kč. Více informací.

Diskuze: funkcia uniqid()

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

Aktivity
Avatar
DREAMDEV
Člen
Avatar
DREAMDEV:8.7.2016 19:18

zdravim na jednom starom projekte vyuzivam funkciu uniqid() na generovanie idcka pre databazu a chcem sa spytat ci sa mam niecoho bat alebo nie lebo som cital ze nieje zrovnä najvhodnejsie ju pouzivat :) dakujem

 
Odpovědět
8.7.2016 19:18
Avatar
Odpovídá na DREAMDEV
Martin Konečný (pavelco1998):8.7.2016 19:26

proč na ID nepoužíváš AI (auto increment)?

Nahoru Odpovědět
8.7.2016 19:26
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
DREAMDEV
Člen
Avatar
DREAMDEV:8.7.2016 19:48

vravim je to starsi projekt z cias ked som sa este len ucil (stale sa ucim) :)

 
Nahoru Odpovědět
8.7.2016 19:48
Avatar
Odpovídá na DREAMDEV
Dominik Gavrecký:8.7.2016 19:52

My to chápeme a preto ti poradil... Ide o to že prečo to hádzať do PHP keď DB si to vie ošetriť sama, stačí ak pri vytvorení tabuľky zaškrtneš políčko A_I potom sa ti určite nestane že budú existovať dve rovnaké idčka...

Nahoru Odpovědět
8.7.2016 19:52
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
DREAMDEV
Člen
Avatar
DREAMDEV:8.7.2016 20:05

to uz ale viem ale ten projekt je celkom rozsiahli a nerad by som ho prerabal ak netreba preto moja otazka je ci je to dostatocne bezpecne s tym uniqid() otazka bola na bezpecnost tejto funkcie nie ako sa to ma robit ale aj tak som vdacny za odpovede :) ale mozete mi prosim odpovedat na moju otazku? :)

 
Nahoru Odpovědět
8.7.2016 20:05
Avatar
Nahoru Odpovědět
8.7.2016 20:22
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
DREAMDEV
Člen
Avatar
DREAMDEV:8.7.2016 20:24

dobre :P googlit viem aj ja lenze neviem 100% po anglicky a vzdy mi z programatorskeho navodu vynde recept na jablkovi kolac :D takze nejake zhrnutie v slovencine cestine? :P

 
Nahoru Odpovědět
8.7.2016 20:24
Avatar
Jan Barášek
Tvůrce
Avatar
Odpovídá na DREAMDEV
Jan Barášek:9.7.2016 20:26

Pokud chceš nějakou finální odpověď, tak funkce uniqid() je pro generování unikátního ID naprosto nevhodná, což platí i pro jakoukoli jinou funkci.

Toto je záležitost databáze.

Pokud máš starší tabulky, tak si stáhni třeba nástroj Adminer (je kompletně v češtině i slovenštině), který umí zpětně všem záznamům AI dopočítat a přidělit (při změně tabulky). Není to složité a zároveň to umožní dělat různé databázové fígle, třeba navázat mezi tabulkami relace a podobně.

Nahoru Odpovědět
9.7.2016 20:26
Chci naučit počítače přemýšlet a změnit tak svět vyhledávání.
Avatar
DREAMDEV
Člen
Avatar
Odpovídá na Jan Barášek
DREAMDEV:9.7.2016 20:34

jop ale proc je nevhodna? citma ze sa to generuje podla timestampu ale ak bude cas nastaveny spravne tak by to malo byt v pohode? pokial sa neprestavi napr dozadu... alebo?

 
Nahoru Odpovědět
9.7.2016 20:34
Avatar
Jan Barášek
Tvůrce
Avatar
Odpovídá na DREAMDEV
Jan Barášek:9.7.2016 20:42

A co když v jeden okamžik přijde více požadavků na generování ID? V takovém případě se může stát, že vznikne duplicita a ID už nebude unikátní.

Myslíš si, že se to stát nemůže? Cha... stačí, aby na stránku přišel nějaký rychlý robot, co pošle více requestů najednou (což může mimochodem udělat i Google) a hned ti duplicita vznikne.

Síla databází je právě v tzv. bufferování, kdy se jednotlivé požadavky správně řadí a ID se negeneruje na základě času nebo nějaké náhody, ale na základě předchozího - což má mnoho výhod, třeba tu, že lze jednotlivá ID od sebe deterministicky odvodit a ihned poznat, které bude následující.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
9.7.2016 20:42
Chci naučit počítače přemýšlet a změnit tak svět vyhledávání.
Avatar
DREAMDEV
Člen
Avatar
Odpovídá na Jan Barášek
DREAMDEV:9.7.2016 20:47

stranka je privatna bez pristupu z vonku, je to taky kalkulator a vypocty sa na nom budu robit mozno raz za den takze nejake dalsie problemi co by sa mohli vyskytnut?

 
Nahoru Odpovědět
9.7.2016 20:47
Avatar
Jan Barášek
Tvůrce
Avatar
Odpovídá na DREAMDEV
Jan Barášek:9.7.2016 21:13

Psal jsi, že se věci ještě učíš.

Pokud se chceš věci učit správně, tak se budeš muset smířit s tím, že právě použití AI je nejlepší způsob, jak ID generovat a všechno ostatní je (většinou) špatně.

Funkce uniqid() je přežitek z doby, kdy se ještě ukládalo do textových souborů.

Pokud chceš programovat správně, tak bys měl AI použít. Všechno ostatní je špatně (a určitě mi dá většina lidí za pravdu). Tečka.

Nahoru Odpovědět
9.7.2016 21:13
Chci naučit počítače přemýšlet a změnit tak svět vyhledávání.
Avatar
DREAMDEV
Člen
Avatar
DREAMDEV:9.7.2016 22:10

opakujem ze ide o zastarali projekt ktory nemam cas prerabat pokial to nieje naozaj nutne je to stara vec v dalsich projektoch uz pouzivam AI ale jednoducho nechcem stracat cas tam kde nemusim ale myslim ze uz mam dostatocnu odpoved aj ked vecsinu odpovedi obchadza moju otazku dakujem vam krasne za diskusiu ;)

 
Nahoru Odpovědět
9.7.2016 22:10
Avatar
Odpovídá na DREAMDEV
Dominik Gavrecký:9.7.2016 22:15

Áno musíš ... Debilna odpoved na debilnu otázku

Nahoru Odpovědět
9.7.2016 22:15
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
DREAMDEV
Člen
Avatar
Odpovídá na Dominik Gavrecký
DREAMDEV:9.7.2016 22:59

keby som to aj nechcel prerabat ale pytam sa na to PRECO JE TO NEBEZPECNE keby som chcel vediet ako sa to ma robit spravne spytam sa AKO SA TO MA ROBIT SPRAVNE ale chcem vediet PRECO JE TO NEBEZPECNE mozem sa snad spytat to co chcem vediet samozrejme prijmam vase rady a som za to vdacny ale to mi staci napisat raz ze mam pouzivat AI ja to s toho jedneho razu pochopim a to ze je debilna otazka svedci o mne ale debilna odpoved to je uz nie moja vypoved pardon za vyrazi nechcem viest diskusiu tymto smerom len nechapem preco ked sa spytam:
PRECO JE TO NEBEZPECNE

dostanem odpovede:

  • proč na ID nepoužíváš AI (auto increment)?
  • Ide o to že prečo to hádzať do PHP keď DB si to vie ošetriť sama?
  • funkce uniqid() je pro generování unikátního ID naprosto nevhodná, což platí i pro jakoukoli jinou funkci.

zda sa snad niekomu ze je tam niekde ODPOVED NA MOJU OTAZKU?

tymto uz ale uzatvaram diskusiu pretoze Jan Barášek mi poskytul dufam dostacujucu odpoved za co som mu velmi vdacny :) posledny prispevok Dominika Gavreckého povazujem za absolutne nevhodny :)

 
Nahoru Odpovědět
9.7.2016 22:59
Avatar
Jan Barášek
Tvůrce
Avatar
Jan Barášek:10.7.2016 0:08

Proč je to nebezpečné? To jsem už psal - protože existuje možnost, že může vzniknout duplicita v místě, kde vzniknout nesmí?

A že se to nestane? Zatím možná ne, ale je dobré se na to připravit.

Nahoru Odpovědět
10.7.2016 0:08
Chci naučit počítače přemýšlet a změnit tak svět vyhledávání.
Avatar
katrincsak
Člen
Avatar
Odpovídá na DREAMDEV
katrincsak:12.7.2016 15:45

Některé lidi hold nemají zkušenost s úpravou staršího webu a některé změny mnohdy může způsobit více problému než užitku. Osobně pracuji pro web, který je zde cca 12 let a má návštěvnost cca 10 tisíc lidí denně a moc dobře vím, jak je těžké provést nějakou změnu. Obzvláště, když se web skládá skoro ze stovek souborů a různě propletené a spousta věcí se již používá a nepoužívá.. Naštěstí web již přepisuji.. To jen k trochu zamyšlení, že i dnes nemá tak jednoduché řešení jak se může zdát.

  • Doporučil bych vyhledat vstupy a upravit automatický zápis ID a tabulku/sloupec updatnout na auto_increment .
  • Jan Barášek ti krásně odepsal, sice až po xx psaní. Pakliže ti v řádově milisekund přijde několik požadavků, tak skutečně se může stát, že dojde k duplicitě..

Náhradní řešení je se dotazovat na poslední ID v DB a podle něj přiřadit další. Je to sice o něco malinko náročnější, ale řešení to má.

Nebo mě napadá tvoje řešení s tím, že si hoď podmínku v případě chyby dotaz zopakovat a nebo si udělej nějaký log ve kterém případně můžeš vidět, kdy se vyskytla chyba a dle toho pak hledat jiné řešení.

Editováno 12.7.2016 15:46
 
Nahoru Odpovědět
12.7.2016 15:45
Avatar
shaman
Člen
Avatar
Odpovídá na DREAMDEV
shaman:14.7.2016 10:14

Ako ti uz spominali, uniqid je nie prave najbezpecnejsie a v extremnych pripadoch moze nastat duplicita id. Algoritmus je uz dost zastaraly a nie velmi rozsiritelny. Samozrejme v pripade ze ukladas data do DB tak je najvhodnejsie pouzivat policko id s AI a indexom. Vsimol som si ze vsetci ti tlacia len autoincrement v sql datatabaze. Nikto ale nenavrhol alternativu k uniqid, teda nieco ine co by ti pomohlo generovat unikatne id v pripade ze nemas pristup k DB.

Ako teda generovat unikatne id bez DB?

Existuju nejake PHP kniznice a navody na internete, ktore sa o to snazia viac ci menej uspesne. Podla mojho sukromneho nazoru jeden z najaktivnejsich a najpokrocilejsich projektov je https://github.com/ramsey/uuid

Nahoru Odpovědět
14.7.2016 10:14
try {...} catch (Exception ignored) { echo " ¯\_(ツ)_/¯ "; }
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 18 zpráv z 18.