Задать вопрос
Ответы пользователя по тегу PHP
  • Как корректно реализовать автовход пользователя на сайт?

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

    поэтому надо в таблицу users добавить поле autoenter, и если пользователь выбирает автологин, то в него записывать значение bin2hex(random_bytes(16)); и его же записывать в куку.
    Ответ написан
  • Как вывести повторяющий список в корзине?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    while ($qty--) {
        echo "<img src={...
    }
    Ответ написан
  • Как сделать проверку 0 в форме на языке PHP, чтобы проверить, является ли 0 целочисленным значением или нет?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    if (filter_input(INPUT_POST, 'Chislo', FILTER_VALIDATE_INT) !== false) {
        echo 'целочисленное';
    }
    Ответ написан
  • Почему интерпретатор php не воспринимает кириллицу?

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

    Не существует такой кодировки - "кириллица". Есть конкретная кодировка, которую необходимо указать в вопросе.
    Нет такой команды в C# -"послать интерпретатору". Есть конкретная команда или действие, которое надо описать в вопросе.
    Нет такой команды - "сказать, что находится по пути". Есть конкретный код, который надо привести в вопросе.
    РНР - не посетитель в ресторане, чтобы "отказываться". Это программа. Которая либо работает, либо выдаёт сообщение об ошибке. Которое программист должен прочитать. Или по крайней мере, если не понял в нем ни одного слова, то аккуратно скопировать в свой вопрос.

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

    Для того чтобы убедиться в том, что РНР прекрасно работает с русскими буквами, надо создать скрипт test.php
    <?php
    header('Content-Type: text/html; charset=utf-8');
    echo hex2bin('d0bfd180d0b8d0b2d0b5d182'); 
    // текст UTF закодировн в hex чтобы избежать влияния кривых ручек тестировщика/выкрутасов Виндоус


    перейти в папку с ним
    запустить встроенный веб-сервер
    php -S localhost:8081
    и открыть в браузере адрес localhost:8081/test.php

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

    Судя по классической картинке, https://habr.com/en/post/147843/ где-то происходит перекодирование utf-8 -> 866(!)
    Ответ написан
    1 комментарий
  • Как упростить данный скрипт, слишком долго выполняется?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Сделать первичный индекс на вторую таблицу.
    Ответ написан
    Комментировать
  • Хранение значений массива в БД?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это задание, а не вопрос.
    Ответ написан
    5 комментариев
  • Как можно ускорить работу Exception?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    "Если вас беспокоит скорость работы исключений, вы что-то делаете неправильно"

    Ускорить нельзя.
    В данном случае все проблемы не из-за исключений, а из-за говнокода.

    Ошибка валидации при валидации - это не исключительная ситуация, а совершенно нормальная. Часть бизнес-логики. То есть в процессе валидации всего массива данных исключения кидаться не должны.
    Если исключения используются для управления ходом выполнения программы - это УЖЕ ошибка.

    По результатам валидации исключение может кидаться ОДНО. В самом конце. По результатам валидации всего набора данных. Или не кидаться - зависит от конкретной бизнес-логики. Но если и кидать, то только одно, по результатам.
    Это будет правильное использование исключений, которое вообще никак не скажется на скорости работы кода.
    Ответ написан
  • Как вывести значение из массива в ячейку таблицы циклом foreach?

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    В сообщениях об ошибке всё написано.
    Монолог ругался, что у него не хватает прав на запись. И правильно ругался, потому что писать логи приложения в /var/log - это очень так себе идея.

    А сама эта аминязданпапанах ничего не ругается, потому что её автор - дебил.
    Вот за такое
    if (false === @file_put_contents($path, $content)) {

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Правильно.
    Только чтобы общаться с РНР по API, надо сначала написать на РНР этот API
    Ответ написан
    Комментировать
  • Как на стороне сервера закрыть соединение с кодом 200?

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

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

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

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

    Обычно для анрегов корзина делается в сессии, а для регов - в базе.
    При логине и наличии корзины в сессии, содержимое мержится с корзиной в базе. То есть такого вопроса "как сделать идентификацию" в принципе не возникает - все делается само собой. Когда юзер авторизовался, у нас есть и его ид, и сессиия. Что тут может быть не ясно?
    Ответ написан
    Комментировать
  • "Умение профилировать и отлаживать свой код без использования функции dd/var_dump" - это как?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это называется словом "трассировка".
    Пошаговое выполнение программы средствами IDE, с контролем значений всех переменных.
    На определенной строке программы ставится специальная метка, брекпойнт.
    Дойдя до неё, интерпретация кода остановится, и дальше можно будет выполнять каждую строчку по одной, видя при этом значения всех переменных. Причем именно всех, а не только тех, которые ты добавил в дд.
    То есть трассировка средствами IDE удобнее, быстрее и даёт больше информации, чем ручное колупание с вардамп.

    В РНР этим занимается xdebug в связке с IDE

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

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

    MVC - это не про сделать, а про поддерживать и развивать.

    Представим, что вместо обычной формы мы решим сделать ajax. Если у нас будет обычный винегрет из SQL, PHP и html, то придется переписывать его весь.
    Если же у нас нормальная структура, то просто заменим во View вызов шаблонизатора на json кодирование. то есть поменяем одну строчку кода.

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

    Если используется обычный говнокод-подход, то придется все писать заново.
    При использовании MVC, надо будет в этой утилите написать только чтение из файла, а дальше просто вызвать метод модели, который у нас уже есть.
    Ответ написан
    Комментировать
  • Как разделить данные при join-е ( pdo:mysql )?

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

    При ближайшем рассмотрении создание объектов прямо из пдо оказывается довольно бесполезной фичей.

    По данному вопросу либо цикл, как например здесь, либо просто два запроса, второй по списку id из первого
    Ответ написан
    Комментировать
  • Почему не выполняется условие в JavaScript?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Не понимаю, что сложного в том, чтобы зайти в документацию. И увидеть там
    dataType
    Type: String
    The type of data expected from the server. Default: Intelligent Guess (xml, json, script, text, html).

    То есть мало того что у нас древнее и никому не нужное жквери, так оно ещё и играет в угадайку.

    Вместо которой надо явно написать, в каком формате мы данные ожидаем.

    Плюс из пхп лучше не плеваться непонятными словами, а отправлять в нормальном формате, например json.

    Ну и PHP код - это конечно, ужас.
    Ответ написан
    Комментировать
  • Конфигурация проекта: где и как лучше хранить?

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

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

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

    return [
          'db' => [
              'host' => '127.0.0.1',
              'username' => '',
              'password' => '',
              'dbname' => '',
              'port' => 3306,
          ],
      ];


    И в коде что-то вроде такого
    if (!file_exists('config.php'))
      {
          throw new \Exception('Create config.php based on config.sample.php');
      }
      $config = require 'config.php';


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

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

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

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


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

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

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

    Программисты не задают посторонним вопрос, "почему мой код не работает".
    Они задают его своему коду.

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

    Ну если запрос не находит записей - разве не логично вывести его на экран и посмотреть, что с ним не так.

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

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

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

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