По моей логике куки будут установлены только в том случае если while = false Или установку кук вынести вообще с цикла ниже ? PHP: do { $session_id = bin2hex(random_bytes(16)); $test = mysqli_query($mysqli, "INSERT IGNORE INTO `".DB_PREFIX."_sessions` SET `id` = MD5('".$session_id."'), `ip_addrr` = '".$ip."'"); if(!$test) setcookie(COOKIE_PREFIX.'_session_id', $session_id, time() + MAX_LIFETIME); } while($test);
Вынести. А вообще подобный цикл – это зло. !$test – это неверно. Вообще проверку $test лучше убрать из основной логики (использовать исключение БД или общее при ошибке выполнения запроса), а если оставляете, то не нужно при ошибке устанавливать какие-то куки и т.п. (сделайте обычную обработку ошибки). В общем не пытайтесь основную логику строить на значении $test. Даже для обычного INSERT это зачастую сомнительная затея, а для INSERT IGNORE – практически наверняка ошибка. --- Добавлено --- Обычно в основной логике результат INSERT используется, как кол-во затронутых строк (см. свойство affected_rows)
PHP: $session_id = bin2hex(random_bytes(16)); while (true) { $test = mysqli_query($mysqli, "INSERT IGNORE INTO ".DB_PREFIX."_sessions SET id = MD5('".$session_id."'), ip_addrr = '".$ip."'"); if (!$test) { setcookie(COOKIE_PREFIX.'_session_id', $session_id, time() + MAX_LIFETIME); break; } $session_id = bin2hex(random_bytes(16)); } Немного отрефакторил: - Убрал ненужные фигурные скобки для операторов if и while, так как они не обязательны, если оператор содержит только одну инструкцию. - Заменил оператор do-while на бесконечный цикл while (true). Теперь цикл будет выполняться до тех пор, пока не будет выполнен break. - Перенес инициализацию $session_id в начало кода, чтобы избежать повторения кода в цикле. - Добавил break после установки куки, чтобы прервать цикл, если вставка в базу данных прошла успешно. - Заменил префикс COOKIE_PREFIX на фактический префикс, который должен быть использован при установке куки.