• Как вывести нужное значение функция substr_count?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    В этом примере три переменных содержат по одной букве "в". поэтому этот код выводит 3.
    Чтобы вывести 1, надо убрать букву "в" из содержимого двух переменных

    Если надо узнать, содержимое какой переменной равно в, то тогда это и проверять, без всяких substr_count

    $count_a = $id1 === "в";
    Ответ написан
  • Почему не срабатывает тернарный оператор?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Есть конструкция которая выдает предупреждение Notice: Undefined index: priceweek in ...

    Это неправда.
    Ответ написан
    3 комментария
  • Почему может создаваться большое количество файлов сессий на сервере Ubuntu?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Сессии сами не создаются, их создает РНР при обращении к сайту.
    Сколько обращений - столько сессий.

    Соответственно, смотреть надо по двум направлениям
    1. проверить, не долбит ли кто-то запросами, и заблокировать или ограничить, например использовать Rate Limit у NGINX
    2. файловая система - самое убогое хранилище для сессий, и используется по умолчанию только потому, что для всех других нужно указывать параметры подключения. Соответственно, вместо файлов использовать базу данных.

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если вы тупо не знаете, какие бывают типы исключений, то это легко исправить, посмотрев в документации.
    Там написано, что объекты исключений имеют иерархическую структуру, и самым общим предком является интерфейс Throwable.

    Отдельно следует отметить, что за использование try catch чтобы тупо написать "Получена ошибка" надо бить по рукам. Так никогда не надо делать. Это глупо и бессмысленно. РНР и сам прекрасно выведет и $e->getFile(), и $e->getLine(), и даже $e->getMessage(), и помогать ему в этом не надо.

    Исключение надо ловить только тогда, когда есть определенный сценарий обработки. Например, в случае, если test() выполнилась с ошибкой, то вызвать test2().
    Но главное - внутри блока catch ничего не выводить пользователю.
    Общением с пользователем должны заниматься только специально предназначенные для этого блоки программы. А не любая строчка, которой вдруг захотелось это сделать.

    Поэтому в данном конкретном случае ваша задача еще больше упрощается - не надо ловить вообще никакое исключение.
    Ответ написан
  • Ошибка переводчиков или в оригинале такая же ошибка?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ошибка, причем дважды.
    В любых версиях Питона управление потоком выполнения осуществляется с помощью отступов.

    Кроме того, "понятное сообщение об ошибке" программа должна выводить с помощью глобального обработчика ошибок, а не с помощью понатыканных везде try.

    Эмпирическое правило: Если try используется только для того, чтобы вывести ошибку, то его ставить не надо.
    Для ученика, который тренируется на кошках, подойдет и трассировка.
    В серьезной же программе общением с пользователем должны заниматься только специально предназначенные для этого блоки программы. А не любая строчка, которой вдруг захотелось это сделать.
    Ответ написан
    Комментировать
  • MysqlDump в разные файлы разные базы данных?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Не очень понятно, что имеется в виду под "скриптом", но однострочник на баше написать можно.
    Собственно, задача стандартная, и решение легко находится гуглем, если владеть языком международного общения.
    mysql -uroot -N -e 'show databases' | while read db; do mysqldump -uroot "$db" > "$db".sql; done

    spoiler
    Если вдуматься, то интернет - это самое непроизводительное использование ресурсов в человеческой истории.
    Ответы на 99% вопросов уже лет 20 как лежат на расстоянии вытянутой руки.
    но их задают снова и снова
    Ответ написан
    4 комментария
  • Как посчитать сумму позиций из 2-х источников?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    В общем случае избежать "цикла в цикле" позволяет использование индексации массива идентификатором и - соответственно - обращение по индексу вместо перебора.
    В данном случае вторую коллекцию проиндексировать можно с помощью метода keyBy('id');

    И тогда останется только один цикл по первому массиву, в котором обращаться ко второму по id.
    То есть сложность будет длина массива * 2 вместо длина массива * длина массива

    Если же данные берутся из базы, то, как правильно заметили в комментариях, там же и надо сразу считать

    spoiler
    Типичный, кстати, вопрос из серии "Выучил ларавель, не выучил программировать"
    Ответ написан
    7 комментариев
  • Почему не удается получить доступ к смещению типа string в строке?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Потому что у строки не может быть строкового смещения.

    В ответе выше написана чушь.
    Обращаться к строке по индексу можно. И в РНР7, и в РНР 8. Без всяких предупреждений.
    К отдельным байтам (но не символам) в строке можно обращаться, указывая смещение в квадратных скобках:
    echo 'hello'[0];
    Но в сообщении об ошибке говорится конкретно про строковые ключи. А это уже действительно бессмыслица, никаких строковых смещений в строке быть не может. Что и написано черным по белому в ошибке.

    И проблема действительно находится выше, в совершенно дурацком присвоении пустой строки массиву.
    Если мы хотим использовать массив, то и присваивать начальное значение надо в виде пустого массива, а не строки.

    При этом отдельно проверять наличие $aUnit[$server['unit']] и $aUnit[$server['unit']][$server['game']] не нужно. Достаточно проверить на существование сразу конечный элемент.
    В 8.2 это можно красиво написать одной строчкой
    $aUnit[$server['unit']][$server['game']] ??= '';
    Но если почитать код дальше, то станет видно, что и здесь нам строка тоже не нужна. А снова нужен массив.
    Потому что в коде ниже эта строка разбивается через explode(???).
    То есть, надо написать
    $aUnit[$server['unit']][$server['game']] ??= [];
    $aUnit[$server['unit']][$server['game']][] = $server['id'];
    А ниже выкинуть всё от explode() до unset()
    spoiler
    Вообще, складывается ощущение, что исходный код писал либо ребенок, либо шизофреник - две разные личности, которые не видят код друг друга. Вот как с этим массивом например.
    Или вот этот кусок кода еще мне очень понравился
    $sql->query('SELECT `id` FROM `servers` LIMIT 1');
    if(!$sql->num())
        return NULL;
    $sql->query('SELECT `id`, `unit`, `game` FROM `servers` ORDER BY `unit` DESC');
    $all = $sql->num();

    Напоминает анекдот про ирландца, который перед тем как поспорить, выпьет ли он 10 кружек пива, сначала сбегал в соседний паб. Проверить, выпьет ли он 10 кружек пива.
    Ответ написан
    Комментировать
  • Используется ли шаблонизатор в проде?

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

    Как пользователь, я ненавижу рендеринг на фронте, на практике он ВСЕГДА тормозит.
    За примером далеко ходить не надо, это новый дизайн Хабра.

    Вы, кстати, неправильно понимаете термин "прод".
    Продакшен окружение относится не к коду, а к тому, где он выполняется
    В локальном окружении разработчик пишет и отлаживает программу
    Тестовое (стейдж) окружение полностью имитирует боевой сервер, но доступно только разрабочикам/тестировщикам/заказчикам
    И, наконец, продакшен - собственно рабочий сервер, который находится под реальной нагрузкой
    А код везде один и тот же.
    Ответ написан
    3 комментария
  • Метод класса вписывается в класс который осуществляет действие или в класс над которым осуществляют действие?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Уфф, 5 раз прочитал, пока понял. Второе.

    Метод класса вписывается в класс который над которым осуществляют действие.
    Собственно, определение класса - это "данные и методы для работы с ними". С ними. А не с данными чужих объектов.

    Сущность Модератор в данном случае вообще не нужна, достаточно свойства в сущности Пользователь (кстати, откуда вы все берете этих "участников"? Участник бывает у события, а не у сущности. Вы же не говорите "участник 5А класса?")

    Связей здесь должно быть значительно меньше.
    Если модератор не упоминается ни в опросе, ни в добавленной книге, то и связи между ними никакой нет.
    В текущей схеме должна быть только одна связь: опроса с прошедшим его пользователем. Одним из свойств опроса будет экземпляр класса Пользователь. Причем это касается класса РезультатОпроса, которого нет на диаграмме. А он должен быть. И вот он будет связан с классом Опрос.

    Чего здесь не хватает - это интерфейса. Классов-контроллеров. Которые собственно эти методы и вызывают.
    Какой-нибудь BookController.add(), который принимает, скажем, два объекта, Пользователь и Инпут, и проверяет, является ли пользователь модератором. И если да, то создает объект Book, и используя данные из инпута, вызывает Book.add()
    И то же самое с опросами

    Еще по-хорошему должен быть BookRepository. Потому что если книга умеет сама себя добавлять в хранилище, то это считается плохим тоном. Должен быть отдельный объект Хранилище Книг, в котором и будут методы добавления и поиска.
    Ответ написан
    6 комментариев
  • Как сделать вывод постов по страницам?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Начать надо с того, чтобы набрать в адресной строке своего браузера "PHP вывод по страницам"
    Ответ написан
  • Как обновлять библиотеки в микросервисах?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вообще непонятно, в чем проблема.
    В лени? В отсутствии CI? В том что вопрос высосан из пальца?

    Обновление библиотек для микросервисов ничем не отличается от обновления библиотек для макросервисов.
    Новая версия указывается в пакетном менеджере, и при раскатке обновляется вместе с остальным кодом
    В чем проблема-то?
    Ответ написан
  • Как превратить текст в исполняемый код?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    В ответе выше написана чушь.
    Написать такой парсер можно за 10 минут.
    Плюс готовых парсеров формул в интернете - как грязи.
    И если на курсах не совсем идиоты, то их интересует именно написание парсера, а никакой не eval.
    Ответ написан
  • Где ошибка в коде и не происходит авторизация с password_verify?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Возможные причины
    1. В БД нет такого пользователя.
    2. Недостаточная длина поля под хэш.
    3. Ошибка при выполнении запроса.
    4. При регистрации в базу вместо нормального хэша пишется какая-то ерунда.
    Ответ написан
  • Почему не выводит ошибку при работе с базой после переноса на сервер?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Комментировать
  • Как правильно выводить данные php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Специально для тех, кого интересует этот животрепещущий вопрос и персонально для Максим Ткачев.

    print_r($result,true); - это бред обкуренного жирафа. Эта строчка не выводит вообще ничего.
    Про функцию print_r надо забыть, она была нужна только в 4 версии РНР.

    Чтобы вывести любые данные, полученные курлом, надо использовать обычное echo
    Предварительно задав CURLOPT_RETURNTRANSFER
    А если что-то ещё не выводится, или выводится не так, то надо смотреть, где ещё в коде написан бред.
    Ответ написан
    Комментировать
  • Возможно ли корректировать текущий файл эксель?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Можно
    Только слово "текущий" надо заменить на "существующий".
    Ответ написан
    Комментировать
  • Как правильно экранировать поля, содержащие разметку?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если текст содержит HTML теги, которые должны выводиться как есть, то его не надо обрабатывать функцией, которая преобразует теги в HTML сущности.

    Если же вопрос про обработку данных перед их записью в БД, то надо задать себе вопрос, какое отношение функция htmlspecialchars имеет к базе данных.

    Логика - это просто незаменимый инструмент для программиста.
    Ответ написан
    5 комментариев
  • Как сделать уведомление о завершении работы скрипта?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Этот вопрос не имеет отношения к РНР.
    А только к базовым навыкам работы с операционной системой.
    В простейшем случае можно написать бат файл, в котором под своей командой пишете любую другую, от проигрывания звукового файла до запуска любой программы. Которая выполнится по завершении первой
    Можно то же самое написать в одну строчку php my.php & echo ^G
    После амперсанда опять же, пишется все что угодно.

    писать set_time_limit(0) в консольоных скриптах кстати не нужно. Там лимита нет по умолчанию
    Ответ написан
    Комментировать
  • Не добавляются данные в таблицу phpmyadmin?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если после добавления данные не видны в программе phpmyadmin, то на это может быть три причины:
    1. Код добавления вообще не вызывался.
    2. При добавлении произошла ошибка.
    3. Данные добавились, в одну базу, а результат смотрим в другой.

    Причем все три пункта проверить может только сам программист, никакой дядя с форума за него это не сделает.
    Дядя с форума может помочь только со вторым пунктом. Рассказав, как отслеживать ошибки правильно. Например, добавив в код следующие строчки:

    <?php
    # Настройка ошибок
    # Для локального сервера
    ini_set('display_errors', 1);
    # Всегда
    error_reporting(E_ALL);
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    Ответ написан
    Комментировать