Как выбрать случайный и уникальный ID в mysql

Статус
В этой теме нельзя размещать новые ответы.
Это тоже не вариант, если максимальное значение окажется слишком большим, скажем 10 млн. будет не совсем удобно с ним работать.

Мне тут настойчиво советуют auto_increment, поэтому дополню свой вопрос:
Когда пользователь переходит на страницу заказа я должен сгенерировать уникальный ID заказа и вписать его в скрытое поле <input type='hidden' name='ornum' value='265895' /> на странице заказа.

Этот ID я передаю биллингу, когда пользователь кликает "оплатить" и попадает на сайт биллинга.

На стадии оформления заказа биллинг передаёт мне этот ID обратно в скрытый файл Result.php и, если все успешно я вписываю этот ID к себе в БД MySQL вместе с другой информацией по платежу.

Теперь вопрос, если к примеру на сайте было 20 заказов, пользователь перешел на страницу заказа, я вписал в скрытое поле следующий незанятый ID - 21. В это время заказ начали оформлять ещё 5 пользователей - им тоже вписал скрытое поле ID - 21, ведь он ещё не занят (биллинг не обращался на Result.php и в БД этот ID не вписан). В результате я получу ситуацию когда в какой то момент пользователь оформлявший заказ, завершил его вписав ID 21 в БД. А следующий сразу за ним другой пользователь, тоже получивший ID 21 будет пытаться вписать в БД дублирующую запись и получит ошибку, если поле будет, как мне советуют auto_increment.


И снова про AUTO_INCREMENT.

Сначала добавляйте заказ в базу, а потом обновляйте его. Так сделано в 95% скриптов интернет-магазинов.
 
Этот ID я передаю биллингу, когда пользователь кликает "оплатить" и попадает на сайт биллинга.
а что мешает не создавать заказа до тех пор пока не будет этого клика, вот тут вы создаёте запись с автоинкрементом и другими полями и редиректаете риспонс на страницу билинга.
 
Между этими двумя пунктами твой обработчик на php? Если да создавай новый заказ с пометкой не оплачено и передавай биллингу id из таблицы.

Все сделал именно так сейчас, протестировал и работает отлично.
Т.е. юзер кликает "оплатить", попадает на мой обработчик php, где кроме всего прочего делаю:

Код:
$dbconn->Execute("INSERT INTO table (id_user, product_name, product_price, status, date_send)
                  VALUES ('".intval($user_id)."', 'tov_name', '".floatval($amount)."', 'notpaid',  NOW())");
 
$order_id = $dbconn->Insert_ID();

И что немаловажно получилось довольно просто, правда таблица будет наполнятся заказами "не оплачен", но это только плюс, можно видеть переходы пользователей на страницу с биллингом. К тому же сделал ещё 2 пункта на будущее, "refund" и "return".
Думаю тему можно закрывать, а тем кто хочет обсудить интересный вопрос, рекомендую сюда - Для просмотра ссылки Войди или Зарегистрируйся :)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху