Autor | Zpráva | ||
---|---|---|---|
Ráďa Profil * |
#1 · Zasláno: 24. 3. 2009, 22:55:35
Toto je generátor náhodného řetězce:
function randString($len) { $chars = 'abcdefghijkmnpqrstuvwxyz123456789'; $str = ''; for($i = 1, $charLen = strlen($chars); $i <= $len; $i++) { $str .= $chars[rand(0, $charLen-1)]; } return $str; } echo randString(8); //vypise nahodny retezec o 8 znacich A teď bych ještě potřeboval vygenerovaný a zobrazený náhodný řetězec zahashovat a uložit do databáze. Pokud se údaje na skript posílají rovnou z formuláře, tyto operace zprovoznit umím. Neumím to však v tomto případě, kdy se údaje neposílají z formuláře, ale generují se předchozím skriptem. Díky za pomoc. |
||
tiso Profil |
#2 · Zasláno: 24. 3. 2009, 23:08:49
$string=md5(randString(8)); $query="INSERT INTO table (password) VALUES ('$string')"; btw. prečo si vynechal znaky "l", "o" a "0"? |
||
Ráďa Profil * |
#3 · Zasláno: 25. 3. 2009, 01:19:33
Tuhle "nedokonalost" nemám z vlastní hlavy. Řeší to komplikace při zadávání hesla (a toto má být heslo), kdy nebývá příliš zřejmé, zda se jedná o "l" nebo "1", "o" nebo "0".
|
||
Majkl578 Profil |
#4 · Zasláno: 25. 3. 2009, 09:22:20 · Upravil/a: Majkl578
tiso
ten kod jsem psal ja. vynechal jsem to protoze se tyto znaky casto zamenuji, proc tomu nepredejit, ze? :) jinak pozor na to co jsi napsal, tim vygenerujes nahodny retezec a rovnou ho zahashujes, tudiz ho uz nemuzes pouzit. podle me je lepsi reseni toto (ikdyz md5 nemam moc v oblibe): $string = randString(8); $query = "INSERT INTO `table` SET `password`= '" . md5($string) . "'"; |
||
tiso Profil |
#5 · Zasláno: 25. 3. 2009, 09:30:22
Majkl578 - máš pravdu, dokonca som to tak aj začal písať, ale potom som to skrátil. Išlo mi o názornosť ako to dostať do DB.
|
||
Časová prodleva: 3 měsíce
|
|||
Ráďa Profil * |
#6 · Zasláno: 25. 6. 2009, 19:32:04
S malou odmlkou bych se ještě rád zeptal, zda PHP nabízí nějaké snadné řešení, kterým by se předešlo situaci, kdy by byl vygenerován stejný řetězec, který byl již dříve vygenerován a zahashovaný uložen v DB. (Vím, pravděpodobnost je téměř nulová, ale stát se to teoreticky může.) Kontrolu takové duplikace provést umím:
function HESLOvDB ($password, $link) { $vysledek=mysql_query("select * from table where password='".$password."'", $link); return (boolean) mysql_num_rows($vysledek); } Jde mi pouze o nějaké sofistikované řešení (pokud existuje), jak řetězec snadno přegenerovat na unikátní a znovu uložit do DB. |
||
tiso Profil |
#7 · Zasláno: 25. 6. 2009, 21:41:15
Ráďa - nastaviť tomu stĺpcu unikátny index a pri vkladaní do DB zisťovať, či sa pri vložení nevyskytla chyba. Skript by sa ted mal snažiť opakovať vygenerovanie nového stringu, kým sa ho nepodarí vložiť. Pri veľa záznamoch ale bude dochádzať k častej kolízii, takže vykonanie skriptu bude náročnejšie.
|
||
Ráďa Profil * |
#8 · Zasláno: 26. 6. 2009, 16:48:20
Na mě se musí trochu polopatě. :-) Chybu mám zjišťovat výše uvedeným skriptem, nebo nějak jinak?
|
||
Časová prodleva: 3 dny
|
|||
Ráďa Profil * |
#9 · Zasláno: 29. 6. 2009, 20:34:43
[#7]
Zkusím to ještě jednou přímo jmenovitě... Na mě se musí trochu polopatě. :-) Chybu mám zjišťovat výše uvedeným skriptem, nebo nějak jinak? |
||
Ráďa Profil * |
tiso
Tak do třetice všeho dobrého:-) Na mě se musí trochu polopatě. :-) Chybu mám zjišťovat výše uvedeným skriptem, nebo nějak jinak? Moderátor Alphard: To je nějaká hra? Doufám, že vás fascinuje pouze trojice, protože devatero už se mi přestane líbit.
|
||
Alphard Profil |
#11 · Zasláno: 29. 6. 2009, 20:53:38
do { mysql_query ("..."); } while ($mysql_errno() == 1062) |
||
Ráďa Profil * |
#12 · Zasláno: 29. 6. 2009, 21:30:27
Alphard
Díky za pomoc. ...Omlouvám se. Na podobné hry nemám věk ani chuť. Pouze jsem nenahlédl do nápovědy a chtěl dotaz směřovat přímo na konkrétního přispěvatele. Na první dva pokusy se mi toto nezdařilo, proto náledoval třetí - už se to nebude opakovat, neb jsem zase o krůček zkušenější. :-) |
||
Časová prodleva: 3 dny
|
|||
Ráďa Profil * |
#13 · Zasláno: 2. 7. 2009, 15:47:44
Tedy, sice jsem již děkoval za pomoc, leč po implementaci uvedeného kódu do skriptu i po různých modifikacích jsem zjistil, že mi nijak nepomáhá, resp. vůbec nepracuje. Rozumím dobře, když se domnívám, že uvedený postup má zajistit, aby skript jakousi opakovanou smyčkou vyhledal i třeba tu nejposlednější možnost v DB zatím neuloženého řetězce z vymezeného rozsahu, vygeneroval jej a uložil? Nebo se mýlím?
|
||
Alphard Profil |
#14 · Zasláno: 2. 7. 2009, 18:28:19
Ráďa:
„Rozumím dobře, když se domnívám, že uvedený postup má zajistit, aby skript jakousi opakovanou smyčkou vyhledal i třeba tu nejposlednější možnost v DB zatím neuloženého řetězce z vymezeného rozsahu, vygeneroval jej a uložil?“ Rozumíte tomu naprosto přesně. Dejte sem váš kód, takhle vám nikdo neporadí. Jestli jsem si nespletl kód chyby pro duplicitní záznam, tak tam nevidím chybu (kdyžtak to zkuste najít). |
||
Ráďa Profil * |
#15 · Zasláno: 3. 7. 2009, 01:00:01
Kód jsem různě překopával a skončil u této podoby (proto to může být i hloupost):
function randString1($len) { $chars = '0123456789'; $str = ''; for($i = 1, $charLen = strlen($chars); $i <= $len; $i++) { $str .= $chars[rand(0, $charLen-1)]; } return $str; } do { $Symbol = randString1(2); $sql_query = "INSERT INTO `Registrace` (`id`, `Symbol`) VALUES (NULL, '$Symbol')"; $result = mysql_query($sql_query); if (!$result) { if (mysql_errno() == 1062) { continue; } } } while(0); echo "Jedinečný variabilní symbol: $Symbol"; Využil jsem verzi, kterou jsem na toto téma nalezl jinde tady v diskusi - autor psal, že mu víceméně dobře slouží. Každopádně zjištění chyby provádí stejným způsobem. V DB mám na sloupci Symbol unikátní index. Generuji pouze dvouciferný řetězec pro snadné testování. Výsledek je však takový, že se nový vygenerovaný symbol do DB ukládá, duplicitní nikoli. Nic míň, nic víc. |
||
Alphard Profil |
#16 · Zasláno: 3. 7. 2009, 08:53:21
No jo, moje úpravy jste úspěšně dotáhl do nefunkční podoby, jak vás napadlo while(0)?
function randString1($len) { $chars = '0123456789'; $str = ''; for($i = 1, $charLen = strlen($chars); $i <= $len; $i++) { $str .= $chars[rand(0, $charLen-1)]; } return $str; } do { $Symbol = randString1(2); $sql_query = "INSERT INTO `Registrace` (`id`, `Symbol`) VALUES (NULL, '$Symbol')"; $result = mysql_query($sql_query); } while(mysql_errno() == 1062); echo "Jedinečný variabilní symbol: $Symbol"; |
||
Ráďa Profil * |
#17 · Zasláno: 4. 7. 2009, 02:12:34
Skutečně, takto vše pracuje naprosto bezchybně. Přesto bych skoro dal ruku do ohně, že jsem zkoušel i tuto variantu, ale nefungovala.
While(0) nebyl můj patent, je odtud. Ještě jednou díky. |
||
Časová prodleva: 15 let
|
0