За последние 24 часа нас посетили 37690 программистов и 8114 роботов. Сейчас ищут 1699 программистов ...

Установка кук

Тема в разделе "PHP для новичков", создана пользователем Неугомонный, 21 сен 2023.

  1. Неугомонный

    Неугомонный Активный пользователь

    С нами с:
    10 фев 2018
    Сообщения:
    192
    Симпатии:
    3
    По моей логике куки будут установлены только в том случае если while = false Или установку кук вынести вообще с цикла ниже ?
    PHP:
    1. do
    2.      {
    3.          $session_id = bin2hex(random_bytes(16));
    4.          $test = mysqli_query($mysqli, "INSERT IGNORE INTO `".DB_PREFIX."_sessions` SET `id` = MD5('".$session_id."'), `ip_addrr` = '".$ip."'");
    5.          if(!$test)          setcookie(COOKIE_PREFIX.'_session_id', $session_id, time() + MAX_LIFETIME);
    6.      }
    7. while($test);
     
  2. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    656
    Вынести. А вообще подобный цикл – это зло.

    !$test – это неверно. Вообще проверку $test лучше убрать из основной логики (использовать исключение БД или общее при ошибке выполнения запроса), а если оставляете, то не нужно при ошибке устанавливать какие-то куки и т.п. (сделайте обычную обработку ошибки). В общем не пытайтесь основную логику строить на значении $test. Даже для обычного INSERT это зачастую сомнительная затея, а для INSERT IGNORE – практически наверняка ошибка.
    --- Добавлено ---
    Обычно в основной логике результат INSERT используется, как кол-во затронутых строк (см. свойство affected_rows) ;)
     
    #2 miketomlin, 22 сен 2023
    Последнее редактирование: 22 сен 2023
  3. konkin_ivan

    konkin_ivan Активный пользователь

    С нами с:
    28 июн 2013
    Сообщения:
    9
    Симпатии:
    2
    Адрес:
    х Калиновский
    PHP:
    1. $session_id = bin2hex(random_bytes(16));
    2.  
    3. while (true) {
    4.     $test = mysqli_query($mysqli, "INSERT IGNORE INTO ".DB_PREFIX."_sessions SET id = MD5('".$session_id."'), ip_addrr = '".$ip."'");
    5.    
    6.     if (!$test) {
    7.         setcookie(COOKIE_PREFIX.'_session_id', $session_id, time() + MAX_LIFETIME);
    8.         break;
    9.     }
    10.    
    11.     $session_id = bin2hex(random_bytes(16));
    12. }
    Немного отрефакторил:
    - Убрал ненужные фигурные скобки для операторов if и while, так как они не обязательны, если оператор содержит только одну инструкцию.
    - Заменил оператор do-while на бесконечный цикл while (true). Теперь цикл будет выполняться до тех пор, пока не будет выполнен break.
    - Перенес инициализацию $session_id в начало кода, чтобы избежать повторения кода в цикле.
    - Добавил break после установки куки, чтобы прервать цикл, если вставка в базу данных прошла успешно.
    - Заменил префикс COOKIE_PREFIX на фактический префикс, который должен быть использован при установке куки.