@k1nster

Как записать данные в переменную PHP и вызывать их в любом участке кода?

Здравствуйте. Есть код, где я в одном из блоков if записываю данные в переменную. Проблема в том, что когда я пытаюсь вызвать его в другом блоке elseif - она выводиться пустая, т.к значения либо попросту не записывается, либо просто перезаписывается.

Весь код целиком:
<?php

# Принимаем запрос
$data = json_decode(file_get_contents('php://input'), TRUE);

# Обрабатываем ручной ввод или нажатие на кнопку
$data = $data['callback_query'] ? $data['callback_query'] : $data['message'];

# Важные константы
define('TOKEN', '6011282829:AAHQgKSQkK5Jm6_O8Z03OfDHEHzSyOpME7A'); // Замените на свой токен

# Записываем сообщение пользователя
$message = mb_strtolower(($data['text'] ? $data['text'] : $data['data']), 'utf-8');

$channelUsername = '';
$channelLink = '';

# Функция для проверки является ли бот администратором канала
function isBotAdmin($chatId, $botToken) {
    $url = 'https://api.telegram.org/bot' . $botToken . '/getChatAdministrators?chat_id=' . urlencode($chatId);
    $response = file_get_contents($url);
    $responseData = json_decode($response, true);

    // Проверяем, что ответ содержит корректные данные и бот является администратором
    return isset($responseData['ok']) && $responseData['ok'] && isset($responseData['result']);
}

$parsedLink = null;

# Шаг 1: Пользователь нажимает кнопку "/start"
if ($message === '/start') {
    $method = 'sendMessage';
    $send_data = [
        'text' => "Привет! Я бот для анализа активности подписчиков в каналах, чатах и группах.",
        'reply_markup' => [
            'keyboard' => [
                [
                    ['text' => ' Начать работу'],
                ]
            ],
            'resize_keyboard' => true,
            'one_time_keyboard' => true
        ]
    ];
} elseif ($message === ' начать работу') {
    # Шаг 2: Пользователь вводит ссылку
    $method = 'sendMessage';
    $send_data = [
        'text' => ' Шаг 1: Предоставьте ссылку на анализируемый канал/чат/группу.'
    ];
} elseif (strpos($message, 'http') === 0) {
    # Шаг 3: Пользователь вводит ссылку
    $parsedLink = parse_url($message);
    if ($parsedLink && isset($parsedLink['path'])) {
        // удаляем https:// из ссылки, и добавляем к ней @. На выходе из ссылки https://t.me/*название канала*, получаем: *@название канала*
        $channelUsername = '@' . ltrim($parsedLink['path'], '/');
        $channelLink = 'https://api.telegram.org/bot' . TOKEN . '/getChat?chat_id=' . urlencode($channelUsername);

        $channelInfo = sendTelegram('getChat', ['chat_id' => $channelUsername]);
        $channelTitle = $channelInfo['result']['title'];

        // Получаем количество подписчиков
        $subscriberCount = $channelInfo['result']['members_count'];

        // Получаем информацию о администраторах
        $adminsInfo = sendTelegram('getChatAdministrators', ['chat_id' => $channelUsername]);
        $adminCount = count($adminsInfo['result']);
        $botCount = 0;

        $chatInfo = sendTelegram('getChat', ['chat_id' => $channelUsername]);
        $chatId = $chatInfo['result']['id'];

        foreach ($adminsInfo['result'] as $admin) {
            if ($admin['user']['is_bot']) {
                $botCount++;
            }
        }

        if (isBotAdmin($channelUsername, TOKEN)) {                            
            $method = 'sendMessage';
            $send_data = [
                'text' => ' Шаг 2: Предоставьте число неактивных подписчиков',
                'reply_markup' => [
                    'keyboard' => [
                        [
                            ['text' => ' Удалить'],
                        ]
                    ],
                    'resize_keyboard' => true,
                    'one_time_keyboard' => true
                ]
            ];
        } else {
            $method = 'sendMessage';
            $send_data = [
                'text' => 'В данном канале бот не является администратором. Пригласите и выдайте ему все права администратора для дальнейшей работы!'
            ];
        }
    } else {
        $method = 'sendMessage';
        $send_data = [
            'text' => 'Введите корректную ссылку!'
        ];
    }
} elseif(is_numeric($message)){
    $inactiveSubscribers = intval($message);
    // Получаем информацию о канале

    $method = 'sendMessage';
    $send_data = [
        'text' => "Вы ввели число: $inactiveSubscribers. Шаг 4 завершен." . $parsedLink
    ];

} elseif($message === ' Удалить') {

    $method = 'sendMessage';
    $send_data = [
        'text' => 'Вау!',
                
    ];

} else {
    // Обработка ситуации, когда пользователь вводит сообщение без нажатия кнопки "/start" или вводит некорректные данные
    $method = 'sendMessage';
    $send_data = [
        'chat_id' => $data['chat']['id'],
        'text' => 'Для начала работы нажмите кнопку " Начать работу" и следуйте инструкциям.'
    ];
}


