Задать вопрос
  • Как правильно подходить к возвращаемым типам функциях php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Хорошие вопросы.
    Разумеется, увеличивать количество запросов к БД ради красивой типизации - это абсолютно не вариант.

    Как можно увидеть, в приведенной цитате написано не однозначно, а "скорее всего".
    И поэтому надо конечно стараться, чтобы функция возвращала какое-то одно значение, но не делать этого любой ценой. Поэтому getUserDataFromDatabase вполне может возвращать array|false, а getUserIdFromDatabase - int|false, хотя я бы с ней не заморочивался, первой вполне достаточно. А userIsPresentInDb вообще не нужна, вместо неё можно использовать одну их предыдущих.

    Другое дело, что нужного результата можно добиться и другим способом.
    Ведь вполне можно вернуть пустой массив. И таким образом формально соблюсти типизацию.

    return $result ?: []; // дёшево и сердито

    Но это будет всё равно не очень красиво. В одной стороны - да, для проверки, вернула ли функция непустое значение, такой вариант вполне сгодится. Но с другой стороны все равно как-то неаккуратненько. Ведь мы на самом деле ждём не абы какой массив, а вполне определённый, с конкретным набором полей. То есть, если эта функция вернет массив вида [0, 42, 100500], то это будет явно не то, что нам нужно, но при этом типизация и слова поперёк не скажет.

    Если думать от типизации, то функция getUserDataFromDatabase, возвращающая какой-то абстрактный массив - это нонсенс, бессмыслица. Эта функция должна возвращать юзера. Поэтому в идеале надо придумать способ указать, что функция возвращает не абстрактный, а конкретный массив определенного формата. Тем более, что такой способ как раз есть, ведь типизованный массив - это же объект! И для данного случая даже специальный паттерн есть - ValueObject (хотя в случае с пользователем лучше будет все-таки делать полноценный класс, содержащий не только данные, но и методы, например auth(), который сравнивает хэш пароля с введенным).

    Соответственно, в идеале функция должна возвращать объект, представляющий пользователя.

    И уже в этом объекте поле id может либо либо быть нулём, либо иметь какое-то положительное значение. Или даже объект может содержать отдельное свойство, заполнен/не заполнен.

    И вот в этом случае типизация заиграет совсем новыми красками, и будет использоваться на 100%
    function getUserFromDb( int $userId ) : UserObject {
            return $result ? UserObject::fillFromArray($result) : new UserObject();
    };
    $user = getUserFromDb();
    if (!$user->id) {
        // нинашли :'(
    }


    Но опять же, как пишет ниже Сергей delphinpro, зависит от задачи.
    И решив проблему правильной типизации значения, которое функция вернет, если нашла пользователя, можно вернуться к вопросу о том, что возвращать, если функция ничего не нашла. И в этом случае вполне подходящим вариантом будет вернуть null
    function getUserFromDb( int $userId ) : ?UserObject {
        return $result ? UserObject::fillFromArray($result) : null;
    };
    
    if ($user = getUserFromDb()) {
        // нашли :)
    }
    Ответ написан
    6 комментариев
  • Как сделать сделать поиск по строке php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    stripos и strpos работают правильно

    А если вам вдруг кажется, что они работают неправильно, то надо привести пример.
    И тогда вам сразу объяснят, что вы делаете неправильно
    Ответ написан
    4 комментария
  • Почему не срабатывают свойства background?

    Lynn
    @Lynn
    nginx, js, css
    https://developer.mozilla.org/ru/docs/Web/CSS/back...

    Сокращённое CSS свойство background устанавливает сразу все свойства стиля фона


    Используйте в атрибуте style свойство background-image.
    Ответ написан
    Комментировать
  • В IE не работает mask-image, что делать?

    Делай на IE что-то по проще, без mask-image.
    Ничего плохого не случится, если пользователи IE получат не тот сайт, который задумал дизайнер.
    Ответ написан
    Комментировать
  • Как написать цикличный таймер?

    Stalker_RED
    @Stalker_RED
    Напишите список ваших задач, или периодов, или как их там. В них храните либо длительность, либо время начала и окончания, как вам удобнее.

    Напишите ОДИН setInterval, который сравнивает текущее время со временем старта или конца ваших периодов.

    Конструкции типа time-- идут лесом.
    Потому что и setInterval и setTimeout не гарантируют время срабатывания. Они работают "не раньше чем", а позже - запросто. Только хардкор: const now = new Date() на каждом тике таймера.

    Всякие циферки для отображения вычисляются из разницы между now и start или end, математика простейшая.
    Ответ написан
    Комментировать
  • Как написать условие - диапазон вне диапазона?

    Stalker_RED
    @Stalker_RED
    (x<a && y<a) || (x>b && y>b)
    То есть обе границы первого диапазона меньше, или больше, чем границы второго.
    Если известно, что x всегда меньше, чем y, то можно короче
    y<a||x>b
    Ответ написан
    3 комментария
  • Где JWT хранит свой токен на сервере?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Серверу не надо хранить рабочий JWT. Он просто берёт две первые части токена, вычисляет подпись, сравнивает с расшифрованной подписью токена и убеждается, что токен настоящий.
    Ответ написан
    Комментировать
  • Как результат foreach поместить в переменную?

    kawabanga
    @kawabanga
    $itemstest[] = [
                    'item_sku' => $product->get_sku(),
                    'item_title' => $product->get_name(),
                    'item_quantity' =>  $item_data['quantity'],
                    'item_price' => $product->get_price()
                ];
    Ответ написан
    2 комментария
  • Как стилизовать только пустой SELECT в CSS?

    MrDecoy
    @MrDecoy Куратор тега CSS
    Верставший фронтендер
    Через css, пожалуй только с помощью :not(:has) - браузерная поддержка не полная. Проверяйте перед использованием.
    Либо поправить шаблон чтобы не было переноса строки внутри пустого селекта, тогда будет работать :empty.



    Иначе только на js обходить селекты, возможно через mutation observer и накидывать нужный класс для стилизации
    Ответ написан
  • Как восстановить файлы после reset --hard?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Восстановить очень легко, так как гит ничего не удаляет из репозитория, по крайней мере сразу.
    Команда reset лишь переместила указатель ветки. Полностью удалить что-то крайне сложно.
    Вы можете посмотреть через git reflog где был указатель до этого и вернуть его туда обратно.
    git reset --hard HEAD@{1}
    Данная команда вернёт ветку на состояние, помеченное на вашем скрине как HEAD@{1}
    Либо можно скопировать непосредственно sha-хэш места, куда хотите вернуться.

    Затем повторить отмену последнего коммита, но уже правильно:
    git reset HEAD~1
    Такая команда не будет изменять рабочий каталог, а значит ничего из него не удалит.
    Ответ написан
    1 комментарий
  • Как не дать права на SELECT?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это называется "доступ по API".
    Вместо прямого соединения с БД, "скрипт" отправляет запросы на удаленный веб-сервер, причем не SQL запрос, а какой-нибудь JSON. А уже приложение на веб-сервере соединяется с БД и отправляет запрошенные данные назад.
    Это приложение будет и ключ проверять, и права доступа - какому пользователю какие данные можно отдавать.
    Именно по такой схеме например работают мобильные приложения в вашем телефоне.
    Ответ написан
    Комментировать
  • Как скрыть строку *?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    mb_substr($string, 0, 2) . str_repeat('*', mb_strlen($string) - 3) . mb_substr($string, -1)
    Ответ написан
    3 комментария
  • Почему ПК фризит на логотипе материнской платы, если вставлен USB модем?

    @Loggus66
    Идёт опрос загрузочных устройств, в т. ч. флэшек, и модем тормозит с отдачей содержимого своего диска. Я б предложил по возрастанию сложности идей: вытащить оттуда SD-карточку/перешить AT-командами в "только модем", или как-нибудь из интерфейса драйвера это сделать/купить USB-хаб с выключателем порта и отключать уже его.
    Ответ написан
    Комментировать
  • Отчего зависит скорость при скачивании файлов?

    @Drno
    Manager качает в несколько потоков. Как и стим. (Потому что это торрент по сути)
    Хром обычно качает в 1 поток
    Видимо провайдер ограничивает скорость одиночного соединения
    Ответ написан
    Комментировать
  • Отчего зависит скорость при скачивании файлов?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    менеджеры закачки используют заголовок Content-Range что позволяет качать в несколько потоков.
    Сервера же могут ограничивать скорость для одного клиента в каких то границах.
    Ответ написан
    Комментировать
  • Какую CMS выбрать для разработки интернет-магазина с такими вводными?

    mahmudchon
    @mahmudchon
    ИМ на WP, с учетом 100к товаров, как Вы указали в комментарии к соседнему ответу - это полный провал, просто хотя бы потому, что сама по себе структура таблиц в базе у WP на такое не рассчитана.
    ИМ на WP существуют на базе тех же woocommerce просто из-за высокой популярности самой CMS, но никак не из-за того, что это отличное решение.
    Opencart в этом плане - не плохой вариант, при том, что написан вообще очень просто. Можно взять его за основу и дорабатывать. Там код действительно интуитивно понятный.
    Ответ написан
    8 комментариев
  • Как предотвратить появление битых файлов?

    @rPman
    Переназначенные сектора raw значение 0, значит по smart диск здоровый и высокая вероятность что проблемы с данными - логические.

    Постоянная смена windows <-> другая операционная система чревата проблемами из-за windows.
    Начиная с windows 8 в ней по умолчанию включен режим гибернации - запись оперативной памяти на диск для моментального ее восстановления после включения, даже когда пользователь выбирает выключение компьютера или перезагрузку, при включенном файле гибернации происходит следующее - завершаются процессы пользователя и делается гибернация (на самом деле там сложнее, зависит от необходимости служебной перезагрузки после обновления например), при включении соответственно система моментально восстанавливает оперативную память и переходит к запуску пользовательской сессии.

    Именно этим они достигли такой высокой скорости запуска системы.

    Как результат - файловая система при выключении компьютера может находиться в неконсистентном состоянии, не сброшены кеши, не закрыты дескрипторы и не сброшены буфера файлов. Если в таком состоянии к диску полезет (на запись) другая установка ОС (не важно, linux/mac или другой windows) то возможна ситуация, когда логическая структура файлов на диске будет повреждена (это показывает тот факт что чекдиск у тебя уже находил проблемы).

    Ситуация не абстрактна, такое случается у многих постоянно (только почему то люди начинают винить linux типа он неправильно файлы пишет).

    Решается отключением файла гибернации (как результат медленное включение windows) командой в cmd.exe под правами администратора:
    powercfg.exe /hibernate off
    После можно файл hiberfil.sys удалить вручную

    p.s. логические ошибки файловой системы коварная штука, могут годами быть в файловой системе и не мешать (полный чекдиск не запускается сам) но зато потом так 'выстрелит', мало не покажется.
    Очень большие шансы что у тебя именно это и случилось
    Ответ написан
    3 комментария
  • Безопасность в Laravel. Как обработать ошибку хождения по путям через адресную строку?

    Adamos
    @Adamos
    Если просто отключить Debug mode, сайт будет выдавать нормальную 404, которой для подобных "заблуждений" (а скорее - долбежки ботами) вполне достаточно.
    Ответ написан
    1 комментарий