Повторение функции - PullRequest
       8

Повторение функции

1 голос
/ 26 декабря 2010

Это дополнительный вопрос к вопросу Я разместил здесь .

Я использую следующий код, чтобы дать пользователям уникальный идентификатор:

function NewGuid() { 
    $s = strtoupper(uniqid(rand(),true)); 
    $guidText = substr($s,0,8) . '-' . substr($s,8,4) . '-' . substr($s,12,4). '-' . substr($s,16,4). '-' . substr($s,20); return $guidText; 
} 

$Guid = NewGuid();
echo $Guid;

$alphabet = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ';

function base_encode($num, $alphabet) { 
    $base_count = strlen($alphabet); 
    $encoded = '';

    while ($num >= $base_count) {
        $div = $num/$base_count;
        $mod = ($num-($base_count*intval($div)));
        $encoded = $alphabet[$mod] . $encoded;
        $num = intval($div);
    }

    if ($num) $encoded = $alphabet[$num] . $encoded;
    return $encoded;    
}

function base_decode($num, $alphabet) { 
    $decoded = 0;
    $multi = 1;

    while (strlen($num) > 0) {
        $digit = $num[strlen($num)-1];
        $decoded += $multi * strpos($alphabet, $digit);
        $multi = $multi * strlen($alphabet);
        $num = substr($num, 0, -1);
    }

    return $decoded;
}

echo base_encode($Guid, $alphabet);

Итак, если сгенерированный идентификатор уже используется, я хочу, чтобы этот код мог повторяться до тех пор, пока полностью новый идентификатор не будет сгенерирован и введен в базу данных.Кроме того, я новичок в программировании, поэтому, пожалуйста, не стесняйтесь разрабатывать;)

Есть мысли?Благодаря.

Ответы [ 5 ]

2 голосов
/ 26 декабря 2010

Супер просто.

У вас есть 3 функции.

One - основная функция guid генерации.
Два - Sub генерирует функцию guid.
Три - вспомогательная функция направляющей вставки.

Функция субгенерирования:
Делает фактическое поколение, возвращает гид.

Функция вспомогательной вставки:
Попытки вставить guid в базу данных. Возвращает false / null при ошибке. Правда / данные об успехе.

Основная функция:
В цикле:
Вызовите подфункцию, чтобы получить гид.
Вызовите подфункцию для вставки в базу данных, где guid является уникальным или первичным ключом.
При неудаче перезапустите цикл.
Успех выходит из цикла и возвращает гид.

* * Пример тысяча двадцать-один: * * 1 022
function GetGuid()
{
    do
    {
        $guid = GenerateGuid();
    } while (!InsertGuid($guid));
    return $guid;
}

function GenerateGuid()
{
    // do your stuff here.
    return $guid;
}

function InsertGuid($guid)
{
    $sql = 'INSERT INTO `guid_table` (`guid`) VALUES ('$guid')';
    $connection = //do sql connect here;
    return // do sql execution here which will return false/null on failure;
}
1 голос
/ 26 декабря 2010

Мне нужно обновить / исправить систему, написанную аналогично тому, как вы пишете код, и я должен сказать вам, что я действительно ненавидел оригинального программиста.

Подумайте о том, что вы делаетев течение секунды, если другой пользователь создает учетную запись между тем, когда вы спрашиваете, является ли руководство действительным (и возвращаете да), и когда вы фактически вставляете строку, у вас все еще могут быть коллизии.Это за ужасно ...

Но парни, которые заставили программы баз данных задуматься над этим и предлагают вам безболезненную альтернативу: столбцы идентификации.Они обеспечивают 3 основных преимущества:

  • гарантированно уникален (или вставка не удалась)
  • они автоматически превращаются в первичный ключ
  • база данных генерирует их для вас

Чтобы использовать их, сделайте ваш столбец идентификаторов столбцом идентификаторов, а когда вы сделаете вставку, напишите его так:

insert into users (name, passwordhash, extrastuff) 
values (@name, @passwordhash, @extrastuff);
select @@identity -- or ident_current() for mysql

И вы получите сгенерированный для вас идентификатор пользователя для дальнейшей обработки.Все это делается одновременно, независимо от того, сколько пользователей пробуют это одновременно.

1 голос
/ 26 декабря 2010
function randr($j = 8){
$string = "";
    for($i=0;$i < $j;$i++){
        srand((double)microtime()*1234567);
        $x = mt_rand(0,2);
        switch($x){
            case 0:$string.= chr(mt_rand(97,122));break;
            case 1:$string.= chr(mt_rand(65,90));break;
            case 2:$string.= chr(mt_rand(48,57));break;
        }
    }
return $string; 
}

    do{
    $id = randr();
    $check = mysql_query("SELECT uniq FROM users WHERE uniq = '$id'");
    }while(mysql_num_rows($check) != 0);

Подумайте об этом.

0 голосов
/ 26 декабря 2010

Может быть, немного другой подход

Я бы переместил мою логику генерации в хранимую процедуру и попросил бы базу данных сгенерировать уникальную последовательность, как в Oracle.

Таким образом, я смогу избежать многочисленных поездок, чтобы проверить, является ли номер уникальным или нет.

0 голосов
/ 26 декабря 2010

Я создавал подобный код раньше, обычно я начинаю с пустой переменной, и я делаю в то время как ($ variable == null) {}

внутри, я создаю новый код, проверяю его по базе данныхи если он еще не существует, я устанавливаю $ variable = $ new_code (который сломает время) и затем продолжаю соответствующим образом.

Кроме того, я регистрирую любые коллизии, которые могут произойти

hopeэто помогает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...