passshift
@passshift
php, js, html5, css

Как создать и хранить уникальный идентификатор заказа?

Здравствуйте!

Нужна помощь опытных. Суть вот в чем:

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

Сейчас у каждого счета есть свой ID (присваивается бд AUTO_INCREMENT) т.е. по сути это обычный уникальный порядковый номер и если по нему ориентироваться то любой может посмотреть информацию о чужом счете посетив ссылку: магазин.ру/order/pay/1

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

Вопрос. Каким должен быть этот идентификатор и как его лучше хранить в бд чтобы поиск по данному полю был легким, быстрым, молодежным? )

Сейчас пока склоняюсь к генерации 9-значного числа без 0 и хранении его как INT, но сами понимаете, что это смех смехом.

Кстати, НЕоплаченные в течении 7 дней счета планируется удалять cron-ом, а вот оплаченные будут храниться в базе миллионы лет.

Зашел я тут на dropbox, у них ссылка на файл вот такого вида:

https://www.dropbox.com/s/cq8a9pj3pqtdxqb/изображение


А вот так устроен google docs:

https://docs.google.com/document/d/1CnjsimW4QSKetfwzSDr5Vmid36atdB81TnpY_OH_PAY


Как они хранят такие адреса?
  • Вопрос задан
  • 3450 просмотров
Решения вопроса 2
Попробуйте сделать поле с UUID.
Вот документация
Оттуда:
A UUID is designed as a number that is globally unique in space and time. Two calls to UUID() are expected to generate two different values, even if these calls are performed on two separate computers that are not connected to each other.

Вам должно подойти.

UPD1. Как хранить:
Создаем поле типа BINARY( 16 ) (вместо int) и делаем его primary key.
Это получается потому-что мы из строки
110E8400-E29B-11D4-A716-446655440000

удаляем все тире и у нас получается
110E8400E29B11D4A716446655440000

Это 32 символа в шеснадцатеричной системе, если хранить в бинарной - получается 16. Преобразовать в бинарную можно с помощью такой конструкции:
UNHEX("110E8400E29B11D4A716446655440000")
Обратно:
HEX(field_binary)

С производительностью проблем никаких, т.к. храним число в бинарном виде.

Вот тут более подробно разобрано: stackoverflow
Ответ написан
KOLANICH
@KOLANICH
Знаю JS, PHP, C++, C#
по сути это обычный уникальный порядковый номер и если по нему ориентироваться то любой может посмотреть информацию о чужом счете

Вот-это неправильно.
1 если информацию о заказе должен видеть только тот, кто его создал, заставьте его залогиниться для просмотра и проверяйте права.
2 Если каждый, у кого есть ссылка, создайте доп. таблицу из 2х колонок <крипт. без. случ. посл.> < id заказа (foreign key)>, которую свяжите с той через PK-FK и добавьте кнопку для открытия публичного доступа.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 5
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
формируете хэш на основе hash=md5(timestamp.summ) и записываете в отдельную колонку рядом с порядковым номером.
Вам искать - в одном поле: по порядковому номеру или hash'у. (OR)
По ссылке - роутер ищет только по hash.
После оплаты - запрещайте просмотр по hash.
Ответ написан
@shoomyst
dumb
Сейчас пока склоняюсь к генерации 9-значного числа без 0 и хранении его как INT, но сами понимаете, что это смех смехом.

Почему? Можно вообще сделать число из диапазона 1000-9999. Или вы думаете, что кому-то понадобится перебирать 9к вариантов? Храните этот секретный код в базе с привязкой к id счета. И потом проверяете связку id+secret
Ответ написан
AMar4enko
@AMar4enko
Т.е. у вас магазин без личного кабинета?
Ну тогда вы сами себе проблему создали. Генерируйте какой-нибудь MD5 или MurMurHash на основе даты оформления заказа, IP-адреса покупателя и подобной погоды на Марсе, храните как обычную строку с индексацией - вам же интервальный поиск не нужен будет, только вытащить по ключу.
Ответ написан
AmdY
@AmdY
PHP и прочие вебштучки
Вы, конечно, можете генерить uid, но рано или поздно эти данные попадут в паблик. Сделайте лучше авторизацию с вечной кукой.
Вот был подобный фейл с shop script habrahabr.ru/post/124898/, а вот какие могут быть последствия www.3dnews.ru/software-news/614679
Ответ написан
Den1xxx
@Den1xxx
При заказе просим заказчика ввести email, а при просмотре заказа даем ссылку вида order_no=123&email=me@somehost.ru
И если вдруг емайл заказчик потерял где-то по дороге, просим его ввести опять.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы