2013-11-19 2 views
1

Я пытаюсь создать ссылочные номера для клиентов и заказов на основе this answer со следующими требованиями:Использование uniqid() для ссылочного номера клиента

  • Все номера
  • Unique (, насколько это возможно без проверки база данных)
  • Та же длина
  • Клиенты начинают с 10
  • Заказы начинаются с 20

Вот мой текущий код для исх клиента:

$ref = uniqid(); 
$decimalRef = hexdec($ref); 
$finalRef = 10 . $decimalRef; 

Является ли это хорошее решение? Я беспокоюсь о уникальности и не уверен, что они всегда будут одинаковой длины.

Update

Я не хочу использовать значение автоматической базы данных приращения, потому что я не хочу писать в базу данных заранее, и я не хочу, чтобы мои клиенты, зная, что мой номер клиента 2. По понятным причинам.

Update 2

Если бы я должен был использовать значение автоматического приращения базы данных, как я затем преобразовать это в более подходящий клиент сталкивается числа в соответствии с требованиями (такой же длины, начиная с 10). Если у меня всего 4 заказа в системе, я не хочу объявлять об этом своим пользователям.

+1

Если вы используете базу данных, что случилось с простым инкрементным идентификатором? –

+0

Мне нужно сначала создать ссылку, чтобы отправить ее на платежный шлюз, если платеж будет успешным, тогда я сохраню его в БД.Кроме того, клиент обращается к ссылке, я не хочу, чтобы мои клиенты думали, что они являются номером клиента. – paul

+1

Вы всегда можете создать запись в базе данных, и если платеж не удастся, то снова удалите его; но uniqid() не является хорошим способом создания уникальных значений - вам нужно будет сделать чтение базы данных, чтобы узнать, было ли это значение уже выделено клиенту, и, при необходимости, восстановить идентификатор –

ответ

0

uniqid() функция генерирует уникальный идентификатор на основе микропоры

Это означает, что если вы можете убедиться, что нет одновременно запрос uniqid поколения, он не будет хорошо на этом одном сервере (из-за него оснований по времени системы).

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

"10". hexdec(uniqid()).$userId ;//or hexdec(session_id()) instead of $userId 

Обновлено: Я боюсь, что функция HexDec будет возвращать значение слишком большой для данного типа Int. Это действительно перебор. Если проблема связана только с порядковым номером, можно указать номер заказа с отметкой времени или аналогичным образом или сделать начало автоинкремента с 2000 вместо 0.

+0

всегда будет такой же длины? Если нет, то как я могу всегда сделать номер id той же длины? – paul

0

Вы можете попробовать это. Я не уверен в уникальности этого, но работает для меня.

// Generate a random character string 
    function rand_str1($length = 8, $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890',$type) 
    { 
     // Length of character list 
     $chars_length = (strlen($chars) - 1); 

     // Start our string 
     $string = $chars{rand(0, $chars_length)}; 

     // Generate random string 
     for ($i = 1; $i < $length; $i = strlen($string)) 
     { 
      // Grab a random character from our list 
      $r = $chars{rand(0, $chars_length)}; 

      // Make sure the same two characters don't appear next to each other 
      if ($r != $string{$i - 1}) $string .= $r; 
     } 

     // Return the string 
     if($type=="Customers") 
     { 
     return "10".$string.""; 
     } 
     else if($type=="Orders") 
     { 
     return "20".$string.""; 
     } 
    } 
0

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

Смежные вопросы