Например, когда пользователь регистрируется на моем веб-сайте, я создаю уникальную строку длиной 40 и вставляю ее в базу данных. Затем мы отправляем электронное письмо недавно зарегистрированному пользователю, содержащее эту уникальную строку в виде URL-адреса, и все это прекрасно работает.
Но как вы создаете и вставляете эту сущность регистрации, гарантируя, что поле с уникальным свойством действительно уникально?
Мой текущий подход заключается в следующем:
$key = '';
$repeat = true;
while ($repeat) {
$key = generate_hash(40);
$is_unique = (count($model->get_by_key($key)) === 0) ? true : false;
$repeat = ($is_unique) ? false : true;
}
// At this point I know the key is unique and can insert it...
Я не доволен этим кодом, так как стараюсь избегать циклов while в целом. Есть ли лучший способ добиться того, что я делаю здесь?
Суть в том, что поле MySQL, содержащее эти ключи, обладает уникальным свойством, и мне нужно знать, что при вставке этих ключей не будет происходить уникальных нарушений.
Хорошо, в основном у вас есть два подхода.
Позвольте БД справиться с этим и использовать UUID () создать уникальный идентификатор, который вы можете использовать в письмах.
В зависимости от вашей версии MySQL у вас есть несколько вариантов:
A. С MySQL 4.1 и выше вы можете использовать функцию непосредственно с INSERT INTO:
INSERT INTO table_name
(unique_id, field1, field2)
VALUES
(UUID(), "smth", "smth")
B. С MySQL 5.0 Вы можете создать TRIGGER и автоматически заполнить уникальное поле при вставке:
CREATE TRIGGER
unique_id
BEFORE INSERT ON
table_name
FOR EACH ROW
SET NEW.unique_id = UUID()
Вы можете программно проверить, является ли сгенерированный идентификатор действительно уникальным. То же самое вы делаете сейчас, но вы можете немного изменить код:
$key = generate_hash(40);
while ( count($model->get_by_key($key)) ) {
$key = generate_hash(40);
}
//here you have an unique id in $key
Для этого есть встроенные уникальные функции идентификатора почти на всех языках.
echo uniqid();
Вы можете генерировать 256 ^ 40 различных 40-символьных строк.
Солнце взорвется, прежде чем вы создадите 2 одинаковые строки.
Ты можешь использовать md5(time())
как ваша уникальная ценность вместо. md5
из time
не будет одинаковым для каждого отправляющего пользователя.
$time = time();
$md5 = md5($time);
Пока md5()
просто содержит 32 строки длины, вы можете добавить уникальное слово после md5()
,
$unique = $md5."uniq1234";
Теперь у вас есть 40 уникальных строк. Наконец вы можете добавить $unique
как ваше уникальное значение в базе данных
Вы можете использовать эту функцию для генерации uniqueID,
function keygen($length=10)
{
$key = '';
list($usec, $sec) = explode(' ', microtime());
mt_srand((float) $sec + ((float) $usec * 100000));
$inputs = array_merge(range('z','a'),range(0,9),range('A','Z'));
for($i=0; $i<$length; $i++)
{
$key .= $inputs{mt_rand(0,61)};
}
return $key;
}
echo keygen(10);