Профиль пользователя заблокирован сроком с 10 апреля 2022 г. и навсегда по причине: систематические нарушения правил сервиса
  • Какую книгу посоветуете по PHP?

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    НИКАК не делать.
    Либо тебе вообще не нужна эта функция, и тогда ее не использовать, либо, если нужна, то оставить скобки в покое и найти себе проблему поумнее.
    Ответ написан
    Комментировать
  • Чем заменить ReadBeanPHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Надо понимать что полноценной замены не существует.
    Данная программа - это два тупые молодца, одинаковые с лица, из мультика про Вовку в тридевятом царстве.
    Которые честно пытаются делать то что хозяин им велит, но в силу врожденного слабоумия всё делают не так.
    А всё от того что она хочет быть нянькой для программиста.
    Но если программисту нужна нянька, то такого "специалиста" надо гнать из профессии поганой метлой.
    А если хочет остаться - то да, надо учиться что-то делать самому. руками.
    ЗАРАНЕЕ продумывать и создавать схему БД. И менять только в случае осознанной необходимости, а не потому что вдруг передал в БД не тот параметр, который хотел.
    ЗАРАНЕЕ продумывать и писать SQL запросы. А не ждать что все их за тебя напишет тупая нянька.
    Понимать то как работает пхп с базой данных.

    Поэтому в качестве прививки от говнокода я порекомендую сначала
    - учить устройство БД. Создавать все свои схемы руками
    - учить SQL. Писать все свои запросы руками
    - освоить работу с БД из РНР на базовом уровне, через нативный ПДО.

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Я так понимаю что главная задача - убрать перемножение таблиц.
    По идее должно быть достаточно добавить индекс на product_id.
    тогда во второй строке в rows должна появиться единичка

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вопрос из серии "дурная голова ногам покою не даёт".

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

    Ответы тоже, тостер-стайл: "я вообще не доктор, я сантехник, но вот моё икспертное мнение..."

    В общем, если это сервис по генерации картинок в разных размерах, то тупо лимит на юзера, плюс кэшировать только стандартные размеры.
    Если это обычная галерея, то забыть про дебильную генерацию на лету и делать все размеры сразу при загрузке.
    Ответ написан
    1 комментарий
  • Сессии PHP работают после перезагрузки браузера?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Очевидно, что надо в настройках браузера снять галку с пункта "начинать с того же места".
    Только это все равно никто не будет делать.
    Так что протухание сессии в наше время возможно только по тайм-ауту, и зависит от сборщика мусора убивающего старые файлы сессий.
    Ответ написан
    Комментировать
  • Насколько полное изучение Java c работой над реальными проектам поможет php программисту в его работе?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Несмотря на то что в вопросе немного каша, а в ответах - ад, ответ на вопрос, в общем-то, очевидный.

    В первую очередь с точки зрения простой житейской логики. Есть возможность? Надо воспользоваться. Вылезти из-под своей коряги посмотреть на неё со стороны всегда полезно, в любом деле.
    Возможность узнать что-то новое - всегда полезна. Может быть ты и вправду, как тут вещают некоторые ораторы, проникнешься омерзением к пхп и пойдешь писать на яве.

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

    Хайлоад же проекты - это из немного другой области. Тут идет откат скорее в обратном направлении. Это как с денормализацией - БД должна быть нормализована, но из соображений производительности иногда приходится денормализовывать. ПОСЛЕ того как нормализовал.
    SOLID помогает делать большие проекты управляемыми. Но когда большой проект сталкивается с высокими нагрузками, иногда приходится жертвовать принципами ради производительности. Но тут главное, опять же, не путать направление: СНАЧАЛА делаем правильный дизайн, и только потом в критических точках снижаем накал абстракции, переходим на более низкий уровень. Самый наглядный пример - ORM, когда критические запросы переписываются на чистый SQL.

    Ну и пройти "полный курс" не имеет ничего общего с "полным изучением". С полного курса изучение всегда только начинается.
    Ответ написан
    Комментировать
  • Почему пишет No such file or directory хотя файл есть?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Надо всегда обязательно читать, что написано в сообщении об ошибке.
    Желательно - глазами.
    Оно пишет человеческим языком - где мы сидим и какой файл пытаемся открыть
    /home/ut/Downloads
    /root/Downloads/

    Не наводит ни на какие мысли?

    А что у нас означает буквочка ~?

    Ну и совсем уж риторический вопрос: раз уж мы перешли в папку с файлом, то зачем указывать путь к ней?

    Ну и напоследок - не зря все мудрые руководства рекомендуют не сидеть под рутом
    Ответ написан
    5 комментариев
  • Как определить место вызова функции?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Конвертировать ошибки в исключения
    Исключение уже содержит стек вызовов, то есть в логе он будет автоматически.

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вот ведь любители извращений
    foreach (glob('/dir/*.webp') as $f) {
        $filename = pathinfo($f, PATHINFO_FILENAME);
        if (count(glob('/dir/$filename.*')) == 1) {
            только один, можно удалять
        }
    }


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

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    500.blade - это и есть пользовательская страница. Единственное, что нужно видеть пользователю, при ошибке InvalidArgumentException.
    Никакой другой не нужно
    Ответ написан
  • Как можно защитить XML файл от открытия любым человеком?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Не класть файл в открытый доступ.
    Отдавать скриптом, который принимает в параметре имя файла, проверяет авторизацию и отдает файл с соответствующими заголовками
    "как отдать сгенерированный РНР скриптом ХМЛ файл" в гугле можно найти чуть более чем дофига примеров
    Ответ написан
    1 комментарий
  • Почему не получается записать в базу данных?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    База данных всегда сама подробно расскажет, почему у неё не получилось выполнить запрос. Надо её только об этом попросить.

    Поэтому сначала учимся правильно соединяться.
    Весь этот детский лепет "не могу соединиться с БД" выкидываем и пишем нормальный код, который сам, без всяких проверок, сообщит нам об ошибках.
    В случае mysqli это
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $link = mysqli_connect($host, $user, $pass, $db_name);
    $link->set_charset("utf8mb4");

    Здесь первая строчка отвечает как раз за информирование об ошибках

    Кроме того надо не забыть про ошибки РНР
    Во-первых, всегда в коде должно быть error_reporting(E_ALL);
    Плюс на домашнем компе ini_set('display_errors',1);, а на боевом - ini_set('display_errors',0);ini_set('log_errors',1);, и смотреть, соответственно, в логах.

    После этого переписываем запрос. Причем так, чтобы данные в БД всегда попадали отдельно от самого запроса. Это непреложное правило, которое надо соблюдать всегда.
    Для этого надо
    • Заменить все переменные в запросе на специальные маркеры, которые называются плейсхолдеры или параметры, а по сути - просто знаки вопроса
    • Подготовить запрос к исполнению с помощью функции prepare(). Эта функция принимает строку запроса и возвращает экземпляр специального класса stmt, с которым в дальнейшем и производятся все манипуляции
    • Привязать переменные к запросу.
    • Выполнить подготовленный ранее запрос с помощью с помощью execute()

    В mysqli это будет так
    $sql = "INSERT INTO `events` (`title`, `discription`, `date`, `img`) VALUES (?,?,?,?)";
    $stmt = $link->prepare($sql);
    $stmt->bind_param("sssss", $title, $discription, $date, $path);
    $stmt->execute();

    bind_param() принимает в качестве параметров все переменные, которые должны попасть в запрос, в том же самом порядке, в котором стоят плейсхолдеры в запросе. Но кроме того, сначала в этой функции должны быть указаны типы для всех переменных, в виде строки, где тип переменной обозначается одной буквой. То есть букв в этой строке должно быть ровно столько, сколько дальше будет переменных. К счастью, можно особо не париться с типами и для всех переменных указывать тип "s".

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

    Но по-хорошему для работы с БД в РНР лучше использовать PDO, Тем более что там колупаться с bind_param не нужно, а можно сразу отправить все данные в execute

    Подключение
    $host = '127.0.0.1';
    $db   = 'test';
    $user = 'root';
    $pass = '';
    $port = "3306";
    $charset = 'utf8mb4';
    $options = [
        \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
        \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
        \PDO::ATTR_EMULATE_PREPARES   => false,
    ];
    $dsn = "mysql:host=$host;dbname=$db;charset=$charset;port=$port";
    $pdo = new \PDO($dsn, $user, $pass, $options);

    Здесь за информирование об ошибках отвечает параметр PDO::ERRMODE_EXCEPTION, а остальные просто для удобства/корректности.

    Выполнение запроса
    $sql = "INSERT INTO `events` (`title`, `discription`, `date`, `img`) VALUES (?,?,?,?)";
    $stmt = $link->prepare($sql);
    $stmt->execute([$title, $discription, $date, $path]);
    Ответ написан
    2 комментария
  • Как избежать повтора инклюдов в ООП PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Из всей той ерунды, которую тут уже успели понаписать, и ещё понапишут самозваные "кураторы" и эксперты, единственно полезным является ответ Андрей Ежгуров
    Но он отвечает на следующий твой вопрос.

    А ответом на текущий является

    Передавать его в класс параметром

    Это единственно правильная практика, пусть она даже и кажется тебе не очень хорошим решением.
    Только не целиком конфиг а лишь те опции, которые нужны данному классу.
    Это то как на самом деле работает ООП. Для закрепления материала можешь почитать про dependency injection.
    Ответ написан
    6 комментариев
  • Как добавить только не пустые параметры в бд?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Начнем с того, что "if isset" не проверяет, "пустая ли переменная". Она только проверяет, было ли переменной присвоено какое-то значение.
    Что, в свою очередь, очень забавно смотрится после того как буквально строчкой выше каждой переменной уже было присвоено значение.
    Ну то есть это условие сработает, если в запросе вообще не было такого поля, но во-первых, мне кажется не это имелось в виду, а во-вторых, если поля не было, то уже при присвоении будет ошибка, и после этого делать isset уже как-то глупо.

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

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

    В общем случае нам надо список полей, которые мы можем добавить в БД. Чтобы не колупаться с отдельными переменными. А дальше все просто - цикл, который проверяет на пустоту и формирует сам запрос плюс массив с данными для него.
    $fields = ['phrase','secret','custom1', ...];
    $conditions = [];
    $params = [];
    foreach($fields as $key) {
        if (strlen($val = trim(filter_input(INPUT_POST,$key)))) {
            $conditions[] = "`$key` =?";
            $params[] = $val;
        }
    }
    if ($params) {
        $sql = "INSERT INTO table SET ".implode(",",$conditions);
        $pdo->prepare($sql)->execute($params);
    }
    Ответ написан
    Комментировать
  • Тип возвращаемых значений метода. Как правильно?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Зависит от сценария.
    Судя по коду, отсутствие активности - это не ошибка.
    То есть в данном случае можно вернуть null.

    А вот функции, которые возвращают false в случае ошибки устарели 20 лет назад. И если метод должен вернуть объект, но не может, то он должен кинуть исключение
    Ответ написан
    Комментировать
  • Как сделать погрузку контента по нажатию кнопки на php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    делается просто:
    spoiler
    дополнительный контент


    можешь не благодарить
    Ответ написан
    1 комментарий
  • Как представление в MVC делает переход по id?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Переход делает не "представление", а твой браузер
    Представь себе
    Ответ написан
    Комментировать