Профиль пользователя заблокирован сроком с 3 января 2023 г. и навсегда по причине: систематические нарушения правил сервиса
  • Как скопировать ascii?

    Шрифт должен быть обязательно моноширным, чтобы ширина пробела была такой же, как и у всех остальных знаков.
    У тебя он явно не такой.
    Ответ написан
    Комментировать
  • Проектирование БД на sqlite3, как правильно спроектировать некоторые таблицы?

    Вопрос №1 нужно ли для каждой таблицы создавать дополнительные таблицы для связи многие ко многим. Потому что по сути над слябом/деталью может выполнятся несколько работ, каждая работа из таблицы works может быть выполнена над каждым слябом/деталью?

    Если по вашей предметной области такое возможно, то да.
    Если нет, то нет.

    Вопрос №2 могу ли я например сделать столбец id_slabs_works но он будет пустым например если столбец id_details_works будет заполнен и наоборот?

    В теории - конечно можешь.
    Но возникает встречный вопрос.
    Если слэб и деталь (кстати, в твоём случае это part, а не details) по факту одни и те же атрибуты, то может их имеет смысл обобщить и засунуть в одну таблицу?

    Вопрос №3 если мне нужно фиксировать когда сотрудник начал работу над деталью и когда закончил получается что нужно отдельная таблица?

    Ну у тебя есть некоторый заказ и N смен, во время которых у тебя этот заказ выполняется. Раз нужно эти смены фиксировать - значит нужна таблица для них.

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

    Вполне нормальное решение.
    Рабочий начинает смену - в неё записывается время начала и статус "в работе".
    Рабочий завершает смену - в неё записывается время завершение и статус "завершена".

    Не думаю, что тебе следует заморачиваться с концепцией event sourcing.
    Ответ написан
    Комментировать
  • Чему изначально равен GET запрос?

    <form method ="GET">

    В чём смысл делать форму с GET? Это форма поиска?
    Пока мы не нажали на кнопку "отправить", чему равен каждый элемент
    глобального ассоциативного массива?

    Ничему не равен - его ещё просто не существует, тк скрипт запустится только тогда, когда этот GET запрос придёт на сервер. А запрос будет отправлен только после нажатия на кнопку.

    И грамотно ли я вывел значения GET запросов в цикле?

    Нет. Ты в цикле проходишься по обычному массиву, а синтаксис используешь такой, будто по ассоциативному.\
    А ещё у тебя отступов в коде нет, ни в html, ни в php - читать сложно.
    Правильнее будет так:
    $request = $_GET; 
           	   
    $keys = ["name1", "age1", "weight1"];
    
    foreach($keys as $key){
      if(isset($request[$key])) {
         echo $request[$key];
      }
    }

    Либо так:
    $request = $_GET; 
           	   
    foreach($request as $key=>$value){
         echo $key.'='.$value;
    }
    Ответ написан
    21 комментарий
  • Чему изначально равен GET запрос?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    чему равен каждый элемент
    глобального ассоциативного массива GET?


    массив $_GET создаётся из параметров запроса
    Параметры запроса передаются в URL после знака вопроса, разделенные амперсандом. Эта часть URL называется Query String.
    Если какого-то параметра в запросе нет, то его не будет и в массиве $_GET.

    Например, при таком запросе
    http://site.com?param1=&param2=oops&param3[]=1&param3[]=2param4=4

    массив $_GET будет таким:
    [
        'param1' => '',
        'param2' => 'oops',
        'param3' => [ '1', '2' ],
        'param4' => '4',
    ]


    При отсутствии параметров запроса массив $_GET будет пустым.

    При отправке формы методом GET (это метод по-умолчанию, если не указан иной), параметры запроса формируются из полей формы в формате name=value.
    Ответ написан
    9 комментариев
  • Как цикл копирует значения массива из array_keys?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    Добрый Дельфин, вы давайте переменным нормальные, адекватные названия.
    И вам самому будет легче. $items => $key

    $keys = array_keys($massive); // Получаем ключи исходного массива
    shuffle($keys);               // Перемешиваем ключи исходного массива
    foreach($keys as $key) {  // Перебираем КЛЮЧИ исходного массива
      // И достаем ПО КЛЮЧУ из исходного массива значение
      $new[$key] = $massive[$key]; // а здесь мы обращаемся напрямую к ИСХОДНОМУ массиву ($massive[$key]).
    }
    Ответ написан
    6 комментариев
  • Почему класс не найден при автозагрузке классов в папке с помощью composer?

    После добавления неймспейса в `autoload` нужно обновить автозагрузчик.
    Выполни composer dump-autoload
    https://getcomposer.org/doc/03-cli.md#dump-autoloa...
    Ответ написан
    1 комментарий
  • Как объединить в массиве массивы с одинаковыми ключами?

    Алгоритм же достаточно простой, прочитай документацию про циклы в PHP
    function converter(array $input): array
    {
        $output = [];
    
        foreach ($input as $items) {
            foreach ($items as $key => $value) {
                if (!isset($output[$key])) {
                    $output[$key] = [];
                }
                
                $output[$key][] = $value;
            }
        }
        
        return array_values($output);
    }
    
    $input = [
        [34 => 'uni-1-34'],
        [34 => 'uni-2-34'],
        [44 => 'uni-1-44'],
        [44 => 'uni-2-44'],
    ];
    
    print_r(converter($input));
    Ответ написан
    1 комментарий
  • Как вывести текст на страницу PHP не привязывая PHP скрипт к странице?

    В PHP есть директивы auto_prepend_file и auto_append_file в которых ты можешь указать путь до PHP файла

    https://www.php.net/manual/ru/ini.core.php
    auto_prepend_file
    Определяет имя файла, который будет автоматически обрабатываться перед основным файлом. Файл вызывается так, будто он был подключён при помощи функции require, так что include_path также используется.

    auto_append_file
    Определяет имя файла, который будет автоматически обрабатываться после основного файла. Файл вызывается так, будто он был подключён при помощи функции require, так что include_path тоже используется.
    Ответ написан
    Комментировать
  • Как в PHP в классе свойствам назначать значения по умолчанию объекты.?

    Всё зависит от того какая цель. Я бы сделал это через обычный enum
    Вариант 1 (enum)

    <?php
    
    enum CurrenciesEnum: string
    {
        case RUB = 'RUB';
        case USD = 'USD';
        case EUR = 'EUR';
        case GBP = 'GBP';
        case JPY = 'JPY';
        case CNY = 'CNY';
    
        private const DATA = [
            'RUB' => ['name' => 'Рублей', 'short' => '₽', 'ratio' => 1, 'default' => 1, 'display' => 1],
            'USD' => ['name' => 'Dollar', 'short' => '$', 'ratio' => 1, 'default' => 1, 'display' => 1],
            'EUR' => ['name' => 'Euro', 'short' => '€', 'ratio' => 1, 'default' => 1, 'display' => 1],
            'GBP' => ['name' => 'Pound', 'short' => '£', 'ratio' => 1, 'default' => 1, 'display' => 1],
            'JPY' => ['name' => '円', 'short' => '¥', 'ratio' => 1, 'default' => 1, 'display' => 1],
            'CNY' => ['name' => '元', 'short' => 'Ұ', 'ratio' => 1, 'default' => 1, 'display' => 1],
        ];
    
        public function code(): string
        {
            return $this->value;
        }
    
        public function name(): string
        {
            $this->insureValue();
            return self::DATA[$this->value]['name'];
        }
    
        public function short(): string
        {
            $this->insureValue();
            return self::DATA[$this->value]['short'];
        }
    
        public function ratio(): string
        {
            $this->insureValue();
            return self::DATA[$this->value]['ratio'];
        }
    
        public function default(): string
        {
            $this->insureValue();
            return self::DATA[$this->value]['default'];
        }
    
        public function display(): string
        {
            $this->insureValue();
            return self::DATA[$this->value]['display'];
        }
    
        private function insureValue(): void
        {
            if (!isset(self::DATA[$this->value])) {
                throw new InvalidArgumentException($this->value);
            }
        }
    }
    
    echo CurrenciesEnum::RUB->code(), PHP_EOL;
    echo CurrenciesEnum::RUB->name(), PHP_EOL;
    echo CurrenciesEnum::RUB->short(), PHP_EOL;


    Вариант 2 (enum)

    <?php
    
    enum CurrenciesEnum
    {
        case RUB;
        case USD;
        case EUR;
        case GBP;
        case JPY;
        case CNY;
    
        public function code(): string
        {
            return $this->name;
        }
    
        public function name(): string
        {
            return self::getField($this->name, 'name');
        }
    
        public function short(): string
        {
            return self::getField($this->name, 'short');
        }
    
        public function ratio(): string
        {
            return self::getField($this->name, 'ratio');
        }
    
        public function default(): string
        {
            return self::getField($this->name, 'default');
        }
    
        public function display(): string
        {
            return self::getField($this->name, 'display');
        }
    
        private static function getField(string $currency, string $field): string
        {
            $data = [
                self::RUB->name => ['name' => 'Рублей', 'short' => '₽', 'ratio' => 1, 'default' => 1, 'display' => 1],
                self::USD->name => ['name' => 'Dollar', 'short' => '$', 'ratio' => 1, 'default' => 1, 'display' => 1],
                self::EUR->name => ['name' => 'Euro', 'short' => '€', 'ratio' => 1, 'default' => 1, 'display' => 1],
                self::GBP->name => ['name' => 'Pound', 'short' => '£', 'ratio' => 1, 'default' => 1, 'display' => 1],
                self::JPY->name => ['name' => '円', 'short' => '¥', 'ratio' => 1, 'default' => 1, 'display' => 1],
                self::CNY->name => ['name' => '元', 'short' => 'Ұ', 'ratio' => 1, 'default' => 1, 'display' => 1],
            ];
    
            if (!isset($data[$currency])) {
                throw new InvalidArgumentException($currency);
            }
    
            return $data[$currency][$field];
        }
    }
    
    echo CurrenciesEnum::RUB->code(), PHP_EOL;
    echo CurrenciesEnum::RUB->name(), PHP_EOL;
    echo CurrenciesEnum::RUB->short(), PHP_EOL;



    Вариант 3 (storage)


    Класс Currency
    final class Currency
    {
        public function __construct(
            readonly string $code,
            readonly string $name,
            readonly string $short,
            readonly int $ratio = 1,
            readonly int $default = 1,
            readonly int $display = 1,
        )
        {
        }
    }


    Класс CurrencyStorage
    final class CurrenciesStorage
    {
        private static self|null $instance = null;
    
        /** @var Currency[] */
        private array $currencies = [];
    
        private function __construct()
        {
        }
    
        public static function getInstance(): self
        {
            if (self::$instance === null) {
                self::$instance = new self();
            }
    
            return self::$instance;
        }
    
        public function add(Currency $currency): void
        {
            $this->currencies[$currency->code] = $currency;
        }
    
        public function has(string $code): bool
        {
            return isset($this->currencies[$code]);
        }
    
        public function get(string $code): Currency|null
        {
            return $this->currencies[$code] ?? null;
        }
    
        public function all(): array
        {
            return $this->currencies;
        }
    }


    Потом при инициализации своего модуля тебе нужно будет создать инстанс сторажда и заполнить его дефолтными значениями:
    $storage = CurrenciesStorage::getInstance();
    $storage->add(new Currency('RUB', 'Рублей', '₽'));
    $storage->add(new Currency('USD', 'Dollar', '$'));
    $storage->add(new Currency('EUR', 'Euro', '€'));


    // Получить данные по одному объекту
    echo $storage->get('RUB')->code, PHP_EOL;
    echo $storage->get('RUB')->name, PHP_EOL;
    echo $storage->get('RUB')->short, PHP_EOL;
    
    // Получить все объекты
    var_dump($storage->all());


    Данный код в объектном стиле, в IDE будут работать подсказки, у стораджа есть тайпхинтинк (соответственно туда ничего кроме currency нельзя буде запихнуть). Плюс работает инкапсуляция, т.к. свойства у currency readonly их нельзя будет изменить в другом коде
    Ответ написан
  • Php-fpm нагружает цпу. В чем может быть проблема?

    1. Поставьте prometheus + node_exporter. Метрики очень важны, без них это только тыкать пальцем в небо
    2. Если систему нагружает php код, то поставьте xhprof и профилируйте запросы (например 1% запросов), тогда вы сможете увидеть какой именно код даёт нагрузку на процессор
    3. Если БД на том же сервере, то установите ещё и mysql_exporter
    Ответ написан
    2 комментария
  • Как упростить вложенные циклы?

    function arrayCompressor($data, $key = null, &$result = []): array
    {
        if (is_array($data)) {
            foreach ($data as $index => $param) {
                if ($key === null) {
                    $newKey = $index;
                } else {
                    $newKey = $key . '[' . $index . ']';
                }
    
                arrayCompressor($param, $newKey, $result);
            }
        } else {
            $result[$key] = $data;
        }
    
        return $result;
    }
    
    $array = [
        'RoadServiceAutos' => [
            [
                'RoadServices' => [
                    [
                        'CountryAlpha2Code' => 'RU',
                        'CountryBeta2Code' => 'EN',
                    ],
                ],
                'Test' => "test",
            ],
        ],
    ];
    
    print_r(arrayCompressor($array));


    Накидал быстрое решение, думаю можно сделать лучше, но мне лень
    Ответ написан
    1 комментарий
  • Как на php изменить значения в БД из .csv файла?

    Надо научиться правильно задавать вопросы.
    Сейчас он звучит так: Как на php изменить значения в БД из .csv файла?
    А должен так: Как обновить данные в БД

    Ведь csv не имеет никакого отношения к проблеме, данные из csv файла ты уже успешно читаешь.
    Вот ответ на твой вопрос:
    https://www.w3schools.com/mysql/mysql_update.asp
    Ответ написан
    Комментировать
  • Как отследить статусы Push-уведомлений на android и ios?

    Для этих целей не обязательно использовать SDK, всё в ваших руках. Вы в мобилке можете подписаться на событие получения пуша, и как только он приходит отправляете запрос на свой backend с информацией что пуш был получен.
    Ответ написан
    9 комментариев
  • Как заставить PHP обрабатывать строку, игнорируя управляющие последовательности?

    bin2hex

    Там в комментарях есть разные примеры использования

    А для чего вообще это нужно?
    Ответ написан
    2 комментария
  • Как такое делается в командной строке?

    echo "\r";
    Ответ написан
    Комментировать
  • Почему может зависать сайт на PHP до закрытия всех вкладок?

    99% что блокируется сессия.
    Когда PHP обрабатывает запрос, он по умолчанию открывает сессию, а закрывает только тогда, когда код завершает свою работу. Проблема в том, что файловые сессии блокируются. Если какой то поток открыл сессию, то другие потоки будут ждать пока она не закроется.
    Решение этой проблемы - уход от хранения сессий в файловой системе, обычно в таком случае выбирают memcache.
    Ответ написан
    1 комментарий
  • Как в php обфусцировать js код?

    Комментировать
  • Как передать координаты GPS через ссылку?

    https://en.m.wikipedia.org/wiki/Geo_URI_scheme

    Пример:
    <a href="geo:37.786971,-122.399677;u=35">Wikimedia Headquarters</a>


    Такая ссылка будет триггерить приложения подписанные на работу с геолокацией (карты, сервисы такси и и.д)
    Ответ написан
    Комментировать
  • Как вызвать SQL функцию NOW() с помощью RedBeanPHP?

    R::getCol('SELECT now()');

    А почему redbean? Откуда такая любовь к этой orm у новичков?

    Совет, лучше изучи чистый sql и работу с pdo, это основы которые нужно знать, после этого освоить любую orm будет не сложно
    Ответ написан
    1 комментарий