• Как поменять 2 функции в один класс?

    @Vitsliputsli
    ООП - это больше про объекты и их связи. Да, в какой-то степени боремся и с повторяемостью кода, но это не главное. Т.е. нужно смотреть на то, что это за объекты, если они родственные, то можно сделать абстрактный класс, но быть может больше подойдет инстанцирование в один класс разных объектов и вызов одноименной функции. А где-то вообще будет вызов динамический, а где-то быть может стоит и продублировать код. Все зависит от самих объектов и их связей.
    Ответ написан
    Комментировать
  • Добавление свойства без объявления свойства?

    @Vitsliputsli
    Это называется динамическое свойство, в php 8.2 признано устаревшим. Делать так не рекомендуется по очевидным причинам: мы описываем объекты классами для упорядочивания работы, чтобы точно знать, что и где лежит, когда в объекте свалено невесть что, работать с этим будет проблематично. И, к слову, напрямую в свойства тоже не рекомендуется писать.
    Ответ написан
    2 комментария
  • Как сделать дублер сервера?

    @Vitsliputsli
    Если делать самому, а не через облако в интернете, то самый простой способ - virtualIP для сервера приложений и standby сервер для СУБД.
    Ответ написан
    Комментировать
  • Какой тип для денежных данных?

    @Vitsliputsli
    Можно и float использовать, если вас не напрягает, когда вы добавляете 1 сатоши, а добавится 2. Прочитайте про числа с плавающей точкой.
    Как вариант использовать обычный int, decimal выглядит круто в базе, но в php вам придется использовать int и смысл decimal теряется.
    Ответ написан
  • Что может содержать DTO?

    @Vitsliputsli
    1) Цель использования DTO - это передать данные между двумя подсистемами. Причем, либо между ними нельзя передать поведение, либо мы хотим, чтобы они были независимы, а передача поведения увеличит зацепление.
    2) DTO - это специфика Java, там, объединить разнородные данные можно только в объекте. Поэтому был введен данный механизм - объект с искусственным ограничением, только данные и никакого поведения. Но, php не Java, здесь разнородные данные можно легко объединить в обычном массиве. Вы можете, конечно, массив завернуть в объект, но смысла в этом нет, т.к. мы передаем данные между независимыми подсистемами, ни одна из них не должна быть зацеплена на объекты другой.
    3) Как уже написали, сам DTO и механизм его формирующий - это разные вещи, подсистемы могут вообще на разных языках быть написаны, и все будет прекрасно работать, т.к. мы передаем только данные, а не поведение. Если же хочется туда запихнуть валидацию или иное поведение, стоит задуматься, а зачем здесь DTO? Не проще ли тогда сразу передавать полноценный объект.
    Ответ написан
    Комментировать
  • Почему условие не выполеяется?

    @Vitsliputsli
    empty($var) - это "синтаксический сахар", т.е. это краткая запись следующей конструкции:
    !isset($var) || $var == false
    т.е. кроме того же самого isset, там еще и сравнение с false, причем с преобразованием типов
    Ответ написан
    Комментировать
  • Зачем дублировать сеттер и геттер?

    @Vitsliputsli
    Если уж говорить об едином методе, то скорее так:
    function getSetAge(?int $age=null): int
    {
        if (!is_null($age)) {
            $this->age = $age;
        }
        return $this->age;
    }}

    Но, мы уже не сможем записать null, а получать значение, которые мы только что записали и вовсе не нужно.
    Даже так не делают, потому что, это логически совершенно разные операции и гораздо удобнее их разнести по разным методам. Если вы думаете, что упрощение - это меньше символов, то это не так. Упрощение - это разнесение независимых частей, а складывание всего в одну кучу только ухудшает чтение.
    Не говоря уже о том, что использование геттеров-сеттеров не очень хорошая практика, методы должны нести смысловую нагрузку, а не просто менять внутренние свойства, иначе это ничем не лучше публичных свойств. Хотя и тут тоже нужно без фанатизма.
    Ответ написан
    Комментировать
  • Хранить параметры продукта в бд или расчитывать налету?

    @Vitsliputsli
    Рассчитывать на лету. Курсы валют сохранять в отдельную таблицу и брать их оттуда для расчета. То же самое для скидок.
    Денормализация здесь не нужна, она ничего не даст, т.к. перемножить числа не проблема. А исторические данные все равно надо хранить.
    Ответ написан
    Комментировать
  • JSON в базе данных это норма для реляционных баз данных?

    @Vitsliputsli
    Можно, но с умом. При невысокой нагрузке, база данных скорее всего простит вам это. При высокой относитесь к json как к обычной строке, т.е. без всяких индексов и поисков по параметру внутри json, максимум когда выборка уже сделана, можно попросить СУБД выбрать нужный атрибут. Как бы PostgreSQL не агитировал за json, поиск по его внутренностям всегда будет хуже по производительности.
    Ответ написан
    Комментировать
  • Как некоторые пароли не ломают сайты или базы данных?

    @Vitsliputsli
    Хороший вопрос.
    Для того чтобы избежать этой проблемы память любой программы делят на 2 части: область кода и область данных. Программа может писать в область данных, но не в область кода. В области данных может лежать что угодно, что бы там ни было, оно не вызывает никаких действий, т.к. это не исполняемый код, поэтому ничего поломать не может.
    Часто бывает, что мы вынуждены в области данных хранить код, например для работы с СУБД, там хранится код SQL. Здесь безопасность контролирует программист, если он в этот код будет подставлять произвольные данные, то это может привести к поломке на стороне СУБД. В данном случае, это решается передачей кода SQL и изменяемых данных отдельно друг от друга.
    Ответ написан
    Комментировать
  • Как из текстового файла вывести 15 случайных строк?

    @Vitsliputsli
    Накидал вариант для поиска случайных строк в очень больших файлах. Это не совсем оптимально для конкртеного случая автора, но может быть будет кому-то интересно в других случаях.
    $fileName = '1.csv';
    $lineLength = 1024;
    $linesCount = 15;
    
    $handle = fopen($fileName, "r");
    $fileSize = filesize($fileName);
    $data = [];
    if ($fileSize !== 0) {
       for ($num = 1; $num <= $linesCount; $num++) {
           $rand = rand(0, $fileSize);
           fseek($handle, $rand);
           $firstPointer = null;
           do {
               fgets($handle); // trash
               $pointer = ftell($handle);
               if ($pointer === $fileSize) {
                   fseek($handle, 0);
                   $pointer = 0;
               }
               if ($pointer === $firstPointer) { // loop detect
                   continue 2;
               }
               $firstPointer = $firstPointer ?? $pointer;
           } while (array_key_exists($pointer, $data));
           $data[$pointer] = fgets($handle);
       }
    }
    ksort($data); // sort by order in file
    var_dump($data);

    Я здесь не делал защиты от ошибок файловых функций, в этом случае результат может быть неожиданным. Для защиты нужно обернуть все файловые функции и при ошибке выкидывать Exception, а не эти тупые php-шные false. Ну и помнить про ограничение длины строки в $lineLength.
    Ответ написан
    Комментировать
  • Как стоит организовать хранение данных mysql?

    @Vitsliputsli
    То есть что условно лучше - огромная таблица с кучей строк или же большое количество таблиц в бд?

    Очень правильный вопрос, но преждевременный.
    С точки зрения нормализации, да и просто нормального написания запросов - одна огромная таблица с кучей строк. Для ускорения поиска по ней есть индексы.
    Когда эта огромная таблица будет создавать проблемы, будете эти проблемы решать. При нормальном железе ориентироваться можно на 1млрд строк, обычно на таком кол-ве производительность InnoDB очень сильно деградирует. Кол-во ориентировочное, т.к. многое зависит от длины строки; при короткой строке, невысокой нагрузке и возможности ждать, будет работать.
    Ответ написан
    1 комментарий
  • В чём ошибка запроса?

    @Vitsliputsli
    create table help (key serial primary key, month int);
    insert into help (month) values (3),(8),(11),(4),(3);
    select month, div(month-1, 3)+1 res from help;
    Ответ написан
    Комментировать
  • Способ безопасного выполнения sql - запросов от пользователей?

    @Vitsliputsli
    выполнять сырые sql

    Любая СУБД предоставляет широкое управление доступом, поэтому вполне можно этим вопользоваться. Если учебные таблицы нужно только читать, то можно держать их в одном месте, ограничив доступ только на чтение. Т.к. менять данные они будут только свои, то лочить друг друга не смогут. Также надо посмотреть лимиты для кол-во данных, которые пользователи могут залить в БД. Лимитировать кол-во создаваемых БД.
    Несмотря на все, разумеется, лучше весь этот зоопарк держать на отдельной СУБД.
    Можно, конечно, сделать это и через контейнеры. Но такая изоляция здесь не особо нужна, а накладные расходы будут очень велики, если у вас не 2 пользователя.
    Ответ написан
    Комментировать
  • Почему телеграм бот отключается от БД после ночного простоя?

    @Vitsliputsli
    Так как соединение долго не использовалось, MySQL тупо его оборвал.
    Используйте для бота systemd unit с перезапуском при ошибке, ошибки бывают разные, пускай перезапускается автоматически. Хоть это и решит проблему, лучше все-таки разрывать соединение, если оно долго не используется. Или, на худой конец восстанавливать его при обрыве.
    Ответ написан
    Комментировать
  • Надо ли заливать код на GitHub back-end программисту?

    @Vitsliputsli
    Вполне могут попросить показать код, поэтому неплохо что-нибудь держать в github на такой случай. Интересоваться будут как вы пишите, а не как оно работает. В зависимости от языка, вашего уровня и адекватности проверяющего будут обращать внимание на разные вещи.
    "развитый GitHub" это когда там лежит что-то, что используют другие люди и чем большее кол-во, тем лучше. Или пулреки в крупные проекты. Если там будет гора бесполезного мусора, то это никому не интересно.
    Ответ написан
    Комментировать
  • Нужна ли общая таблица?

    @Vitsliputsli
    По требованиям описанным в задаче:
    запросы на исполнение услуги
    Users (Пользователи)
    -Id

    Services (услуги)
    -Id

    UserServices(услуга, которую может выполнить пользователь)
    -Id
    -User.Id

    Requests (запрос пользователя на услугу, которую требуется выполнить для него )
    -Id
    -Users.Id (запрашивающий пользователь)
    -Services.Id (запрашиваемая услуга)

    Responses (Отклики пользователя на предоставление услуги или на запрос)
    -Users.Id (откликнувшийся пользователь)
    -Requests.Id (запрос, на который отклкинулся)


    По требованиям, с учетом комментария "Пользователь может как откликнуться на заказ, так и выбрать исполнителя, не создавая свой заказ".
    поиск исполнителья или нанимателя
    Users (Пользователи)
    -Id

    Services (услуги)
    -Id

    UserServices(услуга, которую может выполнить пользователь)
    -Id
    -User.Id

    Requests (запрос пользователя на услугу, которую требуется выполнить для него )
    -Id
    -Users.Id (запрашивающий пользователь)
    -Services.Id (запрашиваемая услуга)
    -Status (статус: открыт или завершен)

    Deals (Заключенная сделка)
    -Users.Id (пользователь-наниматель)
    -Users.Id (пользователь-исполнитель)
    -Services.Id (услуга для исполнения)
    Ответ написан
    Комментировать
  • Можно ли взаимодействовать с функцией файла, не подключая ее?

    @Vitsliputsli
    Нет, нельзя.
    C# компилируемый язык, когда создаете новый файл, IDE подключает его в проект. При сборке файлы проекта известны и будут использоваться. PHP интерпретируемый язык, вы можете запустить на исполнение любой файл php, но он не имеет никакого понятия, что там было в IDE, поэтому использование require обязательно. На практике используют автолоадеры, стандартом в PHP считается автолоадер composer.
    Ответ написан
    Комментировать
  • Не хожу на работу, но меня не увольняют и не платят зарплату, как быть?

    @Vitsliputsli
    Ситуация мягко говоря странная, поэтому странные вопросы: проверьте, что у вас действительно заключен договор - есть ли у вас договор подписанный простой или электронной подписью? Понимаю, что там чтото на Госуслугах пишется, но все же. Договор трудовой или ГПХ? В порядке бреда: не может ли быть так, что на вас оформлена новая карта и зарплата идет туда. И, по новым законам, есть еще и волонтерство, с договором по котором работник несет такие же обязанности, что и по трудовому, но ему можно еще и не платить.
    В принципе, за нарушение дисциплины труда, вас могут уволить, если захотят, но видно не хотят. Но при этом, понятное дело, зарплату платить обязаны. За невовремя выплаченную зарплату компания попадает на штрафы. Также запрещается работа из-за пределов территории России. И очень большие штрафы, если работник числится в компании, но не является налоговым резидентом России.
    Это очень странная контора будет, если ей и на штрафы тоже плевать.
    Ответ написан
  • Как разбить строки на подстроку с разделителем в виде строки?

    @Vitsliputsli
    $s="fja fjd jkfd
    fjdk fjdktest: fjkd jk
    1 1 2"
    echo "${s%test:*}"
    echo "${s#*test:}"
    Ответ написан
    Комментировать