Autor Zpráva
šárinka
Profil
Ahoj all, vytvořil jsem si kód kterej generuje desetimístnej variabilní symbol pro pladbu na internetu, ale nevím jestli někdy nenastane chvíle kdy se vygenerujou dva stejný variabilní symboly. Popřípadě jak to mám upravit?
Díky za případné odpovědi

function genHeslo09($len)
      {
       $pw = ''; //intialize to be blank
       for($i=0;$i<$len;$i++)
       {
         switch(rand(1,2))
         {
           case 1: $pw.=chr(rand(48,57));  break; //0-9
           case 2: $pw.=chr(rand(48,57));  break; //0-9
         }
       }
       return $pw;
       }
srigi
Profil
Ukladaj si kazdy vygenerovany vyraz do tabulky databazy, do stlpca s unique indexom. Databaza ti vyhodi error 1062 pri zhode v unique stlpci.
$query = "INSERT INTO `obj` (`id`, `key`) VALUES (NULL, '$key')";
@$result = mysql_query($sql_query);
if (!$result) {
  // check if errors is because of duplicate entry
  if (mysql_errno() == 1062) {
    tu vygenerujes novy kluc a znova sa pokusis o zapis
  }
}
šárinka
Profil
aha takže když si to někam nebudu ukládat tak je pravděpodobný že ta situace nastane co?
srigi
Profil
No to zavisi od poctu generovanych klucov za den/tyzden/mesiac a na jeho dlzke. Pri 10 znakoch [A-Za-z0-9] a par klucoch za den, taka situacia nemusi nastat vobec niekolko rokov. Ale nikdy sa neda zarucit, ze vygenerujes vzdy odlisny kluc, nakolko generator nahodnych cisel nevie ake cisla nema generovat. Kazdopadne ak sa jedna o $$$, treba mat veci poistene proti vzniku chyb.
šárinka
Profil
srigi
díky, budu to ukládat do mysql pro jistotu
Alphard
Profil
pokud nevadí tvar např. rrrrdddxxx, kde rrrr je rok a ddd den v roce (od 1 do 366) a náhodné je až x, tak stačí ukládat symboly za poslední den a nebude potřeba si za rok dělat starosti se starými daty např. při přesunu databáze apod.
Petyk
Profil
ja myslim ze ta databaze je snad jasna, prece kdyz ti nekdo zaplati, tak sama musis vedet k cemu ten variabilni symbol priradit,ne?
Petyk
Profil
navic ten tvuj kod absolutne nedava smysl, na co switch, kdyz obe moznosti jsou stejny, pokud generujes kod pouze z cisel, tak je mnohem jednodussi udelat to takhle, ne?

$pw=rand(1000000000,9999999999)
srigi
Profil
Ja pouzivam takuto fnci
random_str($len)
{
  $randlen = $len;
  $randval = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  $random = "";

  for ($i = 1; $i <= $randlen; $i++) {
    $random .= substr($randval, rand(0,(strlen($randval) - 1)), 1);
  }

  return $random;
}
šárinka
Profil
srigi
jak jsi psal ten kód na ověřování zda je kód v mysql tak mi to nefuguje mi to neověřuje přidává mi to ikdyž jsou stejný měl sjem to takto

$key = genHeslo09(10);
$query = "INSERT INTO `obj` (`id`, `key`) VALUES (NULL, '$key')";
@$result = mysql_query($sql_query);
if (!$result) {
  // check if errors is because of duplicate entry
  if (mysql_errno() == 1062) {
    $key = genHeslo09(10);
  }
}
srigi
Profil
Tu tabulku treba vytvorit tymto prikazom
CREATE TABLE `obj` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`key` VARCHAR(10) NOT NULL DEFAULT ''
PRIMARY KEY (`id`),
UNIQUE KEY `key` (`key`)
) ENGINE = MYISAM ;
Potom uz do stlpca key nepojde dat dve rovnake hodnoty. Vyskusaj najskor cez phpMyAdmin.
Ssob
Profil
šárinka
Po zjisteni, ze se klic jiz vyskytuje v tablulce vygenerujes novy a znovu se ho pokusis vlozit. Takze kod bude vypadat nejak tak:
do
{
 $key = genHeslo09(10);
 $query = "INSERT INTO `obj` (`id`, `key`) VALUES (NULL, '$key')";
 @$result = mysql_query($sql_query);
 if (!$result) {
   // check if errors is because of duplicate entry
   if (mysql_errno() == 1062) {
     continue;
   }
 }
}
while(0);
echo "Jedinecny variabilni symbol: $key";
šárinka
Profil
díky už mi to funguje ale když vygeneruju novej a najedu znova na tu stránku a chci vygenerovat další pro zkoušku tak mi to vypisuje chybu Fatal error: Cannot break/continue 1 level on line 35 (tučně vyznačený)

{
$key = randPass09(10);
             $sql_query = "INSERT INTO `obj` (`id`, `key`) VALUES (NULL, '$key')";
             $result = mysql_query($sql_query);
             if (!$result) {
               // check if errors is because of duplicate entry
               if (mysql_errno() == 1062) {
                 continue;
               }
             }
            }
            while(0);
            echo "Jedinecny variabilni symbol: $key";


a ještě sem našel jeden problém, když je na začátku vygenerovanýho symbolu nula tak mi to tu nulu do mysql nezapíše zapíše mi to bez nuly
nightfish
Profil
šárinka
na začátku toho skriptu ti chybí "do"

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