• Как на стороне сервера закрыть соединение с кодом 200?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Сначала http_response_code, а потом echo.
    Азы протокола НТТР. Заголовки идут перед телом ответа.

    Впрочем, это может быть и любая другая ошибка. К примеру, никакого класса EventHttpRequest нет и в помине.
    Чтобы не получать "совсем другой ответ", ошибки надо логировать, читать и исправлять.

    Стандартная функция, которая закрывает соединение - fastcgi_finish_request()
    Ответ написан
    7 комментариев
  • Как исправить Ошибку авторизации?

    Maksclub
    @Maksclub
    maksfedorov.ru
    UserInterface подразумевает, что массив строк (ролей) вернется

    либо отвяжите вашего юзера от UserInterface (я так и сделал), либо делайте так, как того требует интерфейс
    Ответ написан
    Комментировать
  • Как сделать "показать еще" определенным кол-вом?

    KickeRocK
    @KickeRocK
    FrontFinish
    Вы пытаетесь реализовать пагинацию заново?
    Гуглится так: "#название_языка Pagination"
    Ответ написан
    3 комментария
  • Как писать условие if если очень много значений для проверки, а нужно чтобы они за экран не залезали, не превращались в очень длинную строку?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это очень хороший вопрос!

    Для длинных условий можно и нужно использовать такую замечательную практику, как именованные условия!
    В большинстве случаев, когда условия не зависят друг от друга, можно просто присвоить результат вычисления условия переменной с обязательно говорящим именем, и дальше уже использовать эти переменные:

    $dateIsValid = $obj->getDate() >= getCurrentDate();
    $balanceOk = $obj->getBalance() > 0;
    // Любые другие условия
    if ($dateIsValid && $balanceOK) ...


    Это повышает читабельность не только сокращая само тело условного оператора, но в первую очередь превращая его в связный текст!

    Если же условия зависят друг от друга, то можно оформлять их в виде функций (методов). И тогда они не будут выполнены, если до них не дойдет очередь.
    Ответ написан
  • Интерфейсы в связке с абстрактными классами?

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

    Абстрактный класс - это прототип внутренней реализации, то, как он устроен внутри.

    Так что дополнять можно и нужно.
    Ответ написан
    Комментировать
  • Как совместить elasticsearch и php 7.0?

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

    Несложно. Отличия минимальны. В рамках одной мажорной версии вообще никаких проблем. Тут вопрос даже не в трудностях, а в том, что оставаться на 7.0 это вообще не вариант.
    Только переезжать надо на 7.4, потому что поддержка 7.3 прекращается через месяц.

    И вообще, версию надо подтягивать не когда жареный петух в зад клюнет, а планово.
    Ответ написан
    1 комментарий
  • Тяжелая БД MySql. Как можно оптимизировать?

    kotomyava
    @kotomyava
    Системный администратор
    Во-первых, это не очень уж большая база.
    Во-вторых, конечно, посмотреть данные, и понять, что именно занимает много места, а там смотреть, нужное это или нет.
    Ответ написан
    2 комментария
  • В чём смысл передавать array_reverse в foreach без явной необходимости обратного порядка элементов?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Для ответов на подобные вопросы всегда полезно использовать логику.
    Например:
    Если необходимости в обратном порядке элементов нет, то array_reverse не нужна.
    Если array_reverse используется - значит, скорее всего, необходимость есть, но вы её просто не видите.

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

    "оставить исходный массив нетронутым" причиной не является.
    Ответ написан
  • В чём смысл передавать array_reverse в foreach без явной необходимости обратного порядка элементов?

    Adamos
    @Adamos
    тыц или дыц

    В первом случае реверсится стек, имеющий глаза да видит, не знающий термина да погуглит.
    Во втором - сложнее. Код разворачивает заголовки. Если в них несколько раз по-разному указано значение одного и того же ключа - ему будет присвоено первое из значений, более поздние перепишутся. А если встречается начало заголовка "^HTTP/" - то отбрасывается все, что было до него.

    В обоих случаях заявление, что "без явной необходимости" - просто глупость.
    Ответ написан
    Комментировать
  • Как очищать текст в php?

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

    На самом деле этот вопрос встречается довольно часто. Вот например популярный ответ на Stack Overflow, который подробно разбирает этот распространённое заблуждение: https://stackoverflow.com/a/3126175. И основная мысль там:

    Понятие такой генерализованной "очистки данных" изначально бессмысленное и вредное.

    Особенно такой вот индусской функцией, которая сама по себе - пример редкого идиотизма: сначала заменяем символы < и > на HTML сущности... а потом бодро пытаемся вырезать HTML теги. Которых к этому моменту в тексте не останется ни одного!
    Или функция stripcslashes, которая здесь вообще ни к селу, ни к городу. Если я хочу написать сочетание \n, то с какой стати эта функция будет заменять его на перевод строки?
    Всё что можно оставить из этого безумного набора - это trim(). Да и то не всегда. Как правильно заметил Rsa97, могут быть случаи, когда лидирующие пробелы имеют значение, например, при выводе форматированного кода. Кстати, этим как раз грешит Хабр. Если запостить код с отступами, то первый будет "съеден"!


    Очистка

    Любая "очистка" (хотя правильнее говорить про форматирование), имеет смысл только в определённом контексте.
    И поэтому "очищать" надо только адресно, строго перед использованием в том или ином конкретном случае.

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

    Больше того, "очистка" HTML поможет данным, выводимым в яваскрипт, как мёртвому припарки. То есть опять же - всегда надо понимать, в какой именно контекст мы выводим данные, и форматировать соответствующим образом. В частности любые данные передавать в яваскрипт только через json_encode()

    И таких контекстов неисчислимое множество. Например, если мы используем переменную для передачи параметров в консольный скрипт, то надо обязательно обрабатывать её через escapeshellarg(). Если в регулярку - то preg_quote(). Имя файла для инклюда из переменной (хотя так делать вообще не стоит) надо хотя бы обрабатывать через basename(). И так далее.

    Валидация

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

    Защита БД

    И кстати, по поводу "использую pdo".
    На всякий случай уточню, что само по себе использование PDO не защищает ни от каких проблем
    Важно помнить, что защита - это когда в базу данных отправляется строго константная строка запроса, полностью на 100% составленная из значений, прописанных в коде РНР, и в ней не используется ни одно значение, пришедшее в код извне. Причем PDO помогает здесь только наполовину, позволяя использовать в запросе подстановки вместо самих данных.
    Но при этом для всех остальных частей запроса - например имен полей - у ПДО нет никакой защиты и её надо организовывать самостоятельно. Либо проверяя по белому списку, лабо, по крайней мере, прогоняя через регулярку.
    Ответ написан
    13 комментариев
  • Где можно выставить свой код андроид приложения с гит хаба на review?

    Zoominger
    @Zoominger
    System Integrator
    Review - весьма резурсозатратный процесс, бесплатно вряд ли кто-то будет это делать, а если и будет, то вряд ли качественно.
    Я бы, если б не хотел тратить деняк, выложил код на GitHub и, если проект интересный, то он привлёк бы пару-тройку помощников, которые бы и посмотрели код.

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

    GavriKos
    @GavriKos Куратор тега Разработка игр
    Это термины из разных плоскостей.
    Кат-сцена - прерывает геймплей, раскручивает сюжет без (или с минимальным) влиянием игрока.
    Синематик - ИМХО - игровой ролик, отрендереный НЕ игровым движком - т.е. пререндер.
    Т.е. катсцена может быть синематиком. А может и не быть
    Ответ написан
    5 комментариев
  • Как выполнить авторизацию в аккаунта при помощи RedBeanPHP?

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

    Ну ОК, давайте учиться.

    Главное в программировании - это делать всё по порядку.

    У вас в текущей задаче участвует примерно миллион разных действий: html форма, код, который получает из неё данные, база данных, код, который ищет данные из формы в базе.
    Если вы ещё не освоились со всеми этими элементами, то не надо их писать все подряд.
    Надо делать по очереди, проверяя каждый этап.
    И вопрос задавать не про весь код целиком, про который вам никто никогда не скажет, почему он не работает, а про конкретный этап.

    В данном случае, если у вас база данных не находит пользователя по емейлу, надо сделать что?
    Правильно - исключить все посторонние этапы. То есть написать емейл руками в скрипте и проверить - находит ли его запрос.
    Если не находит - то здесь же, в скрипте, вывести все емейлы, и посмотреть глазками, а есть ли он вообще в базе данных?
    Если нет - то вот она, причина. Найдена самостоятельно за 5 секунд без привлечения мирового сообщества.
    Если есть, но всё равно не находит - то ищем непечатные символы и опечатки. например с помощью функции urlencode(). И исправляем то что она нашла. Русскую букву c или лишний пробел.

    Если написанный руками емейл находит, а пришедший из формы нет, то надо сделать что?
    Правильно - посмотреть на него глазками. А похож ли он на тот который руками написан? Если похож, то снова urlencode. Если не похож - то разбираться со своей формой.

    Если всё равно не работает, то надо исключить другие посторонние факторы, например библиотеки, особенно такие кривые, как redbean. И отлаживаться на чистом PDO.

    Всё это очень простые логические действия, доступные даже неспециалисту.
    Просто надо не смотреть на свой код с горестным выражением лица, и гадать почему он не работает. И не искать какой-то другой код, который обязательно заработает. А работать над своим кодом. Выполнять простые логичные действия.

    Отдельно хочу заметить, что все описанные действия может сделать только сам программист. Обращаться за ними к посторонним людям бессмысленно. У них нету вашей базы данных, вашей формы, вашего кода. Все эти вещи можно сделать только самостоятельно. И именно это и является программированием. А не вот это вот "всё указываю верно".
    Ответ написан
    4 комментария
  • Как узнать сумму всех элементов массива без функций?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Алгоритм называется "используй циклы"
    https://www.php.net/manual/ru/language.control-str...

    while
    do-​while
    for
    foreach

    $sum = 0;
    $arr = [1, 2, 3, 4, 5];
    
    foreach($arr as $val) {
        $sum += $val;
    }
    
    var_dump($sum);
    Ответ написан
    1 комментарий
  • Почему цикл не останавливается?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Сильно сомневаюсь, что бесконечно. У вас написано полное декартово произведение таблиц. Значит число строк на выходе будет равняться произведению числа строк в первой таблице на число строк во второй таблице.
    Ответ написан
    3 комментария
  • Как в PhpStorm сделать выбор файла в проекте "Select in projects"?

    @Araya
    615c5a99afc22098449590.png
    На панели проекта
    Ответ написан
    Комментировать
  • Аналог array_diff запросом mysql, как правильно?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    LEFT JOIN, WHERE ... IS NULL
    Ответ написан
    1 комментарий
  • Как сконвертить в читабельный json stdObject со вложенными объектами?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Автоматически никак. Реализуйте в классе интерфейс JsonSerializable, метод jsonSerialize которого будет возвращать данные для сериализации в JSON.
    Ответ написан
    Комментировать
  • Почему при тестировании symfony не отрабатывает аутентификатор?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Решение

    $this->client->request('GET', self::API_PREFIX . '/account/userinfo', [
                    'Authorization' => 'Bearer ' . $token,
            ]);


    замените на
    $this->client->request(
        method: 'GET', 
        uri: self::API_PREFIX . '/account/userinfo',  
        server: ['HTTP_Authorization' => 'Bearer ' . $token,]
    );


    Пруфы:
    https://github.com/symfony/symfony/issues/5074
    https://github.com/symfony/browser-kit/blob/5.3/Ab...
    Ответ написан
    1 комментарий