Как исправить ошибку json в получении ответа от пользователя в телеграм бот?

Всем доброго дня!
Ввозникла проблема, не могу ее решить. Бот работает, id записывает в базу, сообщения выводит, но вот когда дело доходит до вопросов, задает первый вопрос и все, ответ не сохраняется в базе, что не так написал, подскажите.
Ошибка
Caught exception: Syntax error Trace: #0 /vendor/telegram-bot/api/src/Client.php(134): TelegramBot\Api\BotApi::jsonValidate() #1 /vrm_system_bot.php(132): TelegramBot\Api\Client->run() #2 {main}
<?php
header('Content-Type: text/html; charset=utf-8');
// подключаем API
require_once("vendor/autoload.php");

// Настройки базы данных
$dbHost = 'localhost';
$dbUsername = '********';
$dbPassword = '******';
$dbName = '*****';

// создаем переменную бота
$token = "**********";
$bot = new \TelegramBot\Api\Client($token);

// подключение к базе данных
$mysqli = new mysqli($dbHost, $dbUsername, $dbPassword, $dbName);

// проверка подключения
if ($mysqli->connect_error) {
    die('Ошибка подключения к базе данных: ' . $mysqli->connect_error);
}

// если бот еще не зарегистрирован - регистрируем
if (!file_exists("registered.trigger")) {
    /**
     * файл registered.trigger будет создаваться после регистрации бота.
     * если этого файла нет, значит, бот не зарегистрирован
     */

    // URL текущей страницы
    $page_url = "https://" . $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
    $result = $bot->setWebhook($page_url);
    if ($result) {
        file_put_contents("registered.trigger", time()); // создаем файл, чтобы прекратить повторные регистрации
    }
}

// обязательное. Запуск бота
$bot->command('start', function ($message) use ($bot, $mysqli) {
    $chatId = $message->getChat()->getId();

    // Выводим все команды
    $commands = "Доступные команды:\n";
    $commands .= "/start - начало работы\n";
    $commands .= "/stop - конец работы\n";
    $commands .= "/help - помощь\n";
    $commands .= "/time - текущее время\n";
    $commands .= "/questions - задать вопросы и сохранить ответы в базе данных\n";
    $bot->sendMessage($chatId, $commands);

    // Проверяем, есть ли пользователь с таким ID чата в базе
    $checkQuery = "SELECT * FROM users WHERE telegram_id='$chatId'";
    $result = $mysqli->query($checkQuery);

    if (!$result) {
        // Обработка ошибки при выполнении запроса к базе данных
        $bot->sendMessage($chatId, 'Ошибка при проверке пользователя в базе данных. Попробуйте позже.');
        return;
    }

    if ($result->num_rows > 0) {
        // Пользователь уже зарегистрирован
        $bot->sendMessage($chatId, 'Вы уже зарегистрированы в базе данных. Спасибо!');
    } else {
        // Сохраняем ID чата в базу данных
        $query = "INSERT INTO users (telegram_id) VALUES ('$chatId')";
        $result = $mysqli->query($query);

        if (!$result) {
            // Обработка ошибки при выполнении запроса к базе данных
            $bot->sendMessage($chatId, 'Ошибка при регистрации пользователя в базе данных. Попробуйте позже.');
            return;
        }

        $answer = 'Добро пожаловать! ID вашего чата: ' . $chatId;
        $bot->sendMessage($chatId, $answer);
    }
});

// команда вывода помощи
$bot->command('help', function ($message) use ($bot) {
    $answer = 'Команды:
/help - помощь
/stop - стоп бот
/time - текущее время
/questions - задать вопросы и сохранить ответы в базе данных';
    $bot->sendMessage($message->getChat()->getId(), $answer);
});

// команда вывода текущего времени
$bot->command('time', function ($message) use ($bot) {
    $currentTime = date('H:i:s');
    $bot->sendMessage($message->getChat()->getId(), 'Текущее время: ' . $currentTime);
});

// команда остановки бота
$bot->command('stop', function ($message) use ($bot) {
    $bot->sendMessage($message->getChat()->getId(), 'Бот остановлен.');
    exit; // Завершаем выполнение скрипта
});

// команда задания вопросов
$bot->command('questions', function ($message) use ($bot, $mysqli) {
    $chatId = $message->getChat()->getId();

    // Вопрос 1
    $bot->sendMessage($chatId, 'Как вас зовут?');
    $firstName = waitUserResponse($bot, $mysqli, $chatId);
    saveAnswerToDatabase($mysqli, $chatId, 'first_name', $firstName);

    // Вопрос 2
    $bot->sendMessage($chatId, 'Какая у вас фамилия?');
    $lastName = waitUserResponse($bot, $mysqli, $chatId);
    saveAnswerToDatabase($mysqli, $chatId, 'last_name', $lastName);

    // Вопрос 3
    $bot->sendMessage($chatId, 'Какой ваш username ?');
    $crmUsername = waitUserResponse($bot, $mysqli, $chatId);
    saveAnswerToDatabase($mysqli, $chatId, 'username', $crmUsername);

    $bot->sendMessage($chatId, 'Спасибо за ответы! Ваши данные сохранены.');
});

// каждые 15 минут отправляем сообщение с текущим временем
$bot->command('time', function ($message) use ($bot) {
    $currentTime = date('H:i:s');
    $bot->sendMessage($message->getChat()->getId(), 'Текущее время: ' . $currentTime);
});

try {
    $bot->run();
} catch (\Exception $e) {
    echo 'Caught exception: ', $e->getMessage(), "\n";
    echo 'Trace: ', $e->getTraceAsString(), "\n";
}

// закрываем соединение с базой данных
$mysqli->close();

function waitUserResponse($bot, $mysqli, $chatId)
{
    // Ожидаем ответ от пользователя
    $updates = $bot->getUpdates();

    foreach ($updates as $update) {
        $message = $update->getMessage();

        // Проверяем, что сообщение принадлежит нужному чату
        if ($message->getChat()->getId() == $chatId) {
            // Возвращаем текст ответа пользователя
            $answer = $message->getText();

            // Сохраняем ответ в базе данных
            saveAnswerToDatabase($mysqli, $chatId, 'user_response', $answer);

            return $answer;
        }
    }

    // Если нет новых сообщений из нужного чата, ждем дальше
    return waitUserResponse($bot, $mysqli, $chatId);
}

function saveAnswerToDatabase($mysqli, $chatId, $columnName, $answer)
{
    // Экранируем данные перед вставкой в запрос для предотвращения SQL-инъекций
    $columnName = $mysqli->real_escape_string($columnName);
    $answer = $mysqli->real_escape_string($answer);

    // Подготавливаем запрос с использованием параметров
    $query = "UPDATE users SET $columnName='$answer' WHERE telegram_id=?";
    $statement = $mysqli->prepare($query);

    // Подставляем параметры и выполняем запрос
    $statement->bind_param("s", $chatId);
    $result = $statement->execute();

    // Проверяем успешность выполнения запроса
    if (!$result) {
        // Обработка ошибки при выполнении запроса к базе данных
        error_log('Error saving answer to database: ' . $statement->error);
    }

    // Закрываем statement
    $statement->close();
}
?>
  • Вопрос задан
  • 169 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

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