Задать вопрос
  • Как в PHP вынуть номер абонента?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Похоже, в данном случае спасёт parse_ini_file.
    Ответ написан
    2 комментария
  • Нужно использовать триггеры или нет??

    @Akina
    Сетевой и системный админ, SQL-программист.
    В общем случае - нет.

    Как я понимаю, мысль твоя бредёт вот в каком направлении: мы выполняем INSERT в основную таблицу, а триггер AFTER INSERT, имеющий доступ к сгенерированному значению автоинкрементного ключа именно свежесозданной записи, создаёт записи в связанных таблицах, используя именно это значение.

    Так вот именно эта мысль - она некорректная. Причём по совершенно элементарной причине. Данные для вставки в связанных таблицах (не поля связи - других полей) триггер тоже должен откуда-то взять. А вот корректно передать их достаточно непросто. Их нельзя вставить в блок данных основной записи - там просто места для этого нет, сервер перед выполнением INSERT проверяет входные данные на соответствие количества значений количеству переданных данных, соответствие типов, непревышение размеров и пр. Значит, данные придётся передавать за пределами запроса. Да, тут есть варианты, типа определённых пользователем переменных, временных таблиц и протчая - но всё это ненадёжно, сложно и совершенно несопровождаемо. Следует ещё учесть то, что триггеры - это конструкция неотключаемая. Либо она выполняется при абсолютно любом INSERT, и тогда есть определённые проблемы (триггер, предназначенный для работы при INSERT .. VALUES с единственным блоком данных, вряд ли корректно обработает вставку нескольких блоков данных, INSERT .. SELECT или LOAD DATA), либо для выполнения запросов на массовое добавление триггер надо удалять и потом пересоздавать - а если это происходит в конкурентной среде?

    В общем, триггер - неподходящая идея. Вот хранимая процедура (stored procedure) - это самое оно. Там можно реализовать логику ну практически любой сложности, с любыми обработками и проверками. Хотя и не следует забывать, что триггер выполняется наново для каждой отдельной вставляемой записи, так что его наличие, даже при достаточно простом и компактном коде, сильно скажется на скорости выполнения операций вставки, особенно вставки массовой.

    при регистрации пользователя, я получаю lastInserdId() и добавляю статичные данные для этого пользователя в различные таблицы

    Ненадёжно. Если между вставкой в основную таблицу и получением LAST_INSERT_ID() соединение будет разорвано и затем автоматически восстановлено, то полученное значение будет некорректным (вернее, получите NULL). А свежесозданная запись благополучно "повиснет в воздухе".
    Чисто теоретически, базовая таблица пользователей обязана обеспечивать уникальность записи даже без учёта синтетического первичного ключа (например, поле логина явно должно быть уникальным). А коли так, и с учётом того, что все значения для свежевставленной записи нам известны, можно использовать INSERT INTO slave SELECT 'literal', main.id FROM main WHERE uniquecolumn = 'new value'.

    PS. Не знаю, почему при обучении вставке данных все начинают с INSERT .. VALUES - как по мне, глубоко порочная практика. Сначала надо изучить и досконально освоить INSERT .. SELECT, и только потом упоминать про INSERT .. VALUES как более простой конструкции, применимой в частных случаях.
    Ответ написан
    1 комментарий
  • Когда выполняется __destruct?

    Maksclub
    @Maksclub Куратор тега PHP
    Может до, может после

    Данные серверу (пользователю) можно отправить через fast_cgi_finish_request, но приложение продолжит работать — очевидно объекты продолжат существовать столько, сколько нужно и удалены (если пришёл gc, а на объект никто не ссылается)

    Кроме того у вас может быть демон, который вообще не работает с веб-сервером… очевидно что объекты будут существовать без связи с клиентом

    В общем случае (классич работа приложения) после того как закончится выполнение — fpm прибьёт ваш процесс и объекты соотвественно — и будет вызван деструктор

    Вы можете и сами инициализировать деструктор через удаленние объекта через unset

    В режиме, когда пхп-скрипт работает достаточно долго (или в cli режиме или после finish request) — gc может прийти за брошенными объектами сам и вызвать деструкторы

    Почитать:

    https://abhishekjakhotiya.medium.com/php-fpm-shutd...

    https://www.php.net/manual/ru/features.gc.performa...
    https://developpaper.com/garbage-collection-mechan...

    gc = garbage collector = сборщик мусора
    Ответ написан
    Комментировать
  • Сервер для docker?

    Sanes
    @Sanes
    Тебе надо выучить 10 консольных команд.
    Ответ написан
    Комментировать
  • Сервер для docker?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    "Для личного использования и пары сайтов", как вы выражаетесь - нет смысла, максимум docker-compose, остальное оверкилл.
    Ответ написан
    Комментировать
  • Как исправить нечитаемое имя отправителя и получателя почтового сообщения?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    ?utf-8? - исходная строка была в кодировке UTF-8.
    ?B? - закодировано в Base64.
    0KnQtdC/0LAg0KHQзtdGA0LPQtdC5 - сама строка в Base64.
    print base64_decode('0KnQtdC/0LAg0KHQзtdGA0LPQtdC5'); // Щепа Сергей

    Кроме Base64 может встретиться кодировка Quoted-printable, обозначаемая как ?Q?. В этом случае заголовок будет выглядеть как
    ?utf-8?Q?=D0=A9=D0=B5=D0=BF=D0=B0 =D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9?=

    Ну и кодировка исходной строки может быть любая. Для перекодирования можно использовать iconv().
    Ответ написан
    Комментировать
  • Какова должна быть правильная архитектура парсера на PHP?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    та еще зажигалка...
    Для начала бы хоть объяснил что именно ты парсишь.
    А если понадобится писать не в базу, а в файл, писать Parser2?

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

    Для перечислений можно использовать Enum, это подойдёт для TextAlign.
    Для других кейсов можно использовать ValueObject с валидацией в конструкторе.
    Ответ написан
    9 комментариев
  • Пытаюсь запросить данные из MySQL через PHP. Где ошибка?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Выводится только "соединение установлено", а так - ничего
    Во первых - включить вывод ошибок, в логи же вы не смотрите...
    Во вторых - куча ошибок, непонятно откуда вообще появившихся. Все плохо.
    $link = mysqli_query($link, "SELECT * FROM 'table-name' WHERE USER_ID = 1620");
    Сам линк зачем-то затирается результатом выполнения запроса, внутри запроса имя таблицы зачем-то в кавычках (либо убрать, либо использовать обратные кавычки), потом вообще повтор и бред -
    $query = "SELECT * FROM 'table-name' WHERE USER_ID = 1620"; //снова кривой запрос, теперь уже в переменной, зачем?
    $result1 = mysqli_query($link, $query) or die(mysqli_error($link)); //Линк тут уже заменен результатом выборки, 
    //так что там не ресурс подключения, но варнинги мы не смотрим, так что пофиг же, да?

    Похоже что код взят из какого-то туториала 15летней давности, и над ним издевался ничего не понимающий вивисектор...
    Ответ написан
    Комментировать
  • Как грамотно сравнивать два файла?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Не придумывайте велосипед. Просто посмотрите как решают подобные вещи в других проектах, например git diff. В результате у вас будет аж 3 варианта использования:
    1. использовать уже готовый продукт (например тот же git-diff) как консольную утилиту
    2. использовать уже готовую библиотеку, решающую данный вопрос, подключив ее к своему коду
    3. посмотреть код уже готовых продуктов и либо использовать его, либо на основе написать свой
    Ответ написан
    Комментировать
  • Нормален ли такой код?

    @rPman
    'магические константы' - что такое 9 или 10?, мне то понятно но чтобы их понимать нужно изучать код, размеры области нужно определить в переменные или константы, приучаться надо с самого начала к тому чтобы такого не было. То же самое с символами кнопок управления, определи для них переменные, пусть сначала это будут константы, заданные в коде, зато позже будет проще сделать изменяемые настройки.

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

    Правильно - определить буфер как содержимое стенок # и заполнить его однократно вне игрового цикла (тут можно и другие препятствия расставить, например сделать лабиринт), не важно константами или алгоритмом.

    А в бесконечном цикле просто выводить содержимое map и уже во время вывода проверять x,y положения 'игрока' и выводить его на экран вместо символа карты. Достоинство такого подхода - карта может состоять не только из символов стенок но и любых других, проходимых.

    ну и красивости раскидай по функциям вывод экрана и обработку клавиш управления, так же внутри вызова каждой клавиши проверку на стенку вынеси в вызов отдельной функции (в параметрах - символ карты), возвращает boolean, является ли символ проходимым, благодаря этому позже проще будет добавить другие символы стенок

    Следующим шагом x,y определи структурой, если продолжать дальше, в идеологии объектного программирования (да я вижу что это С, но простой вызов метода у структуры/класса сделать можно) в этой структуре определи функции, описывающие действия над персонажем (обработка действий - там функция что разбирает нажатые клавиши, только по логике нав ход должны подаваться не клавиши а константы, определяющие действие, вывод на экран - вернет символ, проверку проходимости точки на карте, т.е. стены, и т.п.) тогда будет проще добавить к примеру второго игрока или NPC и т.п.
    Ответ написан
    4 комментария
  • В чём отличие результатов кодировок `encodeURI`, `encodeURIComponent` и `application/x-www-form-urlencoded`?

    @alexalexes
    Отличия в охвате специальных символов, которые подвергаются конвертированию.
    Функция encodeURI меньше охватывает символов, а функция encodeURIComponent - больше.
    Но ни та, ни другая не достигает стандарта RFC 3986, чтобы считаться полностью правильно закодированным в вид контента application/x-www-form-urlencoded (смотрите документацию по encodeURI).

    PS: Со стороны php сервера такая же история. Есть urlencode/urldecode - которые неполные по RFC 3986, а есть rawurlencode/rawurldecode - которые полностью удовлетворяют стандарту RFC 3986. При кастомном конструировании http пакетов предпочтительно использовать последние.
    Ответ написан
    1 комментарий
  • Как сортировать такой массив?

    Adamos
    @Adamos
    Написать функцию сравнения, которая сначала сравнивает позиции валют в предопределенном списке, а при их равенстве - второе значение.
    И использовать штатную функцию сортировки массива с пользовательской функцией.
    Ответ написан
    Комментировать
  • При компилировании ошибка undefined reference to?

    gbg
    @gbg Куратор тега Linux
    Любые ответы на любые вопросы
    Подключены заголовки, а не библиотеки. Чтобы подключить библиотеки, нужно добавить -lpthread как минимум к команде компиляции
    Ответ написан
    Комментировать
  • Как установить Windows после Linux?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    ничего windows всегда была царем горы и не предполагала соседей
    Ответ написан
    Комментировать
  • Как получить все теги в html или xml?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    3 комментария
  • Как отнять в php одно время от другого, если изначально значения времени являются строками?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    print DateTime::createFromFormat('H:i', '15:00')
        ->diff(DateTime::createFromFormat('H:i', '14:30'))
        ->format('%H:%i');
    // 00:30
    Ответ написан
    Комментировать
  • Как записать в fastcgi_param якорь?

    Lynn
    @Lynn
    nginx, js, css
    Никак. Якоря не передаются на сервер.
    Ответ написан
    Комментировать
  • На чем лучше сделать динамический сайт с админ панелью, с добавлением товаров?

    Sanes
    @Sanes
    На чем умеешь, на том и будет быстрей. Либо CMS.
    Ответ написан
    Комментировать