Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

Работа с SQL

Статус пользователя blvck
сообщение 1.5.2016, 14:10
Сообщение #1


Стаж: 10 лет
Город: Russia, Kemerovo

Сообщений: 43
Благодарностей: 56
Полезность: 702

Доброго времени суток. Начал изучать SQL в amxx, но столкнулся с рядом проблем.
1. Смог найти документацию, но там не описано, что за что отвечает.
2. Написал код, но он не работает.
Плагин легкий, вроде, поэтому прошу вас написать код и детально его объяснить, чтобы я понял. Да, плохо, когда пишут код за тебя, но на готовых примерах лучше понимается.
Суть плагина: у меня есть таблица "steam" из которой нужно взять значение "steam_id" и при подключении игрока к серверу проверить на наличие в этой таблице.
Если он там есть, то вывести server_print("Okey...") , а если не нашел, то вывести server_print("Error...")
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя Dukkhaz0r
сообщение 1.5.2016, 14:59
Сообщение #2


Стаж: 12 лет

Сообщений: 343
Благодарностей: 294
Полезность: 812

Пример кода.
Подключение к БД не писал, думаю сам сможешь. smile.gif

Код
Код:
#include amxmodx
#include sqlx

new Handle:ghSQL_Tuple

public client_putinserver(id) {
new szAuthId[25], szQuery[256], szId[1]

szId[0] = id

get_user_authid( id, szAuthId, charsmax(szAuthId) )

//Получаем строку, где steam_id = PLAYER_STEAM_ID
formatex( szQuery, charsmax(szQuery), "SELECT * FROM `steam` WHERE `steam_id` = '%s'", szAuthId )

//Отправляем запрос
SQL_ThreadQuery( ghSQL_Tuple, "SQL_Handler", szQuery, szId, sizeof szId )
}

public SQL_Handler(iState, Handle:hQuery, szError[], iError, szId[], iId) {

//Если вдруг ошибка, выводим ее
switch(iState) {
case TQUERY_CONNECT_FAILED: return server_print( "[DB Error] Не могу подключиться к БД. Ошибка: %s", szError )
case TQUERY_QUERY_FAILED: return server_print( "[DB Error] Неправильный запрос. Ошибка: %s", szError )
}

//id игрока
new iPlayerId = szId[0]

// Если результат найден
if( SQL_NumResults(hQuery) ) {
server_print("Игрок с таким SteamId есть в БД.");
}
else {
server_print( "Игрока с таким SteamId нет в БД.");
}

return PLUGIN_CONTINUE
}


Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя blvck
сообщение 1.5.2016, 15:10
Сообщение #3


Стаж: 10 лет
Город: Russia, Kemerovo

Сообщений: 43
Благодарностей: 56
Полезность: 702

Dukkhaz0r, огромное спасибо, сейчас попробую на деле. Отдельное спасибо за комментарии к коду.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя blvck
сообщение 1.5.2016, 16:57
Сообщение #4


Стаж: 10 лет
Город: Russia, Kemerovo

Сообщений: 43
Благодарностей: 56
Полезность: 702

Dukkhaz0r, заметил такую проблему, не передается id игрока. Хочу, чтобы кикнуло игрока, которого нет в базе.
В проверке делаю так:
new userid = get_user_userid(szId[0])
Но при выводе userid всегда 0
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Dukkhaz0r
сообщение 1.5.2016, 17:43
Сообщение #5


Стаж: 12 лет

Сообщений: 343
Благодарностей: 294
Полезность: 812

Набросал готовый вариант и проверил на тестовом сервере.

HOSTNAME, USERNAME, PASSWORD, DBNAME - данные от MySQL. Думаю разберетесь. smile.gif

SQL Запрос на создание таблицы
Код:
CREATE TABLE IF NOT EXISTS `steam` (
`id` INT NOT NULL AUTO_INCREMENT,

`steam_id` VARCHAR(32) NOT NULL,

PRIMARY KEY(`id`)
)


Готовый вариант с киком игрока
Код:
#include amxmodx
#include sqlx

#define HOSTNAME ""
#define USERNAME ""
#define PASSWORD ""
#define DBNAME ""

new Handle:ghSQL_Tuple

public plugin_cfg() {
new Handle:ghSQL_Connect, iError, szError[256]

//коннект
ghSQL_Tuple = SQL_MakeDbTuple( HOSTNAME, USERNAME, PASSWORD, DBNAME )
ghSQL_Connect = SQL_Connect( ghSQL_Tuple, iError, szError, charsmax(szError) )

//если ошибка, прекращаем работу
if(ghSQL_Connect == Empty_Handle)
set_fail_state(szError)

SQL_FreeHandle(ghSQL_Connect)
}

public client_putinserver(id) {
new szAuthId[25], szQuery[256], szId[1]

szId[0] = id

get_user_authid( id, szAuthId, charsmax(szAuthId) )

//Получаем строку, где steam_id = PLAYER_STEAM_ID
formatex( szQuery, charsmax(szQuery), "SELECT * FROM `steam` WHERE `steam_id` = '%s'", szAuthId )

//Отправляем запрос
SQL_ThreadQuery( ghSQL_Tuple, "SQL_Handler", szQuery, szId, sizeof szId )
}

public SQL_Handler(iState, Handle:hQuery, szError[], iError, szId[], iId) {

//Если вдруг ошибка, выводим ее
switch(iState) {
case TQUERY_CONNECT_FAILED: return server_print( "[DB Error] Не могу подключиться к БД. Ошибка: %s", szError )
case TQUERY_QUERY_FAILED: return server_print( "[DB Error] Неправильный запрос. Ошибка: %s", szError )
}

//id игрока
new iPlayerId = szId[0]

// Если результат найден
if( SQL_NumResults(hQuery) ) {
server_print( "Игрок с таким SteamId есть в БД." )
}
else {
server_print( "Игрока с таким SteamId нет в БД." )
server_cmd( "kick #%d ^"Вас нет в БД, вход запрещен^"", get_user_userid(iPlayerId) )
}

return PLUGIN_CONTINUE
}


Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   + Цитировать сообщение
Статус пользователя blvck
сообщение 1.5.2016, 18:09
Сообщение #6


Стаж: 10 лет
Город: Russia, Kemerovo

Сообщений: 43
Благодарностей: 56
Полезность: 702

Dukkhaz0r, все работает, благодарю.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: