• Как сделать чтобы не появлялся вертикальный скролл когда открывается выпадающее меню?

    @enibeniraba
    Например, так:
    codepen.io/anon/pen/zvaLKL
    Убрать position: relative у .select и добавить код:
    $(function()
    {
      $('.select').on('shown.bs.dropdown', function() {
        var $button = $("a", this).first();
        var offset = $button.offset();
        $(".dropdown-menu", this).css({
          top: offset.top+$button.outerHeight(),
          left: offset.left
        });
      });
    });

    Еще jQuery UI расширяет метод position(), с помощью которого можно устанавливать позицию относительно любого элемента (https://jqueryui.com/position/).
    Еще можно убрать в вашем примере overflow-x у .block вместо всего вышеперечисленного.
    Ответ написан
  • По какому полю сделать группировку?

    @enibeniraba
    select user_id, date_format(datetime, "%Y-%m-%d") as day, if (date_format(datetime, "%k") between 10 and 21, 'день', 'ночь') as day_time, count(*) .... group by user_id, day, day_time
    Только здесь ночная смена считается не 22-10, а 0-10 + 22-0
    Хотя можно и 22-10 наверно правильно посчитать, если пару часов прибавить к datetime: datetime+7200.
    Ответ написан
    Комментировать
  • Как правильно написать авторизацию/аутентификацию?

    @enibeniraba
    Очень сильно упрощенно, без ООП и паттернов):
    Авторизация:
    session_start();
    if (!empty($_SESSION['user_id']))
    	die('Вы уже авторизованы');
    	
    $user = get_user_by_login($_POST['login']);
    if (!$user)
    	die('Пользователь не найден');
    	
    if ($_POST['pass'] !== $user['pass'])
    	die('Неверный пароль');
    
    $_SESSION['user_id'] = $user['id'];
    die('Привет, '.$user['login']);

    При этом в куки пользователя запишется session_id, а в сессию user_id.

    Проверка:
    session_start();
    if (empty($_SESSION['user_id']))
    	die('Нет прав');
    
    $user = get_user_by_id($_SESSION['user_id']);
    if (!$user || !$user['active'])
    {
    	unset($_SESSION['user_id']);
    	die('Нет прав');
    }


    Выход:
    session_start();
    unset($_SESSION['user_id']);


    Если нужен доступ только с одного устройства (последнего, с которого был вход), то храним на сервере последнюю сессию пользователя и при каждом запросе:
    if ($user['session_id'] !== session_id())
    {
    	unset($_SESSION['user_id']);
    	die('Нет прав');
    }


    Если с нескольких, то делать ничего не нужно.

    При oauth авторизации через внешние сервисы в сессии и куках будет все то же самое.
    В бд добавятся 2 поля auth_provider и auth_provider_id.
    В auth_provider у тебя будет vk или fb или google... в auth_provider_id - id пользователя в vk, fb...
    Когда юзер нажимает кнопку войти через vk, ты его редиректишь на контакт. Там он что-то делает. Потом контакт его редиректит к тебе с ?code=request_code.
    Ты используя code делаешь запрос к api контакта на получение access_token.
    Получив access_token, делаешь запрос к api на получение инфы о пользователе. В этой инфе должен быть какой-нибудь уникальный id (auth_provider_id).
    Если у тебя нет пользователя с таким auth_provider_id для провайдера vk, то создаешь его либо без логина, либо генерируешь что-нибудь, без пароля.
    Если пользователь был создан или он был до этого, помещаешь в сессию user.id и считаешь пользователя авторизованным.

    PS:
    По каждой строчке ответа есть нюансы, но думаю общая картина такая.
    Естественно лучше написать класс для пользователя, чтобы использовать что-то вроде:
    $user->is_auth();
    $user->auth_by_id($user_id);
    $user->unauth();
    Ответ написан
    13 комментариев
  • Какое регулярное выражение для разделения текста, между маленькой и Заглавной буквой?

    @enibeniraba
    Частный случай предыдущего ответа для php и юникода + буква Ё:
    preg_replace('/([а-яё])([А-ЯЁ])/u', '$1 $2', 'ВеликаЖитомерська')
    Ответ написан
    Комментировать
  • Выбор тихого кулера

    @enibeniraba
    Сам долго выбирал. В итоге остановился на Thermalright True Spirit 140. Его вообще не слышно. Но у него есть недостаток - он высокий (170мм) и не во всякий корпус влезет. Хорошие обзоры подтвердились личным опытом.
    Ответ написан
    Комментировать