Задать вопрос
Профиль пользователя заблокирован сроком с 10 апреля 2022 г. и навсегда по причине: систематические нарушения правил сервиса
Ответы пользователя по тегу PHP
  • Стоит ли хранить зашифрованные данные пользователя в Local/Session Storage на клиенте?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это просто идеальная иллюстрация к известному высказыванию Дональда Кнута "Преждевременная оптимизация - корень всех зол".

    Сначала высасываем из пальца проблему: "тратится время на обращение к бд". Сколько там его тратится, тратится ли вообще, замедляет ли это систему, является ли вообще это проблемой - все эти вопросы нам неинтересны. Мы хотим грудью на амбразуру, стать героем и получить медальку.

    После этого начинаем проблему решать.
    Значит, чтобы сэкономить время на запросе к базе, которая обычно лежит локально и обычное обращение занимает микросекуны, мы решаем закэшировать данные на клиенте. Который может быть в тысяче километров, а пинг в сотни миллисекунд - не редкость. И вот мы решаем что клиент будет с каждым запросом отправлять массив данных. Причем таких данных, которые на сервере и так. есть. Гениально!

    Стоит ли так делать и почему;
    не стоит потому что не надо высасывать проблемы из пальца.
    Какой будет прирост производительности
    Отрицательный
    Как Вы решаете подобные вопросы.
    МЫ ИХ НЕ РЕШАЕМ.
    Мы решаем реальные проблемы, объективно существующие.
    А воображаемые проблемы высосанные из пальца решать не следует.
    Ответ написан
    Комментировать
  • Где вы храните запросы к базе в коде или используйте хранимые процедуры?

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

    Если отвечтаь на вопрос буквально, то

    1. Для большинства простых операций с БД запросы вообще не пишутся, пишутся обращения к ORM. Например в вместо
    $stmt = $pdo->prepare("SELECT * FROM users WHERE id=?");
    $stmt->execute([$id]);
    $user = $stmt->fetch();

    Пишется

    $user = $em->getRepository(User::class)->find($id);


    2. Сложные запросы с фильтрами лежат в специальных классах, которые называются репозиториями.
    Ответ написан
    7 комментариев
  • Как обойтись без параметра для parent?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Всем изучающим ООП надо метровыми буквами написать во всю стену

    НАСЛЕДУЮТСЯ КЛАССЫ, А НЕ ОБЪЕКТЫ
    НАСЛЕДУЮТСЯ КЛАССЫ, А НЕ ОБЪЕКТЫ
    НАСЛЕДУЮТСЯ КЛАССЫ, А НЕ ОБЪЕКТЫ

    И медитировать на них каждый день по часу.
    Другими словами -

    НАСЛЕДУЕТСЯ СТРУКТУРА, А НЕ СОСТОЯНИЕ

    чтобы не приходили в голову глупости типа
    мне нужно чтобы $this->test была создана в родителе и уже была в потомке


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

    Как тебе уже сказали, ты что-то делаешь не так.
    Ответ написан
  • Куда указывает ссылка?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это совершенно бессмысленная ссылка.
    она указывает на каталог выше корня, чего не бывает.

    "выше папка текущего файла" - это ../include.php

    Читаем основый путей в файловой системе: phpfaq.ru/newbie/paths
    Ответ написан
    Комментировать
  • Как проверить что в строке нет символов кроме пробелов?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вообще, конечно, trim() не соответствует буквально поставленной задаче, но скорее всего соответствует невысказанным желаниям автора, которому не нужны и символы перевода строк.

    А вот нестрогая проверка вообще ничему не отвечает. Не давая ввести вполне себе не пробельный символ 0.

    Так что корректный вариант (для всех пробельных символов), пожалуй, будет таким
    if (!strlen(trim($string))) {
        die;
    }

    а буквальный (только пробелы) таким
    if (!strlen(str_replace(" ", "", $string))) {
        die;
    }
    Ответ написан
  • Возможно ли средствами JS или PHP получить реальный путь к загружаемому файлу?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Нет.
    Ответ написан
    Комментировать
  • Почему date_parse_from_format не подставляет 0 в дату?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это какая-то дурацкая и бессмысленная функция. Не надо её вообще использовать.
    $date  = DateTime::createFromFormat('d-m-Y',date('d-m-Y'));
    $day   = $date->format('d');
    Ответ написан
    1 комментарий
  • Хорошо ли хранить serialize в БД?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ни в коем случае.
    Твоя база данных не зря названа реляционной, то есть связанной. Информация хранится в связанных между собой таблицах. Это позволяет получать нужную информацию одним запростом и обрабатывать миллионы срок без потери производительности. Что в миллион раз важнее лени "создавать дополнительную таблицу"

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

    Сериализованные данные стоит хранить в бд только в очень крайнем случае.
    На данном этапе вообще забудь про такую возможность и учись работать с БД правильно.
    Ответ написан
    9 комментариев
  • Как в регулярных выражениях получить значение двух последних каталогов из URL?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ну и чтобы был буквальный ответ,
    $str = 'https://toster.ru/1234/4321/';
    preg_match('!.*/(.*?)/(.*?)/$!', $str, $matches);
    list (, $first, $second) = $matches;
    Ответ написан
    Комментировать
  • Какая логика обфускации php кода под доменное имя?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Каждый начинающий программист воображает, будто его гениальный код кому-то нужен, а пару десятков человеко-часов - нереаьными трудозатратами.
    Ответ написан
    1 комментарий
  • Как удалить массив с одинаковыми значениями в многомерном массиве PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    В цикле
    Любые операции с массивами делаются вцикле.
    Ответ написан
    2 комментария
  • Правильно ли создаю сам себя?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Не трогал бы ты эту статику.
    Целее будешь
    Ответ написан
    22 комментария
  • Как быстро разобраться?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    1. C <? ?> все понятно, вообще нигде не используешь
    2. C <?= ?> все понятно, используешь для вывода
    3. C <?php ?> все понятно, используешь чобы переключиться из режима HTML в режим PHP.Открыть там где начинается пхп код. Закрыть там где начинается хтмл код
    Ответ написан
    3 комментария
  • Как соединить php и vue?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    через rest api
    целесообразно
    Ответ написан
    Комментировать
  • Почему не срабатывает fetchRow?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    потому что в mysqli нет функции fetchRow
    Ответ написан
    Комментировать
  • Как установить mod_php на CENTOS/RHEL 8 вместо php_fpm?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Анекдот про хирурга слышал? Вот чувак тоже вещал, что у него "специфика". Пока ему кое-что не откочерыжили. А оказалось, что специфика совсем другая.

    Рассказывай, что за специфика и тебе расскажут, как сделать правильно
    У меня есть предположение, но мне даже неудобно его озвучивать

    Также если поискав в Интернете, то видел что когда работает Apache + PHP_FPM он работает существеннее медленее, чем Apache + MOD_PHP

    Ну-ка ну-ка, с этого места поподробнее.
    Мне даже интересно, где такое адище пишут.
    Нет, ну понятно, что в мире похапе любое взятое наугад высказывание - это ад кромешный, но мне просто любопытно, из какого такого замысловатого места растут руки у того, кто это написал.
    Ответ написан
    Комментировать
  • Как заменить null в implode на 0?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Господи, implode-то тут зачем?
    Тебе нужен первый элемент массива.

    count(*) ВСЕГДА возвращает значение, никакого нулл тут никогда не будет

    return $get_pay_tr[0];

    И все
    Ответ написан
    Комментировать
  • Зачем в catch делать throw?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Хороший вопрос.

    1. В catch только одно проверяем конкретное исключение, которое мы ждём и знаем как обработать.
    Например, при вставке записи в БД мы можем обработать ошибку уникального ключа, сообщив пользователю, что такой юзернейм уже занят.
    Но если ошибка не такая, какую мы ожидали, то она должна быть обработана стандартным способом. Для этого её надо перевыборосить.

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

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

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Перед $db = new mysqli($localhost, $user, $passwd, $database); дописать
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    после этого база сама скажет в чем проблема
    Ответ написан
    Комментировать