Autor Zpráva
Ráďa
Profil *
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
$string=md5(randString(8));
$query="INSERT INTO table (password)  VALUES ('$string')";


btw. prečo si vynechal znaky "l", "o" a "0"?
Ráďa
Profil *
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
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
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.
Ráďa
Profil *
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
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 *
Na mě se musí trochu polopatě. :-) Chybu mám zjišťovat výše uvedeným skriptem, nebo nějak jinak?
Ráďa
Profil *
[#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
do
{
  mysql_query ("...");
} while ($mysql_errno() == 1062)
Ráďa
Profil *
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ší. :-)
Ráďa
Profil *
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
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 *
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
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 *
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.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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

0