Задать вопрос
  • Определение значений передаваемой в функцию переменной типа массив?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это один из тех вопросов новичков, на который нельзя давать прямой ответ. Он превратится в пустое умствование и говнокод. Соглашусь с комментарием Дмитрий: тут просто не нужен массив. И тем более не нужно городить огород из абстракций. Тут явно нужен банальный VO/DTO, а автору надо перестать пытаться заворачивать привычные массивы в солидно выглядящие объекты, и начать использовать сами объекты.

    Если нам нужна конкретная структура, то и описываем её в конкретном классе, безо всяких интерфейсов:

    final readonly class Parameters
    {
        public function __construct(
            public string $key1,
            public int $key2,
            public DateTimeImmutable $key3,
        ) {}
    }
    public function execute(Parameters $parameters):


    В итоге у "стороннего разработчика" есть готовая документация - простое и понятное определение класса, экземпляр которого он должен передать в ваш метод. И уже на этапе создания этого объекта РНР надаёт разработчику по рукам, если хоть какое-то свойство не будет задано, или будет не того типа. При желании можно в конструктор добавить дополнительную валидацию, если просто типа недостаточно.

    При этом если внутри execute() вдруг зачем-то понадобится обратиться к свойствам именно как к массиву, то использовать волшебную функцию get_object_vars().

    Если же речь про валидацию входящих данных, то это вообще совсем другой вопрос.

    Для этого есть либо стандартные валидаторы, когда на вход подаётся массив и набор правил, вот например как в ларавле, симфони или в десятке отдельно стоящих библиотек, а на выходе - или гарантированно валидная структура данных, или ошибка.

    Либо готовые библиотеки десериализации, когда входящий JSON автоматом мапится на существующий объект, и в итоге получается или либо гарантированно валидный объект, или ошибка.

    В этом случае документацией для обоих вариантов является сваггер, а фидбеком - ошибки валидатора.
    Ответ написан
    Комментировать
  • Раздать Wi-Fi с обычного кабельного компа на складе, что купить?

    @Joyz
    Возьмите дешевый роутер, в него воткните кабель с интернетом вместо компьютера, а дальше уже провод к компьютер.
    Ответ написан
    2 комментария
  • По порту 8080 php не работает?

    402d
    @402d
    начинал с бейсика на УКНЦ в 1988

    Файл php вложен в локальный web-сервер на Tomcat от одной СЭД (дабы не поднимать второй web-сервер в сети).

    Проще поднять второй сервер.
    Или перепишите на java скрипт.

    Googlиapache tomcat & php together
    Но фактически получиться схема.
    Проки(nginx или апач) за ним два бакенда (для JAVA-томкат и PHP)
    Ответ написан
    Комментировать
  • Как установить Ubuntu без флешки?

    @rPman
    Установить linux - это значит установить загрузчик (который запускает linux после bios) и собственно скопировать файлы.

    В современных реалиях на x86 машинах есть 3 способа загрузки:

    1. legacy dos (еще называют compatibility support mode или csm и т.п.)
    загрузчик прописывается на физическом диске в первом секторе раздела плюс рядом (для таблицы разделов mbr это первые сектора, для gpt специальный 1мб раздел bios boot)
    Соответственно для загрузки необходимо в биосе выбрать диск, с которого производить загрузку (или указать порядок).
    grub автоматически прописывает этот способ, если uefi не доступен

    2. UEFI
    Специальный раздел efi boot (формат fat32) примерно 100мб должен содержать файл xxx.efi который уже запускает систему соответственно своей логике.
    'Благодаря' майкрософту, информация о том, с какого диска нужно продолжать загрузку, прописывается в самом биосе, т.е. при изменении конфигурации (например замена диска), установки ОС и т.п. нужно прописать специальной программой в биосе загрузочную запись (и кстати на некоторых материнках производитель гвоздями прибил совместимость только к майкрософтовскому bcdboot.exe из режима восстановления, а остальные способы могут не работать, даже из windows), обычно grub при установке делает это автоматически
    Но главное, в режиме secure boot (который часто вообще нельзя отключить) файлы .efi должны быть подписаны майкрософтом (на дорогих моделях материнок можно свою подпись добавлять), т.е. linux вы запускаете так же с разрешения майкрософта.
    Единственный случай, когда запись о загрузчике в биосе может отсутствовать, это removable drives.
    На засыпку, никакие утилиты не имеют доступ к UEFI, если система не запущена в режиме UEFI, т.е. использовать флешку придется как минимум один раз.

    3. загрузка по сети, ее еще называют по технологии PXE
    p.s. ее есть что то у серверных ipmi ну и разные альтернативы removable drives

    Если достаточно использования legacy dos режима, то есть лайфхак, как установить систему из другой системы - использовать виртуальную машину (в новых windows 10 и старше не получится поставить загрузчик на системный диск, даже на другой раздел, типа защита, но можно на другой физический диск), просто пробросив физический диск в виртуалку и провести установку с виртульного cdrom а затем перезагрузить хост машину, указав в биосе этот диск как загрузочный.

    upd. оказывается в материнках может быть режим UEFI Network Stack (или аналогичный), это режим загрузки UEFI PXE, получается достаточно в локальной сети настроить соответствующий сервер, загрузиться в linux и прописать загрузочную запись UEFI, т.е. флешка не потребуется.
    Ответ написан
    Комментировать
  • Как сделать список с которым можно будет работать в консоли?

    ThunderCat
    @ThunderCat Куратор тега Веб-разработка
    {PHP, MySql, HTML, JS, CSS} developer
    1) Указывайте язык, который используете, телепаты в отпуске. Ок, из кода понятно что питон, но в вопросе об этом ничего не написано.
    2) Так как структура данных у вас хранится в коде (что однозначно не айс), подойдут словари с соответствующей вложенностью - регион : области. Из него через .keys() и list() получаем регионы, а по регионам уже и области в виде списка получить можно. Алсо, я бы хранил словарь в отдельном файле как json, что сделает работу с кодом независимой от данных.
    3) Все еще не вижу причин издеваться над пользователем через консоль. Страничка с 2 полями и запрос на сервер, вроде в питоне даже свой какой-то вебсервер есть искаропки.
    Ответ написан
    Комментировать
  • Как перенсти ОС с HDD на SSD?

    hint000
    @hint000
    у админа три руки
    Можно ли из под Windows перенести
    Не надо из под Windows. Надо из самого Debian.
    1.1. через sfdisk выгрузить дамп таблицы разделов HDD в текстовый файл;
    1.2. поправить размеры разделов (если несколько разделов ext4, то с учетом их заполненности), чтобы суммарно влезло на 120 ГБ (на самом деле нужно через fdisk -l проверить точный размер SSD в мегабайтах; возможно, там чуть меньше, чем 120 ГБ);
    1.3. через sfdisk залить исправленную таблицу разделов на SSD;
    2. сделать обычное пофайловое копирование ext4-разделов с HDD на SSD, а лучше потоковое копирование через tar (dd не годится, потому что размеры разделов уменьшились);
    3. скопировать через dd первый сектор диска, в который обычно ставится grub;
    4. если есть раздел EFI, то его целиком скопировать через dd;
    5. PROFIT
    Когда у вас Linux, то для такого переноса даже не требуется cпециальное ПО, всё можно сделать стандартными средствами Linux.

    P.S. Не помешает перед копированием файлов перемонтировать файловые системы на HDD в режиме read-only.
    Ответ написан
    Комментировать
  • "Y: команда не найдена" - в чем может быть дело?

    CityCat4
    @CityCat4
    Жил да был черный кот за углом...
    Вот что бывает, когда ставишь нечто по какому-то там гайду, который не понимаешь от слова совсем. Интересно, если в этом гайде будет присутствовать патч Бармина, который тоже спросит y/n? - тоже ответите y?
    Ответ написан
    3 комментария
  • Dell PowerEdge R760 что выбрать SAS или NVME?

    nops
    @nops
    Системный инженер.
    1. вместо RAID6 я бы собрал RAID50, у него выше производительность. Фактически полезный объем останется тем же, а скорость выше.
    2. В сервер Dell тебе нужно установить контроллер, который будет поддерживать U.2 диски, только тогда ты сможешь установить U.2 NVMe диски. Кроме того, обязательно контроллер должен уметь строить RAID-массивы из U.2 дисков. И это еще не все. Одновременно в бекплейне ты не сможешь использовать и U.2 и SAS диски. Бекплейн подключается разными кабелями к контроллеру, для использования либо тех, либо других дисков.
    3. диски PM1653 я бы не стал наверное использовать, тк есть более интересный вариант, например SSD KIOXIA . Посмотри, сравни характеристики.
    4. Давай разберемся, для чего вы собираете сервак. Какая планируется нагрузка, под какие задачи и тд. Из недавнего. Мы недавно прикупили ASUS, в него установили как раз SSD SAS KIOXIA и получили на выходе 60ТБ в рейде. На него реплицируются SQL-базы и отрабатывают фоновые и регламентные задания порядка 10 баз размером от 1 до 6 ТБ.
    Если у вас не планируется огромная нагрузка на дисковую подсистему, если на нем одновременно в 1С не будет работать тысячи полторы пользователей, переписанная до нельзя база не занимает пару-тройку терабайт, то вам вполне будет достаточно и SAS. Если планируемая нагрузка будет только расти и быстро, то NVMe вам помогут жить, однако, в таком же бюджете это не будут супер скоростные диски.
    Все зависит от потребностей.
    Ответ написан
    8 комментариев
  • Небольшой сайт и админ панель на .NET?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    что за действия там пользователи буду делать - пока нет конкретики

    Без тз - результат хз.
    смотрю в сторону связки asp+bootstrap, при беглом поиске все шаблоны админок очень нагруженные

    Что мешает удалить лишние блоки?
    Может посоветуете что именно искать или вообще другой вариант реализации предложите?

    Если знаний на фронте минимум, то лучше либо готовое что то использовать, по типу Bootstrap, либо какую то CMS, не обязательно на .NET
    Ответ написан
    Комментировать
  • Почему при cURL-запросе нельзя отправлять файл более полутора Мб?

    @rPman
    а настройки php?
    upload_max_filesize = 100M
    post_max_size = 100M
    memory_limit = 256M

    каким кодом файл принимаете?
    Ответ написан
  • Имеет ли значение порядок связывания таблиц левым соединением?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Будет ли разница в результате между двумя вариантами

    Да. См. fiddle
    CREATE TABLE a SELECT 'a' x UNION SELECT 'b';
    CREATE TABLE b SELECT 'a' x UNION SELECT 'c';
    CREATE TABLE c SELECT 'b' x UNION SELECT 'c';

    select a.*, b.*, c.*
    from a left join b using (x) left join c using (x)

    x	x	x
    a	a	null
    b	null	b

    select a.*, b.*, c.*
    from a left join (b left join c using (x))  using (x)

    x	x	x
    a	a	null
    b	null	null


    Есть ли какое-то правило, которое определяет порядок связывания таблиц?

    Да. Порядок связывания определяется требуемой логикой.

    PS. В качестве самостоятельного задания - найди истинную причину разницы.

    PPS. При абсолютной эквивалентности обеих форм - разницы нет.
    Ответ написан
    2 комментария
  • Как решить проблему с сессиями?

    karabanov
    @karabanov
    Системный администратор
    if (isset($_SESSION['user'])) {
        echo "User is logged in!"; // Этого здесь быть не должно
        header('Location: ./index.php');

    Заголовки отправляются до тела ответа, потом отправлять их бесполезно. В логах наверняка Fatal есть на этот счёт. Пробелов или иных символов перед <?php тоже быть не должно.

    Надо или обеспечить отсутствие какого либо вывода до отправки заголовков, либо буферизовать вывод.
    Ответ написан
    2 комментария
  • Можно ли спрятать процесс на дистрибутивах GNU\Linux?

    @rPman
    Функционально такой вирус создать конечно же можно, мало того, на linux все вышеописанное даже легче реализовать, за небольшим исключением.

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

    Пример путей проникновения - win-way пути запуска их как скачал-запустил, например .AppImage образ, изначально в нем должна поддерживаться песочница, но большинство примитивных приложений что я смотрел типа чат для ИИ (chatbox тот же) - требуют для запуска необоснованное отключение песочницы.

    Или к примеру смотришь, а приложение не запускается, требует suid флаг на бинарник,.. (тот же proton если запускать из lutris) и в лучшем случае ты нагуглишь инстуркции но никак не гарантии что после этого в систему не будет установлен троян.

    Запуск приложений что в windows что в linux это вопрос ДОВЕРИЯ их разработчикам. Отличный пример rustdesk, опенсорс, но это приложение столько телеметрии отправляет (а в исходниках бинарники забиты) а еще на глюке начинает нагружать одно ядро процессора тупо в цикле ps запускать. Есть песочницы по типу snap/flatpak а так же штатно lxc, но интерфейс для их использования не для обывателя (нужно в консоли писать команды, с неудобной документацией по настройке прав доступа и т.п.) поэтому пока это не изменится, linux будет таким же дырявым с точки зрения простоты заражения как и windows.
    Ответ написан
    1 комментарий
  • Авторизация PHP. Как исправить Warning: Undefined array key "login" in?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Данная ошибка может возникать в двух случаях:
    - если вы обращаетесь к этому скрипту напрямую, а не как к обработчику формы
    - если в форме были ошибки, и она тупо не передаёт поля login и pass методом POST.

    Чтобы исправить первый вариант, и вообще для порядка, надо добавить проверку на метод POST.
    Чтобы получить помощь для второго варианта, надо догадаться добавить в свой вопрос код формы.

    В целом же, эта авторизация будет бессмысленной, даже когда заработает. Поскольку любой придурок легко авторизуется без пароля, тупо через SQL инъекцию. Очердной пример того, что учить программирование "по видео из интернета" - это пустая трата времени
    Ответ написан
    1 комментарий
  • Изучение php с нуля для верстальщика?

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

    Лучше потратьтесь на книжку, Джон Дакетт, PHP&MySQL. Там очень толково, на примерах даётся не только язык, но и все важные аспекты программирования - обработка ошибок, отладка, рефакторинг, структура приложения, SQL, обработка изображений, и куча всего остального. В последних главах весь материал даётся на примере создания простой но рабочей социальной сети.
    Ответ написан
    1 комментарий
  • Изучение php с нуля для верстальщика?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Есть ли смысл начать с устаревшего материала?
    4-5 лет не сказать что сильно устаревшие. ИМХО спокойно можно учиться, основы будут одинаковы для любой версии языка, изменения в новых версиях большей частью касаются ООП составляющей, до которой еще дойти нужно. В целом и ООП код более старых версий совместим с последними версиями, во всяком случае с 5+, в обратную сторону конечно же работать не будет. Ну а новые фишки по типу тайпхинтинга и анонимных объектов можно доучить и самостоятельно.
    Ответ написан
  • Кривая работа функции date php?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Неделя начинается с понедельника и идентифицируется своим порядковым номером в году. Первой календарной неделей года считают первую неделю, содержащую первый четверг текущего года. Последней календарной неделей календарного года считают неделю, которая предшествует первой календарной неделе следующего года. ISO 8601.
    Соответственно, 2024-12-29 - воскресенье, последний день последней, 52-й недели года.
    2024-12-30 - понедельник, входящий в неделю, где четвергом является 2025-01-02, то есть в первую неделю 2025 года.
    Ответ написан
    6 комментариев
  • Почему PHP выполняет математические операции неправильно?

    Vamp
    @Vamp
    Потому что типом данных double нет возможности представить число 0.58. Поэтому компьютер берёт наиболее близкое к 0.58 число, которое double может выразить.

    Если вам нужны точные вычисления, то следует воспользоваться специальными функциями:

    $format = bcdiv("580000000", "1000000000", 2); // "0.58"
    
    var_dump(bcmul($format, "100")); // string(2) "58"


    Существует даже специальный сайт, рассказывающий о данной особенности математики чисел с плавающей запятой: https://0.30000000000000004.com/
    Ответ написан
    Комментировать
  • Почему PHP выполняет математические операции неправильно?

    Коротко - потому что IEEE 754

    Выполняет он математические операции правильно, но некоторые числа компьютер просто не способен представить со 100% точностью, тк для них нужно было бы бесконечное количество памяти.

    Точно также, как мы не можем записать все цифры числа 1/3 в десятичной системе, точно также и компьютер иногда не может записать все цифры в двоичной.

    Если ты работаешь с деньгами, то тогда используй то, что делают все банки - представляй суммы денег не как дробные числа, а как целые. Например место 1.5 рублей записывай как 150 копеек. Запятую добавишь при выводе человеку.
    btw тут в комментах пишут, что для денег тоже есть паттерн по-лучше конкретно для php.

    Если при делении у тебя получилось дробное количество копеек - округляй так, как велит закон.

    Если ты делаешь какие-то математические вычисления - возможно тебе нужны рациональные числа.
    Не знаю, что обычно для этого в пхп используют, но нагуглил https://github.com/webgriffe/rational
    https://github.com/markrogoyski/math-php

    Но в случае с целыми числами ты всё равно можешь упереться в ограничение на максимальное число, а в случае с рациональными числами ты получишь очень сильную просадку в производительности.

    Если тебе критически важна скорость, а точность - не так важна, то оставайся на IEEE754 и просто округляй то N значимых цифр (обычно больше 5 цифр мало кому нужно)
    Ответ написан
    13 комментариев