При добавлении элемента в базу данных, необходимо назначать ему уникальный ключ.
Числовой не подходит, так как можно простым перебором спарсить все товары.
Как правильно сделать цикл проверки на уникальность?
Который будет генерировать ключ до тех пор, пока не будет дублей.
uniqid();
генерирует подходящие ключи, однако не гарантирует уникальность значения, поэтому решил сделать проверку с имеющимися ключами.
Выгружаю из базы данных столбец с ключами
$arrayAllKey = R::getAll('SELECT `category_key` FROM `items` WHERE `id_user` = 104);
Как уже подсказали, перебор и сравнение каждого элемента массива будет ресурсозатратно при большом количестве данных.
Поэтому оптимальный вариант - выбор конкретного значения из базы данных.
Безуспешно сделал такой код, где
$unique - ключ. генерируется с помощью uniqid()
$arrayAllKey - массив существующих ключей
$findedKey- выбор ячейки из базы данных с ключом
$arrayAllKey[0]["category_key"] - значение найденного ключа $findedKey
// Указываю существующий ключ, чтобы цикл нашел дубль
$unique = "5e9dfcc637f75";
// Берем значение сгенерированного ключа $unique
// Если найдет значение, то выдаст его, если нет, ничего не выдаст
$findedKey = R::getAll('SELECT `category_key` FROM `items` WHERE `id_user` = ? and `category_key` = ?', [104, $unique]);
// Если значение найденного ключа есть
if ($findedKey[0]["category_key"]) {
// делаем генерацию нового ключа
$unique = uniqid();
// снова выбираем значение из бд
$findedKey = R::getAll('SELECT `category_key` FROM `items` WHERE `id_user` = ? and `category_key` = ?', [104, $unique]);
} else {
// если дублей не найдено, выводим уникальный ключ
echo $unique;
};
p.s.
Стоить только конкретная цель. Без альтернатив.
Сгенерировать ключ, проверить уникальность по сравнению с выгрузкой из БД и записать в БД, если он уникальный..