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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    <?php foreach (range (0.4, 1.4, 0.1) as $i) { ?>
        <option><?= $i ?></option>
    <?php } ?>
    Ответ написан
    Комментировать
  • Ошибка syntax 'foreach'?

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

    Но если уж пытаться спасти этот ужас,
    public static function act_page($data, $key) {
          if ($key && isset($data[$key])) {
              self::$path .= '/act/'.$key;
              self::display_page($data[$key]['title']);
          } else {
              self::display_error(404);
        }
    }
    Ответ написан
    1 комментарий
  • Зачем интерфейсы если есть трэйты?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вопрос действительно философский.
    Интерфейс - это публичный контракт. Соглашение. "Данный класс обязается делать это и это, и если соглашение подписано, то всегда можно ожидать выполнение классом таких обязанностей". А как он это делает - это его личные половые трудности. То есть интерфейс - это такое министерство иностранных дел класса, отдел внешних сношений. Фасад, вывеска.

    Абстрактный класс и трейт - это министерство внутренних дел.
    Абстрактный класс - это внутренний контракт. Чертеж, прототип, по которому строится класс. Включает внутреннюю кухню, которую посторонним знать не обязательно.
    Трейт - просто повторное использование кода. Возможность нескольким классам использовать один и тот же код.
    Ответ написан
    2 комментария
  • Как понять входит дата в интервал или нет?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Если дата в нормальном формате, то так же, как и любые другие значения.
    Можешь сначала потренироваться на кошках.
    3 входит в интервал от 2 до 5? а 7?
    после того как напишешь код для этих проверок, то для дат будет то же самое.
    Ответ написан
    Комментировать
  • Как сохранить date, php в mysql?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    сохранить текущу дату в mysql проще простого.
    например использовать встроенную функцию now()

    что гораздо важнее - никогда нельзя писать переменные РНР прямо в запрос
    а всегда передавать их отдельно

    $query = "INSERT INTO `test` (`name_exp`, `data_exp`) VALUES ( ?, now())";
    $stmt = $db->prepare($query);
    $stmt=>bind_param("s", $name_exp);
    $stmt->execute();
    Ответ написан
    Комментировать
  • Как вернуть результаты совпадающие в join и убрать все что не совпадают в on?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Есть два основных типа джойнов - inner и outer
    inner, который обычно сокращается до просто join, находит только те записи, которые присутствуют в обеих таблицах.
    outer, который обычно сокращается до left join, возвращает все записи из левой таблицы, а из правой - только те, которым есть соответствия
    Ответ написан
    Комментировать
  • Как правильно создать БД под фильтр?

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

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

    я только не понял какое отношение к вопросу имеет его заголовок. "Как сделать одноразовые ссылки" vs. "генерить одноразовые не прокатит". Вы уж сначала договоритесь между собой, сколько вас там в одной голове живёт, а потом задавайте вопрос на тостере.
    Ответ написан
    3 комментария
  • Как удалить пользователя по условию?

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

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

    Вот здесь например.
    В сессии у тебя чей айди? Правильно. И какой тогда смысл его проверять?

    Если тебе нужно проверять роль удаляемого пользователя, то её и надо сранивать.

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

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

    Нужно. Очень.Четко. Представлять. Себе. Результат. Выполнения. Своего. Кода.

    Поэтому перед тем как писать любой код, надо сначала понять, какой результат мы хотим от него получить.
    Результатом работы РНР кода обычно является HTML.
    Вот и надо написать этот самый HTML. Без всякого РНР, просто чистый HTML.
    Если непонятно, какой мы хотим HTML, то отойти ещё на один шаг назад, понять, какой визуальный элемент на сайте мы хотим сделать, и научиться рисовать его с помощью HTML.
    После этого нарисовать желаемый HTML, посмотреть на него и решить, как его вывести в РНР на основании исходных данных.
    Ответ написан
    Комментировать
  • Не корректная работа json_decode?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    а почему должно выдавать ошибку? и какую?
    Ответ написан
    5 комментариев
  • Как делать фильтрацию PHP / RestAPI / RedBeanPHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Извиниться перед заказчиком, вернуть аванс, купить учебник или оплатить достойные курсы, освоить основы программирования, основы веб-программирования, основы SQL, основый безопасности веб-приложений, основы алгоритмов, основый работы с БД из РНР, и только после этого постепенно приступать к данной задаче.

    Сейчас этот треш нельзя выкладывать в продакшен ни под каким видом.
    Ответ написан
    Комментировать
  • Как корректно работать с датами в MySQL?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Или единственный вариант перед сохранением в бд прогонять на стороне php дату в формат, воспринимаемый mysql'ем?

    Не единственный но единственный осмысленный.
    Тем более что там делов на одну строчку. смотрим strtotome() и date_create_from_format()
    Ответ написан
  • Как исправить ошибку после перехода на php 8?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вордпрессу еще года два на восмерку путь заказан. Как минимум.

    Но вообще специально для таких вот печальных случаев именно в 8-ке придумали
    <?php $cf = get_post_meta($post?->ID, 'n', true);

    Но тогда этот код перестанет работать на всех предыдущих версиях.
    Ответ написан
    3 комментария
  • Как правильно сделать валидаци формы?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    В принципе рациональное зерно в твоих рассуждениях есть.

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

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

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Блин
    Обнови версию РНР и включи отображение ошибок
    Тогда тебе РНР сам подскажет что ты фигню пишешь - пытаешься к булевой переменной обратиться как к массиву
    Ответ написан
    Комментировать
  • Нужно ли проверять каждое обращение к БД на php?

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

    Большинство складывателей букв на РНР об этом не задумываются вообще, и очень хорошо что тебе пришел в голову этот вопрос. А ответ на него очень простой:

    Проверять обращения к БД не нужно вообще

    (за исключением нескольких специальных случаев, когда есть определенный сецнарий обработки ошибки)
    Если же такого сценария нет, то никак проверять не нужно. Просто потому, что обращения к БД ничем не отличаются от любого другого кода.
    И поскольку ты не проверяешь каждый include или там оператор деления, то не нужно и проверять запросы к БД. Их надо оставить в покое. И первый, и каждый по отдельности, и все 5 разом.

    А вот что нужно сделать - это договориться с РНР, чтобы он сам сообщал тебе об ошибках в запросах. Для mysqli надо написать перед коннектом
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    Для ПДО при соединении выставить в настройках соединения

    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

    Всё. Больше ничего для обращений к БД делать не надо.

    А вот обработчик ошибок, общий для всего кода, а не только для работы с БД, настроить желательно.
    Чтобы AJAX-скрипт подписки получал соответствующий НТТР статус при любой ошибке, которая может возникнуть на сервере.
    Ну и разумеется AJAX-скрипт подписки должен проверять НТТР статус, и обрабатывать ответ только если статус= 200
    Пример обработчика можно посмотреть здесь

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

    *На самом деле в транзакцию имеет смысл заключать только запросы, изменяющие данные. То есть все, кроме первого.

    Соотсветственно, если ПДО настроен на выброс исключений, то при ошибке запроса
    - пдо выбросит ислючение
    - которое будет поймано обработчиком ошибок
    - который выведет код ошибки и завершит работу РНР скрипта
    - при завершении скрипта РНР закроет соединение с БД
    - БД при закрытии соединения автоматически откатит незавершенную транзакцию

    причем без обработчика ошибок будет всё то же самое, только клиенту уйдет код не 500 а 200

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

    1. выставить для ПДО режим исключений
    2. перед первым запросом написать $pdo->begin();
    3. после последнего запроса написать $pdo->commit();
    Ответ написан
    4 комментария
  • Как отдавать 404 ошибку если статей нет?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Здесь возможны два варианта, в зависимости от того, что ожидается в переменной $articles

    если список статей, то выкинуть mysqli_num_rows из условия и написать просто
    if (!$articles)
        http_response_code(404);
        include("../../../error/404.php");
    }


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

    А главное - зарубить себе на носу что 404 через редирект не выводится.
    Ответ написан
    Комментировать