# Добавляем данные пользователя
$send_data['chat_id'] = $data['chat']['id'];

$res = sendTelegram($method, $send_data);

function sendTelegram($method, $data, $headers = []) {
    $curl = curl_init();
    curl_setopt_array($curl, [
        CURLOPT_POST => 1,
        CURLOPT_HEADER => 0,
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_URL => 'https://api.telegram.org/bot' . TOKEN . '/' . $method,
        CURLOPT_POSTFIELDS => json_encode($data),
        CURLOPT_HTTPHEADER => array_merge(array("Content-Type: application/json"), $headers)
    ]);

    $result = curl_exec($curl);
    curl_close($curl);
    return (json_decode($result, 1) ? json_decode($result, 1) : $result);
}


Код проблемы:
$channelUsername = '';
$channelLink = '';

elseif (strpos($message, 'http') === 0) {
    # Шаг 3: Пользователь вводит ссылку
    $parsedLink = parse_url($message);
    if ($parsedLink && isset($parsedLink['path'])) {
        // удаляем https:// из ссылки, и добавляем к ней @. На выходе из ссылки https://t.me/*название канала*, получаем: *@название канала*
        $channelUsername = '@' . ltrim($parsedLink['path'], '/');
        $channelLink = 'https://api.telegram.org/bot' . TOKEN . '/getChat?chat_id=' . urlencode($channelUsername);

        $channelInfo = sendTelegram('getChat', ['chat_id' => $channelUsername]);
        $channelTitle = $channelInfo['result']['title'];

        // Получаем количество подписчиков
        $subscriberCount = $channelInfo['result']['members_count'];

        // Получаем информацию о администраторах
        $adminsInfo = sendTelegram('getChatAdministrators', ['chat_id' => $channelUsername]);
        $adminCount = count($adminsInfo['result']);
        $botCount = 0;

        $chatInfo = sendTelegram('getChat', ['chat_id' => $channelUsername]);
        $chatId = $chatInfo['result']['id'];

        foreach ($adminsInfo['result'] as $admin) {
            if ($admin['user']['is_bot']) {
                $botCount++;
            }
        }

        if (isBotAdmin($channelUsername, TOKEN)) {                            
            $method = 'sendMessage';
            $send_data = [
                'text' => ' Шаг 2: Предоставьте число неактивных подписчиков',
                'reply_markup' => [
                    'keyboard' => [
                        [
                            ['text' => ' Удалить'],
                        ]
                    ],
                    'resize_keyboard' => true,
                    'one_time_keyboard' => true
                ]
            ];
        }

elseif(is_numeric($message)){
    $inactiveSubscribers = intval($message);
    // Получаем информацию о канале

    $method = 'sendMessage';
    $send_data = [
        'text' => $channelUsername;
    ];

}


В данном примере, в чат телеграмм бота выводиться просто пустая строка. Как мне записать туда данные и вызывать их в любом участке кода?
  • Вопрос задан
  • 199 просмотров
Решения вопроса 2
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Как записать данные в переменную PHP и вызывать их в любом участке кода?

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

в одном из блоков if записываю данные в переменную. Проблема в том, что когда я пытаюсь вызвать его в другом блоке elseif - она выводиться пустая


А вот этот вопрос говорит о том, что вы, видимо, даже не понимаете, как работают конструкции if и else. Что сам принцип этих конструкций состоит в том, что если выполнилась одна ветка, то по определению другие выполняться не будут.

Поскольку вы не удосужились написать, какая именно переменная вызывает проблему, я предполагаю, что речь о $channelUsername. Учитывая, что она передается по ссылке, то дело не в том, что она "перезаписывается". А в том, что её попросту неоткуда взять, если в $message лежит число
Ответ написан
Комментировать
@rPman
С высокой вероятностью у тебя проблема в непонимании различий между локальными и глобальными переменными.

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

p.s. есть разные способы использовать переменные глобально, в т.ч. экзотические
* если переменная определена глобально вне функций, то чтобы получить к ней доступ внутри функции, ее нужно добавить в оператор global внутри этой функции или предопределенный массив $GLOBALS (не рекомендую)
* можно определить переменную как статическую внутри класса, и получать к ней доступ везде по имени класса, типа ClassName::$variable
* есть странный способ, хранить переменную (или просто доступ к ней) через вызов глобальной функции (или статичного метода по аналогии выше), само собой на запись примитивов потребуется заворачивать переменные в структуры. Как там внутри доступ организуется, отдельный разговор, как вариант очень смешно определить переменную внутри этой же функции как static
function db()
{
  static $db=false;
  if($db===false) $db=...;
  return $db;
}
...
db()->execute(...);
// напоминаю что пример вырожденный, делать так именно для бд не рекомендую, хотя когда то таким пользовался
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы