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

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

    На одном только этом сайте не меньше сотни ответов на этот вопрос.
    Ответ написан
    Комментировать
  • Использовать trait в class, когда они лежат в разных файлах php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Скажите, вы правда про автолоадинг классов в РНР вообще никогда не слышали?
    Ответ написан
  • Как обработать запрос?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    я уже не в первый раз вижу этот говнокод на тостере, "db::i()"
    там ещё шаблонизатор вызывается такими же командами, как будто у программиста вычитают из зарплаты за каждый написанный символ.
    кто-нибудь знает, что это за творение нечеловеческой мысли?
    Ответ написан
  • Как лучше считать количество непрочитанных сообщений?

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

    Про "нечастые" запросы я не понял. Лет 20 назад, когда единственным способом обновить статус диалога было обновить страницу форума в браузере, это могло бы как-то проканать. А сейчас, когда пользователь ожидает обновления информации не совершая никаких действий, а просто глядя на экран, да ещё и в другом приложении, я не понимаю, как это должно работать. Когда именно приложение должно совершать свои нечастые селекты?

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    1. гуглим как в баше перевести дату в метку времени юникс
    2. (опционально) гуглим как получить текущую метку метку времени юникс
    3. вычитаем одно из другого, получаем разницу в секундах
    4. как получить минуты из секунд, я очень надеюсь что вы сможете осилить самостоятельно
    Ответ написан
    Комментировать
  • Почему неправильно работает сравнение?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вопрос
    Сколько строк вернёт база данных, если в запрос передать несуществующий логин?

    Дополнительный вопрос
    Какой смысл вообще городить авторизацию, если любой придурок авторизуется без всякого пароля, через SQL инъекцию?

    Подробнее про вопрос секьюрности этого куска:
    Если переменная подставляется напрямую в запрос, то это значит что в нее можно дописать SQL, который будет делать совсем не то, что ожидалось.
    Например, если вместо имени пользователя написать что-то вроде имя' AND LEFT(password, 1) = 'a
    то тогда код напишет "Лоигн занят" если первая буква пароля - "а". Пара десятков таких запросов - и первую букву мы уже угадали. Тем же способом же достаём остальные и вот мы получили пароль любого клиента.

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

    Здесь надо делать так

    $input = json_decode(file_get_contents("php://input"), true);
    
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $link = mysqli_connect(*информация БД*);
    $link->set_charset("utf8mb4");
    
    $stmt = $link->prepare( "SELECT login FROM sn_users WHERE login=?");
    $stmt->bind_param("s", $login);
    $stmt->execute();
    $result = $stmt->get_result();
    $row = $result->fetch_assoc();
    if ($row) {
        echo "Лоигн занят";
    } else {
        echo "Лоигн свободен";
    }
    Ответ написан
    7 комментариев
  • Как отредактировать данные в php файлах?

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

    Чтобы при помощи php можно через форму можно редактировать данные, они не должны лежать в РНР файлах.
    Ответ написан
    4 комментария
  • Зачем несколько уровней в функции вывода результата sqlite3?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это идиотская функция.
    Ни $count, ни несколько уровней (вложенных циклов, как я понимаю) здесь не нужны.
    Она зачем-то перебирает полученный массив $row в цикле, чтобы получить в итоге точно такой же.
    ТОГО ЖЕ САМОГО результата можно добиться кодом
    function bdresult($queryResultSet){
        $multiArray = [];
        while ($row = $queryResultSet->fetchArray(SQLITE3_ASSOC)) {
            $multiArray[] = $row;
        }
        return $multiArray;
    }

    без дурацкого перебора массива $row.
    Эта функция запрашивает по очереди все строки, которые вернул запрос, и добавляет их в массив, который потом возвращает.

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

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

    И делать не 100500 способов оповещения, а один.
    То есть сделать таблицу подписки, в которой указано - на какое событие подписался юзер, и его айди.

    После этого написать самый тупой код, который прямо при наступлении события лезет в базу, находит емейлы всех полутора подписантов, и в цикле рассылает им оповещения.

    Одно это уже займёт вас на пару месяцев.

    И только после того как это сделано, после того как заработает хоть что-то, можно начинать думать в сторону других способов. Но опять же, не всех скопом, а по одному. Сделали рассылку в телеграм? Поехали с оповещениями в браузер.

    То же самое касается способа рассылки.
    Только после того как рассылка начинает занимать ощутимое время - и, разумеется, после того как она вообще была сделана - только после этого можно задуматься о сервере очередей, о том что по наступлению события добавляются только задания в очередь, а сами рассылки делают несколько отдельных сервисов и воркеров. И всё это, разумеется, только если проект не загнется раньше/у автора не пропадёт интерес/у него же хватит способностей осилить всю эту премудрость
    Ответ написан
    Комментировать
  • Каким образом лучше вывести в консоль веб-сервера PHP данных вроде ошибок, данных (var_dump) схожим образом, как они выводятся при разработке на IDE?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    если честно, то я совсем не понимаю этих проблем

    и постоянно бегать на сервер обновлять лог и обратно,

    я не понимаю, что это значит
    в моем мире есть ssh консоль на сервер, в котором запущена команда tail -f error.log
    которая в реальном времени отображает все обновления в логе
    то есть "бегать" и "обновлять" ничего не нужно, а всего лишь разместить окно терминала на соседнем мониторе и видеть всю отладочную информацию в реальном времени
    это если говорить об отладке через лог ошибок и "консоль веб-сервера" (что бы это не значило)

    вывод var_dump(), конечно, без небольшой доводки так просто в лог не направишь, но вместо неё вполне можно использовать json_encode. ну или уж написать обертку над var_dump которая через ob_start сохраняет вывод в строку, которую потом можно через error_log() отправлять в лог ошибок РНР

    я работаю с вебхуками и api поэтому браузером почти не пользуюсь.

    Опять же, я не понимаю, как можно работать с вебхуками и API без Postman
    И если мы работаем через Постман - то какая проблема собственно в том же окне и видеть ответ сервера?
    Ответ написан
    Комментировать
  • Остановить работу крон задачи, которая выполняет бесконечный цикл?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Я не понял, так чего вы боитесь в итоге - что "будет подъедать" или что процессы будут накладываться друг на друга.
    Во втором случае надо определиться - это запуск по крону, ИЛИ демон.

    В общем случае надо выкинуть крон вообще и использовать supervisord
    тогда проблемы с "как остановить" и "как сделать чтобы процесс не останавливался" решатся сами собой
    Ответ написан
    Комментировать
  • Лучший способ автоматического бэкапа для mysql?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Все зависит от начальных условий.
    Если условия "я тут мимо проходил, покажите какие кнопочки нажимать", то тогда скорее всего подойдут решения, предложенные выше. Но на более менее нормальном сайте (постоянная запись в БД, транзакции) не будет выполняться условие "Бэкап должен не мешать работе сайта"
    В этом случае надо использовать percona xtrabackup

    Я, правда, в свою очередь не уверен в требованиях "Защищенная работа обработчика" и "возможность работы через ISPmanager".
    Первое это какая-то непонятная чушь, а про второе я просто не в курсе. Никогда не пользовался этим мусором и никому не советую.
    Ответ написан
    Комментировать
  • Что делать человеку, желающему связать жизнь с Информацинной Безопасностью?

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

    В целом я не рекомендую целиться сразу в ибэ.
    Надо либо серьёзно осваивать программирование -"обложиться страуструпами" (который, правда, никакого отношения к ООП не имеет, не говоря уже о том что ООП в свою очередь не имеет отношения к ибэ). Только, разумеется, не модный язык Пайтон, а по хардкору - Си, ассемблер, работа с памятью, отладчики - вот это вот всё. То, что имеет отношение к собственно вирусам хакингу и пр.

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

    А потом уже, имея хоть какой-то реальный багаж, двигаться в вожделенное ибэ.
    Ну или понять, что это всё не твоё, и устроиться менеджером в евросеть, а девочкам в кафэ рассказывать что ты очень, очень крупный и очень, очень засекреченный специалист по ибэ. А на все вопросы делать загадочное лицо
    и говорить только одно слово - NDA. Это тоже работает.
    Ответ написан
    Комментировать
  • Как эффективно хранить canvas попискельно в БД с последующим отображением?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ну как минимум за $table->string('color', 18); надо руки сразу отрывать
    То есть на координатах наэкономили, 4 байта в сумме, а потом хоба - в 4 раза больше на несчастный цвет. при том что цветов там явно не больше десятка. И это не говоря уже про нормализацию.

    По уму надо придумать простой бинарный протокол, который получает поток байт выравненными кусками
    2 байта х
    2 байта у
    1 байт цвет
    4 байта юзер (и нечего жадничать, никаких BigInteger. половины населения земного шара вполне хватит)
    то есть всего 9 байт.
    а не под сотню, как сейчас - ещё и завернутое в скобочки/кавычечки джейсона

    Если подумать, то можно юзера сразу не передавать. Всех юзеров никто смотреть не будет, а при наведении можно и отдельный запрос послать. Тогда можно и BigInteger оставить.
    Получится всего 5 байт на пиксель, то есть 10 метров на всю карту. Дофига, но подъемно.

    По пагинации это дурь какая-то. Зачем "офсет-лимиты" если уже есть четкая разбивка.
    Кто мешает запрашивать тупо построчно? Скажем, по 100 строк картинки? 10 запросов по мегабайту.
    id в этой таблице по сути вообще не нужно, только если лара без него не сможет. Но по уму первичный ключ - это ху.

    Из БД получать 2 лимона строк конечно тоже не сахар
    Но можно наверное увеличить строки, хотя бы виртуально.
    Вью или процедура, которая комбинирует скажем сто строк в одну

    Насчет других хранилищ я не уверен. Там же наверняка нужна будет выборка обновлений, по таймстампу.
    Но в целом с Редисом поэкспериментировать можно.
    Ответ написан
    1 комментарий
  • Как обратиться к Kuna API через PHP file_get_contents?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Если через курл работает, а через file_get_contents - нет, это значит что во втором случае не заданы в точности те же самые параметры, которые используются в первом варианте.
    Можете не благодарить.
    Ответ написан
  • C чего новичку начинать изучение php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Если на английском, то
    https://phptherightway.com/
    https://phpdelusions.net/
    https://www.youtube.com/watch?v=sVbEyFZKgqk&list=P...
    Ещё порекомендую по возможности приобрести книгу Джона Дакетта PHP&MySQL

    Ну и если есть вот прямо такое желание не превратиться в редиску позорящего (а с РНР это практически неизбежно, учитывая количество говнокода, который выдают за обучающие материалы всякие самозванцы, жулики и просто дурачки) то при сомнениях пишите сюда вопросы, мы всегда поможем разобраться и отличить зерна от плевел
    Ответ написан
    2 комментария
  • Как правильно связать php сайт с mysql?

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

    Чтобы соединить сайт с mysql, в РНР вообще-то есть два API - mysqli и PDO. Несколько лет назад с mysqli вообще невозможно было нормально работать, но на данный момент они выровнялись, хотя PDO все равно удобнее, по трем причинам
    1. Единый интерфейс при работе с различными СУБД (неактуально, если mysql для нас является синонимом слова база данных)
    2. Набор функций-хелперов для получения данных из БД в различных форматах (при желании легко воспроизводится вручную)
    3. Именованные плейсхолдеры (для некоторых это главная причина использовать PDO)

    Но в целом, как я говорил выше, сейчас можно использовать любое API. Главное - не использовать тот древний говнокод, который приведён в вопросе.

    1. Создаём файл`config.sample.php` куда кладем все настройки приложения, в том числе базы данных
    return [
    	'db' => [
    		'host' => '127.0.0.1',
    		'username' => '',
    		'password' => '',
    		'dbname' => '',
    		'port' => 3306,
    		'charset' => 'utf8mb4',
    	],
    ];

    2. В файле, который включается во все скрипты сайта, добавляем код
    if (!file_exists('config.php'))
    {
    	throw new \Exception('Create config.php based on config.sample.php');
    }
    $config = require 'config.php';

    3. И дальше в этом же файле пишем собственно нормальный код подключения к БД
    либо к mysqli
    // включаем режим информирования об ошибках
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    // подключаемся к серверу
    $dbc = $config['db'];
    $db = new \mysqli($dbc['host'], $dbc['username'], $dbc['password'], $dbc['dbname'], $dbc['port']);
    // не забываем установить кодировку, чтобы не было ошибок с кракозябрами
    $db->set_charset($dbc['charset']);

    либо к PDO
    $options = [
        \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
        \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
        \PDO::ATTR_EMULATE_PREPARES   => false,
    ];
    $dbc = $config['db'];
    $dsn = "mysql:host=$dbc[host];dbname=$dbc[dbname];charset=$dbc[charset];port=$dbc[port]";
    $pdo = new \PDO($dsn, $dbc['username'], $dbc['password'], $options);

    После того как будет освоена работа с системой контроля версий (а по-хорошему это надо было сделать уже давно) добавляем config.php в файл .gitignore
    Таким образом на каждом хосте, где исполняется этот код, будет собственный файл с настройками, создаваемый по образцу из config.sample.php

    Да, и Очень Важное Дополнение:
    почему нельзя сделать 1 соединение для сайта и не тратить каждый раз время на коннект к БД?

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    phpfaq.ru/newbie/paths
    $_SERVER['DOCUMENT_ROOT'] даст абсолютный путь к корню сайта безотносительно текущего файла. т.е. более универсальный. но работает только в веб-окружении. подходит для всяких конфигов и других общих файлов
    __DIR__ поможет построить абсолютный путь относительно текущего файла. работает везде, но от разных файлов будет строиться по-разному
    Ответ написан
    Комментировать
  • Laravel Service Layer обработка ошибок?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    в catch надо проверить тип ошибки.
    если это ошибка "такая запись есть", то кинуть исключение, которое будет понято контроллером, и преобразуется в пользовательскую ошибку
    если это любая другая ошибка, то просто throw $e;

    } catch (QueryException $e) {
        DB::rollBack();
        if (условие по которому видно что запись уже есть) {
            throw new NonUniqueValueException(); 
        } else {
            throw $e;
        }
    }

    и тогда потом в контроллере можно будет
    try {
        $productCreateService->store($retail->id, $request->getDto());
    }catch(NonUniqueValueException $e){
        // пишем юзеру
    }
    Ответ написан
  • Почему не обновляется запись в бд при нажатии на кнопку?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    потому что нельзя получить программу, задавая вопросы на форуме
    Учиться всё равно надо
    Надо купить или хотя бы скачать учебник Котерова, и начать осваивать программирование.
    Прочитать и усвоить оттуда, что такое SQL, как пишутся запросы
    Что такое РНР и как выполнять SQL запросы из РНР
    Как сделать так, чтобы баланс пополнился только у одного пользователя, а не у всех сразу
    Как отличать пользователей друг от друга
    Что такое база данных
    И так далее

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

    Про то, как выполнять SQL запросы из РНР, можно посмотреть в этом ответе
    Но сначала надо понять, какой именно запрос мы хотим выполнить. А с этим тут тоже проблемы.
    Ответ написан