Генерация уникального идентификатора с использованием PHP и MYSQL - PullRequest
1 голос
/ 12 марта 2012

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

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

Это мой код:

function uniqueID($table) 
{
$db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);

$possible = '1234567890';
$code = '';
$characters = mt_rand(7,14);
$i = 0;

while($i < $characters) 
{ 

    $code .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
    $i++;

}

$result = $db->query('
SELECT uniqueID
FROM '.$table.'
WHERE uniqueID = "'.$code.'"
LIMIT 1
');

$totalRows = $result->num_rows;

if(!$result)
{

    return $db->error;

}
else
{

    if($totalRows > 0)
    {

        return uniqueID($table);

    }
    else
    {

        return $code;

    }

}

}

Ответы [ 6 ]

3 голосов
/ 12 марта 2012

В PHP есть функция с именем uniqid()

http://php.net/manual/en/function.uniqid.php

3 голосов
/ 12 марта 2012

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

напишите какую-нибудь функцию, которая будет возвращать ее вам

function generate_uid(){
 return md5(mktime()."-".rand()."-".rand());
}
3 голосов
/ 12 марта 2012
1 голос
/ 12 марта 2012

Я мог бы поговорить о создании идентификаторов, как это сделали другие, но это не ваш вопрос. Ваш запрос выглядит нормально. Если он возвращает 0 строк, но вы, похоже, нашли код в базе данных, то, скорее всего, он выглядит только одинаково, но на самом деле это не так. Это может быть дополнено пробелами.

0 голосов
/ 16 марта 2012

Я понял, в чем проблема, как я уже говорил, генерация кода не была проблемой!Проблема заключалась в том, что перекрестная проверка не работала правильно.Так что все, что я сделал, это удалил этот цикл

while($i < $characters) 
{ 

    $code .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
    $i++;

}

Поскольку это приводило к тому, что мой уникальный идентификатор заканчивался неправильно.

0 голосов
/ 12 марта 2012

Один из способов решить эту проблему - выбрать последнюю строку вашей пользовательской базы данных и попросить сценарий проверить поле идентификатора (это можно сделать, выполнив выборку по идентификатору в режиме потомка), а затем использовать эту информацию.для рандомизации чисел, превышающих этот идентификатор.

РЕДАКТИРОВАТЬ

$result = $db->query('
SELECT uniqueID
FROM '.$table.'
');

$already_in_database = array();
while ($row = mysql_fetch_array($result)){
    $already_in_database[] = $row['UID'];    
}

$new = rand(0,$some_max_value);
while(in_array($new,$already_in_database)){
    $new = rand(0,$some_max_value);
}
...