Rasgele dize oluşturmak, veritabanı karşı kontrol edin, sonra bunu kullanın

2 Cevap php

Bu rasgele dizeleri kullanırken benim için geliyor tutan bir konudur.

Bu temelde bir süreçtir.

  1. Rasgele dize oluşturmak
  2. Zaten veritabanında olup olmadığını kontrol edin
  3. Bunu kullanmak değilse, başka bir tane oluşturmak

Peki nasıl bu PHP kullanarak yapmak istiyorsunuz?

2 Cevap

Neden sadece bir GUID kullanımı ve veritabanı bu korumak izin vermeyin. Daha sonra sadece bir saklı yordam diyebiliriz.

Ben çok basit, bu fonksiyonu kullanmak olacaktır:

/**
 * Generates a string with random characters taken from the given string
 * of the desided length
 *
 * @param int $length the resulting string length
 * @param string $chars the chars; defaults to all alphanumerics
 * @return string the random string
 * @author Andrea Baron
 */
function rand_string($length,
        $chars = 'qwertyuiopasdfghjklzxcvbnm0123456789') {
    $r = '';
    $cm = strlen($chars)-1;
    for($i=1; $i<=$length; ++$i) {
        $r .= $chars[mt_rand(0, $cm)];
    }

    return $r;
}

o zaman böyle bir şey yapabilirsiniz

$used = $db->prepare('SELECT EXISTS(SELECT string FROM table WHERE string = ?)');
do {
    $string = rand_string(32);
    $used->execute(array($string));
    $exists = $used->fetch(PDO::FETCH_NUM);
    $used->closeCursor();
} while($exists && $exists[0]);

$ins = PP::$db->prepare('INSERT INTO table SET string=?');
$ins->execute(array($string));

Eğer PDO ve MySQL kullanıyorsanız; Ben birincil anahtar, ya da ikincil bir alanda eğer bir HASH endeksi olarak dize alanını olacaktı; veya daha özlü ve, belki, gibi güçlü değil:

do {
    $string = rand_string(32);
    $exists = PP::$db->exec('INSERT INTO a SET string='.PP::$db->quote($string));
} while(!$exists);

Bir hata, yinelenen bir anahtar değeri bu durumda, varsa, bu, çünkü exec() hiçbir hata etkilenen satırların sayısını, ya da false döndürür.

Ya da, alternatif olarak, bir zaman damgası ekleyebilir ve tüm kontrol unut. Gibi:

$string = rand_string(8).time();

Eğer 1 8 ^ 37 veya 3.5E12 görmek gibi bir yinelenen tanımlayıcı sahip olasılığı, 8 karakterli, her saniye sıfırlar, ve.