Задать вопрос
  • Почему не удается получить доступ к смещению типа 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);


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

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    The manual page at dev.mysql.com/doc/mysql/en/crashing.html contains
    information that should help you find out what is causing the crash.
    Ответ написан
  • Curl в ссылке заменяет &amp;amp;amp; на &amp;amp;amp;amp; из-за этого удаленный API не видит передаваемый параметер?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Безотносительно к проблеме с неизвестно откуда берущимся кодированием, чем не устроил вариант
    simplexml_load_file($url);
    Ответ написан
  • Как при выводе данных из базы модифицировать одно из полей?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    У вас каша в голове. И вы все делаете неправильно.
    Заменять теги на сущности надо не перед записью в БД, а перед выводом в HTML. Желательно - средствами этого "табулятора", если он это умеет.

    Никакой HTML в БД хранить нельзя.
    Любое HTML оформление надо добавлять средствами этого "табулятора".
    В самом крайнем случае - в ноде, перед выводом

    name: '<p>' + entities.encode(result.name) + '<p>'
    Хотя это конечно говнокод и кровь из глаз.
    Ответ написан
    2 комментария
  • Как использовать структуры данных на практике?

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

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

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

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Чтобы решить проблему, её надо сначала сформулировать.
    В данном случае никакой проблемы нет, есть невнятные страдания.
    Ни кода, ни внятного описания проблемы, ни даже пояснения, что имеется в виду под "добавлением" в вопросе нет.

    В простейшем случае либо делать один множественный запрос insert, либо заключить отдельные запросы insert в транзакцию
    Ответ написан
    6 комментариев
  • Есть ли список распространённых и общепринятых слов для именования переменных в PHP?

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

    Так что в целом можно сформулировать правило, что используется одно или несколько английских слов, подходящих по смыслу.
    С одним уточнением: в общем случае в качестве переменной используется подробное описание того, что в ней лежит. Но для очень часто используемых переменных обычно делается исключение, потому что стройные ряды какого-нибудь $userSelectQueryResult выглядят задротством.

    И в ваших примерах для PHP тоже просто переводы. Причем не очень удачные.
    link - звено - не слишком подходит по смыслу, и почти не используется.
    connect - это глагол, а в качестве имен переменных обычно используются существительные. connection подойдет лучше, но совсем длинно.
    con - хоть и является сокращением от connection, само по себе означает жульничество. Тоже так себе слово. Поэтому если уж сокращают, то обычно до conn.
    Но само по себе "соединение" малоинформативно. Соединение с чем?
    Поэтому я обычно рекомендую писать $db - сокращение от database. Тут и коротко, и сразу понятно, о чем речь.

    Причем если речь идет об объектах, то всегда можно использовать имя класса в качестве имени объекта.
    Например, если вы используете mysqli, то и называйте переменную $mysqli.
    Если используете PDO, то называйте переменную $pdo.

    $result - подходящее имя, от объекта mysqli_result.
    $response обычно употребляется в контексте НТТР., для базы данных не очень подходит.

    Причем от использования $result в коде надо уходить. Это промежуточная переменная, которая сама по себе вам не нужна, а требуется для получения реального результата запроса. Ну так вы вполне в состоянии написать функцию, которая сразу возвращает нужный результат, без колупания в промежуточных результатах.
    $user = db_get_row($mysqli, "SELECT * FROM users WHERE email=?", [$email]);

    и никаких мусорных $result, не говоря уже о том что кода в 5 раз меньше
    Ответ написан
    Комментировать
  • Почему не работает sql запрос в Laravel?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Этот набор шаманских заклинаний помог потому, что в нем отсутствует элемент ONLY_FULL_GROUP_BY.
    Который и отвечает за строгость по отношению к вопросу о группировке.
    И по которому гуглится миллион объяснений заодно.
    Ответ написан
    Комментировать