Задать вопрос
Ответы пользователя по тегу PHP
  • API bot TG - Как мне узнать, на какой вопрос ответили?

    kawabanga
    @kawabanga
    На уровне бэка добавляете режим ожидания.

    Человек пишет Боту - /start

    Бот показывает меню, или переходит в режим активации регистрации. Вы на беке записываете, что в течении 1 минуты мы ожидаем от пользователя название города или сервисную команду /start . Причем сервисными командами надо научить бэк сбрасывать ожидание.

    Бот отвечает - Напиши название своего Города

    Ставим ожидание команды - город.

    Человек пишет Боту - Москва
    Бот отвечает - Напиши название своей улицы

    Переходим в ожидание улицы

    Человек пишет Боту - Большая садовая

    Ну дальше понятно думаю.

    Самый простой способ сделать такое ожидание - это кэширующая функция в вашем фреймворке на 1-2 минуты.
    Ответ написан
    Комментировать
  • Как вывести крайние диалоги пользователей?

    kawabanga
    @kawabanga
    В общем ключе вот так -
    SELECT * FROM
    (SELECT max(id) as maxId, from_id 
    GROUP BY from_id
    WHERE from_id in (1,2,3)
    ORDER BY maxId desc
    ) as t1
    INNER JOIN messages m on t1.maxId = m.id


    ЧатГПТ Laravel далее код сгенерировал, выглядит корректно. Заметьте, что первую часть запроса в любом случае выполнять через Query Builder, но можно вывести ее в получение конкретных id последних сообщений. И дальше двумя, можно отдельными запросами уже через модель - получить данные по сообщениям и пользователям. Они будут работать по первичным ключам и срабатывать моментально.
    А можно просто добавить жадную загрузку по связи Users на втором запросе, что в целом облегчит вам задачу и не нужно будет связывать далее сообщение и его автора.
    // Подзапрос для получения maxId и from_id
    $subQuery = (new Query())
        ->select(['maxId' => 'MAX(id)', 'from_id'])
        ->from('messages')
        ->where(['from_id' => [1, 2, 3]])
        ->groupBy('from_id')
        ->orderBy(['maxId' => SORT_DESC]);
    
    // Основной запрос с INNER JOIN
    $query = (new Query())
        ->select('*')
        ->from(['t1' => $subQuery])
        ->innerJoin('messages m', 't1.maxId = m.id');
    
    // Выполнение запроса
    $results = $query->all();
    Ответ написан
    Комментировать
  • Как закрыть страницу благодарности от прямых заходов?

    kawabanga
    @kawabanga
    1) Получать с сервера ссылку, а не подставляя ее в js.
    2) Записывать куда то определенный hash на открытие страницы
    https://мойсайт.ru/страница-благодарности.php?hash=123 и потом гасить его, чтобы человек не мог повторно открыть страницу.

    Возможно просто рендер страницы благодарности вместо формы отрисовать после события успешной отправки формы.
    Ответ написан
    2 комментария
  • Как узнать, какой день недели был 100 дней назад?

    kawabanga
    @kawabanga
    // Создаем объект DateTime с текущей датой
    $date = new DateTime();
    
    // Вычитаем 100 дней
    $date->modify('-100 days');
    
    // Выводим результат в нужном формате
    echo  $date->format('N'); // 1 (понедельник) до 7 (воскресенье)


    Ну а дальше подставляете свой массив.
    Ответ написан
    8 комментариев
  • У меня php скрипт не обрабатывает до конца данные когда его веб-хук со стороннего ресурса повторно запускает, что сделать чтобы обрабатывал?

    kawabanga
    @kawabanga
    Если ваши данные обработать нужно на уровне базы данных, то покрывать транзакцией.
    Если просто нужно заблокировать новое поступление вебхука - в быстрое хранилище (кэш), ставите метку, что работа по задаче ведется, и завершаете процесс.
    Ответ написан
    Комментировать
  • Как числа из строки поместить в массив?

    kawabanga
    @kawabanga
    $arr = explode(',', $str);
    foreach ($arr as $value) {
        $new_arr[] = trim($value);
    }


    Зачем использовать регулярки, если они не нужны в задаче.
    А если нужны по заданию, то
    Ответ написан
    3 комментария
  • Как замедлить время выполнения?

    kawabanga
    @kawabanga
    for ($i = 0; $i < $count; $i++) {
        sleep(5); // Я бы тут поигрался с sleep.
    
        // $html = curl_get($silka[$i]); // Ссылка на сериал
        // А вот тут я бы проверял, что запрос дошел. Можно кастомизировать, но в простом случае
        $stopAsking = false;
        $countRequests = 0;
    
        while (!$stopAsking) {
            try {
                $html = curl_get($silka[$i]); // Здесь в функции выбрасывайте исключение и ловите его с помощью https://www.php.net/manual/en/function.curl-error.php
                $stopAsking = true;
            } catch (Exception $e) {
                sleep(1); // Подвязать логику слипа на количество запросов
                $countRequests++;
    
                if ($countRequests > 5) {
                    $stopAsking = true; // И прерывать действие части скрипта, которая делает запрос на сервер.
                }
            }
        }
    
        if ($countRequests > 5) {
            continue;
        }
    
        $dom = str_get_html($html); // Парсить страницу
    
        $finds = $dom->find('.added-info');
    
        foreach ($finds as $find) {
            $tfind = trim($find->plaintext);
            if ($series[$i] === $tfind) {
                echo $id[$i];
                sleep(5); // У вас это запускается только в случае, если будет finds. В принципе, sleep тут не нужен уже, так как выработаете с готовой страницей. Но, например, если $finds = $dom->find('.added-info'); - не будет, то следующий запрос будет моментален.
            } else {
                $sql = "UPDATE `seria` SET `series` = '$tfind' WHERE `seria`.`id` = $id[$i]";
                $mysql->query($sql);
                message_to_telegram("Вышла новая серия" . $series[$i] . $silka[$i]);
                echo $id[$i];
            }
        }
    }
    Ответ написан
    Комментировать
  • Как повысить уровень создания проектов на чистом php?

    kawabanga
    @kawabanga
    Тем не менее сейчас я столкнулся с тем, что на собеседованиях начинают спрашивать что серьезного доводилось делать на чистом php - без фреймворков и мои ответы на их вопросы касательно парсеров, скиптов для обмена данными остаются неубедительными. Даже дальше кадровиков иногда дело не уходит.


    Вы неубедительны. Парировать надо. Ну найдите разраба, который в угоду своему ЭГО, будет писать проект на чистом php, который в будущем сможет поддерживать только он.

    Еще спрашивюат какие патерные проектирования используешь, придерживаешься ли принципов Solid?

    Вы недостаточно сильны в этом вопросе, SOLID опять же не про фреймворки.

    А сейчас я не только ради прохождения собеседований, но и ради повышения скилла хотел бы углублённо погрузиться в написание кода без фреймворков. Но как к этому подойти? Не писать .же бложег или интернет-магазин на чистом php?

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

    Может начать с изучения PSR

    Нужно, сразу после того, как вы начнете понимать php.

    от него начать писат простой psr фреймворк как это делал Дмитрий Елисеев?

    А что это вам даст?

    Или просто взять симфони и начать писать на ней чтоб понять суть вещей глубже и потом козырять своими скиллами на собеседованиях, что, мол, ,я тут на Симфони пишу, а вы мне тут вопросы для школьников задаёте?

    А при чем тут симфони и вопросы школьников?

    Короче расскажите мне про роудмеп погружения в php. Теорию я и так знаю - книги по php читал.

    Сначала начните с того, как искать в гугле. Полезный навык, помогает.
    https://github.com/thecodeholic/php-developer-roadmap
    Ответ написан
    3 комментария
  • Как массово редактировать товары Вконтакте через API?

    kawabanga
    @kawabanga
    А почему он останавливается через 30 минут?
    Возможно нужно CLI использовать? Ну или обновить настройки сервера?
    Ответ написан
  • Как перевести curl запрос на php с передачей сертификатов (api Сбербанка)?

    kawabanga
    @kawabanga
    ChatGPT:

    Для отправки этого cURL запроса в Guzzle PHP, вам потребуется установить Guzzle HTTP клиент, если он еще не установлен. Выполните следующие шаги:

    Установите Guzzle через Composer (если вы этого еще не сделали):
    composer require guzzlehttp/guzzle


    В вашем PHP-скрипте используйте следующий код для отправки запроса:
    <?php
    
    require 'vendor/autoload.php'; // Путь к файлу autoload.php из установленного Guzzle через Composer
    
    use GuzzleHttp\Client;
    
    $baseUrl = 'https://mc.api.sberbank.ru/prod/tokens/v3/oauth';
    $rqUID = '25Ec70328e2CE4DF39e828E1dF75EFa0';
    $authorization = 'Basic MTgwYmYzNTItNDlhZC00MGVhLTgyYmItMDcwMTRiMjdjODQ5OjUwM2NhNmUwLWE5OWEtNDYzZC05OTIzLWJlZWUzYjVhYzYzNA==';
    $scope = 'https://api.sberbank.ru/qr/order.create';
    $certPath = '/absolute/path/to/certif.p12';
    $certPassword = 'RiKZcN3Z';
    $cacertPath = '/absolute/path/to/russian-trusted-cacert.pem';
    
    $client = new Client();
    
    $response = $client->request('POST', $baseUrl, [
        'headers' => [
            'RqUID' => $rqUID,
            'Authorization' => $authorization,
            'Content-Type' => 'application/x-www-form-urlencoded',
        ],
        'form_params' => [
            'grant_type' => 'client_credentials',
            'scope' => $scope,
        ],
        'cert' => [$certPath, $certPassword],
        'verify' => $cacertPath,
    ]);
    
    // Выводим результат запроса
    echo $response->getBody()->getContents();


    Пожалуйста, замените /absolute/path/to/certif.p12 и /absolute/path/to/russian-trusted-cacert.pem на абсолютные пути к вашим сертификатам. Также убедитесь, что у вас есть правильные данные для RqUID и Authorization заголовков.

    Этот код отправит POST запрос с указанными данными и получит ответ от сервера Sberbank.
    Ответ написан
    2 комментария
  • Почему у php недостаточно прав на перезапись файлов?

    kawabanga
    @kawabanga
    1) Добавляете пользователя нового, например admin, с привилегией sudo. Добавляете его в группу www-data
    2) Загружаете файлы от имени этого пользователя в дальнейшем.
    3) Выставляете необходимые права при необходимости. К примеру вот - владелец admin, и группа www-data у файла
    -rwxrwxr-x 1 admin www-data 3958 Jul 1 10:38 README.md

    В вашем конкретном случае, проще всего написать что-то типа

    sudo chown -R www-data:www-data /webdirectory
    sudo chmod -R 0755 /webdirectory
    Ответ написан
  • Как результат foreach поместить в переменную?

    kawabanga
    @kawabanga
    $itemstest[] = [
                    'item_sku' => $product->get_sku(),
                    'item_title' => $product->get_name(),
                    'item_quantity' =>  $item_data['quantity'],
                    'item_price' => $product->get_price()
                ];
    Ответ написан
    2 комментария
  • Как работать с FFMPEG без ссылок на файлы?

    kawabanga
    @kawabanga
    Если условие что в 2 секунды любое аудио декодируется и вам нужно лишь правильно отправлять все через ajax, то formdata js в помощь

    ~JS
    var formData = new FormData();
    formData.append('file', fileInput.files[0]);
    
    $.ajax({
      url: 'upload.php',
      method: 'POST',
      data: formData,
      contentType: false,
      processData: false,
      success: function(response) {
        console.log('File uploaded successfully');
      },
      error: function(jqXHR, textStatus, errorMessage) {
        console.log('File upload failed: ' + errorMessage);
      }
    });


    ~PHP
    require_once '/public_html/vendor/autoload.php'; 
    $ffmpeg = FFMpeg\FFMpeg::create();
    $mp3Format = new FFMpeg\Format\Audio\Mp3(); 
    $videoFolderPath='/public_html';
    
    if(!isset($_FILES['file'])) {
      return 'no file';
    }
    
    $tempName = $_FILES['file']['tmp_name'];
    
    
    $audioObj = $ffmpeg->open($tempName);    
    $audioObj->save($mp3Format, $videoFolderPath.'/myfile.mp3');
    Ответ написан
    1 комментарий
  • Почему не работает curl?

    kawabanga
    @kawabanga
    $data = <<<DATA
    {
    "param": $param,
    }
    DATA;


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

    kawabanga
    @kawabanga
    https://docs.nginx.com/nginx/admin-guide/web-serve...
    Должен сработать по идее, если нюансов особых нет. Vps самую дешевую покупаете и настраиваете nginx.
    Ответ написан
    Комментировать
  • Проблема с созданием laravel проекта//?

    kawabanga
    @kawabanga
    1) Обновить composer как минимум (Второй кушает меньше памяти, а первый прям лагал иногда).
    2) добавить памяти в php.ini в консольной версии вашего php (CLI).
    Ответ написан
  • Как вывести на PHP график работы, начиная с 1 числа?

    kawabanga
    @kawabanga
    Тут могут быть ошибки. Лучше переделать, загружая дату в Datetime, а потом спрашивать номер дня недели и сравнивать.
    https://www.php.net/manual/en/class.datetime.php
    (date('N', strtotime($date)) >= 6);


    А потом -
    function isWorkDay($num) {
        return  !isWeekend($num)
    }


    Только вопрос еще - а почему в эти две идентичные функции, вы в одну загружаете date, а во вторую $num?
    Ответ написан
    Комментировать
  • Docker стал долго загружать проекты в браузере, в чем может быть проблема?

    kawabanga
    @kawabanga
    Может не в докере проблемы.
    открываете Chrome, смотрите вкладки network в первую очередь, в поисках того что тормозит.
    У меня с февраля отключились некоторые cdn, и тормоза были от них.
    Ответ написан
    1 комментарий