Всем доброго дня!
Ввозникла проблема, не могу ее решить. Бот работает, 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();
}
?>