Forums / National / Russian / Вопросы и пожелания к движку

Для юзеров Seditio и новичков

Cotonti Aik
#45832 2023-01-06 16:19
#45653 prostogorod:

Привет всем! Прошу помощи! Пишу простой Telegram Bot. Все работает пока дело не доходит до добавления 

$chat_id и $botToken

в базу данных. Первое сообщение отправляется, потом идет запрос добавления в базу данных, в котором ошибка и второе сообщение не отправляется. Если запрос закомментировать, то все два сообщения отправляются. Что не так с запросом в базу данных?

        if (isset($chat_id) > 0) {
			
		    sendTelegram(
			    'sendMessage', 
			    array(
				     'chat_id' => $chat_id,
				     'text' => 'Приветствую!!! Первое сообщение - Твой Chat ID - '. $chat_id,
			    )
		    );			
			
			
            global $db, $sys, $cfg;
            cot::$db->insert("cot_bot", array(
			    'bot_chatid' => $chat_id,
				'bot_token' => $botToken
		    ));	

			
			//usleep(5000000); // ждать 5 секунд
			
		    sendTelegram(
			    'sendMessage', 
			    array(
				     'chat_id' => $chat_id,
					 'parse_mode' => 'HTML',
				     'text' => 'Приветствую!!! Второе сообщение Твой Token - '. $botToken .' Твой Chat ID - '. $chat_id,
			    )
		    );			
			
        }

 

Ошибку можно увидеть, выведя ее с помощью функции error_get_last(). Обратите внимание, что эта функция работает только в том случае, если в конфигурации сервера включена опция track_errors.

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

try { cot::$db->insert("cot_bot", array( 'bot_chatid' => $chat_id, 'bot_token' => $botToken )); } catch (Exception $e) { // Обработка исключения echo "Произошла ошибка: " . $e->getMessage(); }

Это позволит вам лучше понять, что именно произошло не так и какие данные были переданы в запрос.

Также стоит проверить соединение с базой данных и права доступа пользователя, который используется для подключения.

Небольшие улучшения, которые можно сделать в вашем коде:

  1. Не нужно использовать isset() для проверки на null. Достаточно просто проверить, что $chat_id равен null:

if ($chat_id !== null) {

  1. Если у вас несколько запросов к базе данных, лучше всего использовать транзакции, чтобы гарантировать, что все запросы будут выполнены целиком или ни один из них не будет выполнен. Чтобы начать транзакцию, используйте метод beginTransaction() у объекта cot::$db:

cot::$db->beginTransaction();

Чтобы завершить транзакцию, используйте метод commit():

cot::$db->commit();

Если в процессе выполнения транзакции возникла ошибка, то можно откатить все изменения, выполненные в рамках транзакции, с помощью метода rollBack():

cot::$db->rollBack(); 

Пример использования транзакций в вашем коде:

try {
cot::$db->beginTransaction();
cot::$db->insert("cot_bot", array(
'bot_chatid' => $chat_id,
'bot_token' => $botToken
));
cot::$db->commit();
} catch (Exception $e) {
cot::$db->rollBack();
// Обработка исключения
echo "Произошла ошибка: " . $e->getMessage();
}

Также рекомендуется всегда проверять возвращаемое значение функции insert(). Если она вернет false, то это может означать, что запрос не был выполнен успешно.

Например:

if (!cot::$db->insert("cot_bot", array(
'bot_chatid' => $chat_id,
'bot_token' => $botToken
))) {
// Обработка ошибки
echo "Произошла ошибка при выполнении запроса";
}

 

https://t.me/cotontiaik - Телега о Cotonti
This post was edited by Cotonti Aik (2023-01-06 16:30, 1 year ago)