Ответы пользователя по тегу PHP
  • Как исправить ошибку Warning: mysqli_query() expects parameter 1 to be mysqli, string given?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Необходимо передать в качестве первого параметра объект класса mysqli, а не строку.
    Ответ написан
    Комментировать
  • Есть ли разница SELECT * FROM `bd` WHERE `id` = '$id' и SELECT * FROM `bd` с поиском через цикл?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Да, есть разница. Первый запрос будет быстрее и эффективнее, так как он использует индексирование для быстрого поиска записи по идентификатору. Второй запрос будет медленнее, так как он будет проходить циклом по всем записям в базе данных, чтобы найти нужную запись.
    Ответ написан
  • POST работает как GET, почему?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Потому что нет различий между GET/POST/HEAD/DELETE и т.д. методами. Это просто название. Ты можешь и с GET отправить гигабайтный файл, а с POST ничего не отправлять. То, что мы с GET ничего особо не отправляем, а с POST передаем данные в теле - это лишь негласное соглашение.

    Ты можешь сделать так, что у тебя DELETE будет создавать в базе объект, а GET - удалять данные. Только вряд ли тебя за это похвалят.
    Ответ написан
    5 комментариев
  • Не работает получение токена ВК, в чем может быть проблема?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Потому что токен не приходит в теле. Он находится в параметрах после перенаправления страницы авторизации
    Ответ написан
    2 комментария
  • Ссылка на музыку ве без привязки по IP?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Как ты декодируешь плейлист в музыку?
    Ответ написан
    1 комментарий
  • Можете помочь найти магию в php sdk ВКонтакте?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Обертка не следит за лимитами и ты просто попадаешь в нужный интервал из-за медленных запросов (подключений).

    Так что нет тут магии. В будущем сам следи за лимитами. (к слову о лимитах, для message.send они другие)
    Ответ написан
    Комментировать
  • Как избежать ошибки при запросе к БД, если там нет такой таблицы и т.д.?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Если есть вероятность, что таблицы нет, то перед запросом проверь существование таблицы

    SELECT * FROM information_schema.tables
    WHERE table_schema = 'db' AND table_name = 'mark'
    LIMIT 1;
    Ответ написан
    Комментировать
  • Как правильно оформить метод?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Ты их уже оформил, а теперь просто пиши код на чтение и запись в файл.
    Ответ написан
    Комментировать
  • Почему не удается получить токен?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Так может ты всё-таки код response и ошибки узнаешь и покажешь?
    Ответ написан
  • Зачем интерфейсы если есть трэйты?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Множественное наследование

    https://www.php.net/manual/ru/language.oop5.traits.php
    Ответ написан
    Комментировать
  • Зачем использовать такую конструкцию в PHP?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Используется он где угодно, если что
    Ответ написан
    Комментировать
  • Как Реализовать Мут пользователя?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Зависит от того, как ты вообще делаешь бота. Есть ли у тебя сущности юзеров беседы? Если есть, то добавляем просто очередную переменную с датой снятия мута и флаг (не обяз.). Если нет сущности, то просто создай словарь (ид юзера, время на мут). После каждого сообщения проверяем дату, если юзер есть в словаре. Способов сделать сотни.
    Ответ написан
    1 комментарий
  • Содержит ли сообщение ссылку?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Ссылка - есть текст и также, преобразуется во вложение "link". Если не удалять текст ссылки после преобразования, то ссылка будет в тексте. Во вложении также легко можно получить ссылку из вложения.
    5e480da35f2ff199523270.png
    Ответ написан
    6 комментариев
  • Реагирование бота на слова в предложениях?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Если по проще, то можно использовать банальный strpos, который вернёт тебе "не ноль", если в строке присутствует нужная тебе подстрока.
    $pos = strpos('бот реагировал на конкретные слова в предложениях', 'бот');
    if ($pos === false) {
        echo "Подстрока не найдена";
    } else {
        echo "Подстрока найдена";
    }
    Ответ написан
    6 комментариев
  • Как сгенерировать JSON для keyboard VK API?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    {
      "one_time": true,
      "inline": false,
      "buttons": [    <------- а где ещё массив?
        {
          "action": {
            "type": "text",
            "payload": "{\"button\":\"btn_1\"}",
            "label": "Привет"
          },
          "color": "secondary"
        }
      ]
    }


    Каждый элемент кнопки должен находится внутри массива - слоя, а каждый слой внутри массива buttons
    Т.е. buttons - это массив слоёв кнопок (уровней, линий), каждый из которых содержит массив кнопок.

    Итого:
    public function generateButtons(array $buttons, bool $inline = false) : string {
            $array = [
                'one_time' => !$inline,
                'inline' => $inline,
                'buttons' => [],
            ];
    
            foreach ($buttons as $item) {
                $array['buttons'][][] = [  <---- ещё один массив
                    'action' => [
                        'type' => $item['type'],
                        'payload' => json_encode($item['payload'], JSON_UNESCAPED_UNICODE),
                        'label' => $item['label'],
                    ],
                    'color' => $item['color'],
                ];
            }
    
            return json_encode($array, JSON_UNESCAPED_UNICODE);
        }

    Результат:
    {
        "one_time": true,
        "inline": false,
        "buttons": [
            [
                {
                    "action": {
                        "type": "text",
                        "payload": "{\"button\":\"btn_1\"}",
                        "label": "1233123"
                    },
                    "color": "secondary"
                }
            ]
        ]
    }
    Ответ написан
    1 комментарий
  • Что не так в этом классе?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Согласен с другими ответчиками, это не совсем ООП. Лишь один принцип ООП используется - класс и то как просто namespace.
    Вот примерно как ООП и VK API в Delphi:

    Класс - группировка для методов Auth

    TAuth = class(TVKEntity)
        /// <summary>
        /// Проверяет правильность введённого номера (возможность его использования для регистрации или авторизации).
        /// </summary>
        /// <param name="Phone">номер телефона регистрируемого пользователя</param>
        /// <param name="ClientId">идентификатор Вашего приложения</param>
        /// <param name="ClientSecret">секретный ключ приложения, доступный в разделе редактирования приложения</param>
        /// <param name="AuthByPhone">True — проверить правильность номера для авторизации,
        ///                           а не для регистрации нового аккаунта. По умолчанию: False.</param>
        function CheckPhone(Phone: string; ClientId, ClientSecret: string; AuthByPhone: Boolean = False): Boolean; overload;
        /// <summary>
        /// Проверяет правильность введённого номера (возможность его использования для регистрации или авторизации).
        /// С указанием текущих данных приложения ClientId и ClientSecret
        /// </summary>
        /// <param name="Phone">номер телефона регистрируемого пользователя</param>
        /// <param name="AuthByPhone">True — проверить правильность номера для авторизации,
        ///                           а не для регистрации нового аккаунта. По умолчанию: False.</param>
        function CheckPhone(Phone: string; AuthByPhone: Boolean = False): Boolean; overload;
        /// <summary>
        /// https://vk.com/dev/auth.restore
        /// </summary>
        function Restore(Phone, LastName: string): TResponse;
      end;


    Класс - асинхронный обработчик запросов

    TVKHandler = class
        const
          RequestLimit = 3; //Round(1000 / 3) + 10; //задержка между запросами 3 запроса в секунду + 10 мс страховка
      private
        FStartRequest: Cardinal;
        FRequests: Integer;
        FRESTClient: TRESTClient;
        FOnConfirm: TOnConfirm;
        FOnError: TOnVKError;
        FOnLog: TOnLog;
        FUseServiceKeyOnly: Boolean;
        FOwner: TObject;
        FOnCaptcha: TOnCaptcha;
        function DoConfirm(Answer: string): Boolean;
        procedure ProcError(Code: Integer; Text: string = ''); overload;
        procedure ProcError(E: Exception); overload;
        procedure ProcError(Msg: string); overload;
        procedure SetOnConfirm(const Value: TOnConfirm);
        procedure SetOnError(const Value: TOnVKError);
        procedure FLog(const Value: string);
        procedure SetOnLog(const Value: TOnLog);
        procedure SetUseServiceKeyOnly(const Value: Boolean);
        procedure SetOwner(const Value: TObject);
        procedure SetOnCaptcha(const Value: TOnCaptcha);
      public
        constructor Create(AOwner: TObject);
        destructor Destroy; override;
        function AskCaptcha(Sender: TObject; const CaptchaImg: string; var Answer: string): Boolean;
        function Execute(Request: string; Params: TParams): TResponse; overload;
        function Execute(Request: string; Param: TParam): TResponse; overload;
        function Execute(Request: string): TResponse; overload;
        function Execute(Request: TRESTRequest; FreeRequset: Boolean = False): TResponse; overload;
        property RESTClient: TRESTClient read FRESTClient;
        property OnConfirm: TOnConfirm read FOnConfirm write SetOnConfirm;
        property OnCaptcha: TOnCaptcha read FOnCaptcha write SetOnCaptcha;
        property OnError: TOnVKError read FOnError write SetOnError;
        property OnLog: TOnLog read FOnLog write SetOnLog;
        property UseServiceKeyOnly: Boolean read FUseServiceKeyOnly write SetUseServiceKeyOnly;
        property Owner: TObject read FOwner write SetOwner;
      end;


    Класс - LongPoll сервера, работающий в отдельном потоке

    TLongPollServer = class
       ...
        function Start: Boolean;
        procedure Stop;
        constructor Create; overload;
        constructor Create(AClient: TRESTClient; AMethod: string; AParams: TParams); overload;
        destructor Destroy; override;
        property OnError: TOnVKError read FOnError write SetOnError;
        property Interval: Integer read FInterval write SetInterval;
        property GroupID: string read FGroupID write SetGroupID;
        property OnUpdate: TOnLongPollServerUpdate read FOnUpdate write SetOnUpdate;
        property Client: TCustomRESTClient read GetClient write SetClient;
        property Method: string read FMethod write SetMethod;
        property Params: TParams read FParams write SetParams;
      end;


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

    TCustomVK = class(TComponent)
      private
        FOAuth2Authenticator: TOAuth2Authenticator;
        FOnLogin: TOnLogin;
        FPermissionsList: TPermissions;
        FGroupLongPollServers: TGroupLongPollServers;
        FAuthForm: TFormOAuth2;
        FAppID: string;
        FAppKey: string;
        FEndPoint: string;
        FHandler: TVKHandler;
        FBaseURL: string;
        FAPIVersion: string;
        FAccount: TAccount;
        FAuth: TAuth;
        FServiceKey: string;
        FUseServiceKeyOnly: Boolean;
        FIsLogin: Boolean;
        FOnError: TOnVKError;
        FOnLog: TOnLog;
        FOnErrorLogin: TOnVKError;
        FChangePasswordHash: string;
        FUsers: TUsers;
        FOnCaptcha: TOnCaptcha;
        FOnConfirm: TOnConfirm;
        FOnAuth: TOnAuth;
        function GetPermissions: string;
        procedure FAskCaptcha(Sender: TObject; const CaptchaImg: string; var Answer: string);
        procedure FAfterRedirect(const AURL: string; var DoCloseWebView: boolean);
        procedure FAuthError(const AURL: string; AStatusCode: Integer; var Cancel: WordBool);
        procedure FLog(Sender: TObject; const Value: string);
        procedure FVKError(Sender: TObject; Code: Integer; Text: string);
        procedure SetOnLogin(const Value: TOnLogin);
        procedure SetPermissionsList(const Value: TPermissions);
        procedure DoLogin;
        procedure SetAppID(const Value: string);
        procedure SetAppKey(const Value: string);
        procedure SetEndPoint(const Value: string);
        procedure SetPermissions(const Value: string);
        procedure SetHandler(const Value: TVKHandler);
        procedure SetBaseURL(const Value: string);
        procedure SetAPIVersion(const Value: string);
        procedure SetServiceKey(const Value: string);
        procedure SetUseServiceKeyOnly(const Value: Boolean);
        procedure SetOnError(const Value: TOnVKError);
        procedure SetOnLog(const Value: TOnLog);
        procedure SetOnErrorLogin(const Value: TOnVKError);
        procedure SetOnCaptcha(const Value: TOnCaptcha);
        procedure SetOnConfirm(const Value: TOnConfirm);
        procedure SetOnAuth(const Value: TOnAuth);
        procedure DoAuth(const AURL: string);
      public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
        procedure DoLog(Sender: TObject; Text: string);
        procedure Login(AParentWindow: TWinControl = nil);
        procedure CallMethod(MethodName: string; Params: TParams; Callback: TCallMethodCallback = nil);
        procedure GroupLongPollServerStart(GroupID: string);
        procedure GroupLongPollServerStop(GroupID: string);
        /// <summary>
        /// Универсальный метод, который позволяет запускать последовательность других методов, сохраняя и фильтруя промежуточные результаты.
        /// https://vk.com/dev/execute
        /// </summary>
        /// <param name="Code">код алгоритма в VKScript - формате, похожем на JavaSсript или ActionScript (предполагается совместимость с ECMAScript). Алгоритм должен завершаться командой return %выражение%. Операторы должны быть разделены точкой с запятой. </param>
        function Execute(Code: string): TResponse;
        property PermissionsList: TPermissions read FPermissionsList write SetPermissionsList;
        //Группы методов
        property Account: TAccount read FAccount;
        property Auth: TAuth read FAuth;
        property Users: TUsers read FUsers;
        //
        property AppID: string read FAppID write SetAppID;
        property AppKey: string read FAppKey write SetAppKey;
        property EndPoint: string read FEndPoint write SetEndPoint;
        property Permissions: string read GetPermissions write SetPermissions;
        property Handler: TVKHandler read FHandler write SetHandler;
        property APIVersion: string read FAPIVersion write SetAPIVersion;
        property BaseURL: string read FBaseURL write SetBaseURL;
        property ServiceKey: string read FServiceKey write SetServiceKey;
        property UseServiceKeyOnly: Boolean read FUseServiceKeyOnly write SetUseServiceKeyOnly;
        property IsLogin: Boolean read FIsLogin;
        property ChangePasswordHash: string read FChangePasswordHash;
        //
        property OnLogin: TOnLogin read FOnLogin write SetOnLogin;
        property OnError: TOnVKError read FOnError write SetOnError;
        property OnErrorLogin: TOnVKError read FOnErrorLogin write SetOnErrorLogin;
        property OnLog: TOnLog read FOnLog write SetOnLog;
        property OnCaptcha: TOnCaptcha read FOnCaptcha write SetOnCaptcha;
        property OnConfirm: TOnConfirm read FOnConfirm write SetOnConfirm;
        property OnAuth: TOnAuth read FOnAuth write SetOnAuth;
      end;


    И конечно, все представления и структуры в виде классов

    5e1c425e0b2f5671276122.png

    Ну и вот работа такого класса в designtime

    5e1c404cea6dd998958891.png

    И код равный твоему

    5e1c446dea3d6273622206.png

    Конечно не образец идеального кода... Но что есть
    Ответ написан
    Комментировать