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

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

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

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

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

    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
    тогда проблемы с "как остановить" и "как сделать чтобы процесс не останавливался" решатся сами собой
    Ответ написан
    Комментировать
  • Как эффективно хранить 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 запросы из РНР, можно посмотреть в этом ответе
    Но сначала надо понять, какой именно запрос мы хотим выполнить. А с этим тут тоже проблемы.
    Ответ написан
  • Как раскодировать JSON в PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    наверное, такой вопрос и надо задавать? Не "как раскодировать json", а как удалить лишние слеши в строке?
    И внезапно ответ найдется сам собой
    Ответ написан
    Комментировать
  • Как прописать классы в php коде?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Объясняем на простом примере, как в программировании можно использовать логическое мышление.
    $description = "<div id='details-2' class='col-12 col-xl-4 col-lg-12 mb-xl-5 mb-5'><div class='d-flex b-skills'><div class='height:70px;'><div class='text-bold'>";
    echo $description,"\n";
    echo addslashes($description);

    Берём наше многострадальное слово дескрипшен и выводим как есть. И - о чудо! - все кавычки на месте.
    После этого добавляем функцию добавления обратных слешей. И видим, что они добавились к кавычкам.
    Из чего мы можем сделать логический вывод о том, что между созданием многострадальной переменной дескрипшен и выводом её содержимого на экран, присутствует некий говнокод, который по какой-то неведомой причине добавляет к ней обратные слеши.

    И откройте уже для себя волшебные клавиши Ctrl-U
    При проблемах с генерацией хтмл, надо смотреть ровно то что нагенерил ваш код, а не те красявости, которые старательно подрисовывает к нему инспектор.
    Ответ написан
    5 комментариев
  • Как правильно составить SQL запрос SELECT PDO PHP для получения данных по двум строкам?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ответ написан
    Комментировать
  • Как узнать ip пользователя?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Всегда стоял стандартный говнокод, которые ламеры всего мира старательно переписывают друг у друга, не понимая его смысла. Из него надо оставить только
    $ip=$_SERVER['REMOTE_ADDR'];
    а всю остальную ересь на помойку.

    Читать тут: phpfaq.ru/tech/ip
    Ответ написан