Что происходит, когда пользователь заходит на сайт, заполняет форму для создания нового продукта с полями заголовка, описания, цены и так далее...
Я хочу сохранить уникальный сгенерированный буквенно-цифровой ключ в моем столбце «id», для которого по умолчанию установлено значение auto_increment, используйте этот уникальный ключ как мой product_id. Как и каждое видео на Youtube, у него есть собственный сгенерированный уникальный ключ, а не идентификатор типа «1», «2», «3»....
Я генерирую этот ключ, используя "uniqid();"
функция.
Пожалуйста, дайте мне знать, если я делаю это неправильно, или есть лучший подход для этого. Я полный новичок.
Нет, я просто хочу использовать сгенерированный "uniqid();" значения.
По сути, вы лишаете столбца привилегии, когда даете ему автоинкрементный тип. Это противоречит цели быть автоматическим, если вы собираетесь присвоить какое-то значение самостоятельно.
Следующие две вещи не могут быть истинными одновременно:
У вас не может быть буквенно-цифрового ключа, который является auto_increment, потому что по определению буквенно-цифровой означает строку, созданную из алфавитов и цифр, и вы не можете автоматически увеличивать алфавиты, имеет смысл?
Итак, я предлагаю вам оставить ключ «id» числовым как 1, 2, 3 и т. д. и создать еще один столбец в вашей таблице, назовите его, скажем, «unique_id». Конечно, вы можете назвать его как угодно. Он должен быть типа VARCHAR(255).
А затем заполните этот столбец, используя следующие функции:
$bytes = 12;
$uniqueId = bin2hex(openssl_random_pseudo_bytes($bytes)); //this will create 24 char alphanumeric string, you can increase or decrease it by changing the $bytes
и поместите это $uniqueId
в свою колонку, и вуаля, у вас есть уникальный идентификатор объекта.
ОБНОВИТЬ
Чтобы отобразить буквенно-цифровой уникальный идентификатор в вашем URL-адресе, вам нужно изменить структуру URL-адреса с /localhost/product/product_id
на /localhost/product/product_unique_id
, и я предполагаю, что у вас есть где-то ваш продукт, указанный с какой-то гиперссылкой, нажав на которую пользователь переходит на страницу сведений о продукте, правильно?
Допустим, у вас есть продукт с идентификатором 1 и уникальным идентификатором lt4Zhr7, поэтому, когда вы перечисляете продукты, вы указываете уникальный идентификатор продукта следующим образом:
<a href = "/localhost/product/lt4Zhr7"> Product 1 </a>
Это базовое решение, которое должно направить вас в правильном направлении, ваш фактический код может отличаться в зависимости от используемой вами структуры или какого-либо другого фактора.
Как показать этот уникальный идентификатор в URL-адресе? Когда я создаю продукт, мой URL-адрес «/localhost/product/product_id», например, «/localhost/product/4». Я хочу, чтобы это было похоже на «/localhost/product/lt4Zhr7».
Этот ответ следует принять. Это очень разумное решение. Уникальный идентификатор настолько близок, насколько это возможно, к действительно уникальному, даже криптографически безопасному (что выходит за рамки вопроса, но, тем не менее, хорошо), случайному. И @Learner прав. Вы не можете иметь автоинкрементную строку И в том же столбце.
Спасибо @Андрей. ОП, я обновил свой ответ, чтобы дать вам представление о том, как вы можете загрузить свой продукт, используя уникальный идентификатор.
Спасибо @Ученик. Но как добавить префикс в openssl_random_pseudo_bytes()?
Простая конкатенация PHP? $uniqueId = 'prefix_'.bin2hex(openssl_random_pseudo_bytes($bytes));
Должно сработать?
Мой добрый сэр, @Learner, вы настоящий мужчина! И последнее, где мне обновить маршрут, чтобы показать unique_id в URL-адресе?
Это зависит от того, где вы перенаправляете пользователей на страницу «сведения о продукте». Это зависит от структуры вашего сайта.
Пожалуйста, разместите с ним отдельный вопрос, предоставив другие подробности, относящиеся к этой конкретной проблеме, например, какую платформу вы используете, какова структура вашего веб-сайта и т. д. Этот разговор выходит за рамки первоначально заданного вопроса. Спасибо!
Почему вы хотите использовать как автоматически увеличивающиеся значения базы данных, так и
uniqid()
?