Если вам не знакомы какие либо функции в ниже следующем примере, то обязательно изучите их, иначе у вас может получиться каша в голове.
Инфо из SQLx:
/**
* Retrieves the current result.
* A successful query starts at the first result,
* so you should not call SQL_NextRow() first.
* Passing no extra params - return int
* Passing one extra param - return float in 1st extra arg
* Passing two extra params - return string in 1st arg, max length in 2nd
* Example:
* new num = SQL_ReadResult(query, 0)
* new Float:num2
* new str[32]
* SQL_ReadResult(query, 1, num2)
* SQL_ReadResult(query, 2, str, 31)
*/
native SQL_ReadResult(Handle:query, column, {Float,_}:...);
Синтаксис:
SQL_ReadResult ( Handle:query, column, {Float,_}:... )
- Handle:query - Переменная от запроса ( не знаю как правильно описать)
- column - Номер колонки из выборки
- {Float,_}:... - массив для данных
Тип функции:
Native
Пример:
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <amxmisc>
#include <sqlx>
#define PLUGIN "[SQLx.inc] SQL_ReadResult"
#define VERSION "1.0"
#define AUTHOR "Admin"
new Handle:SQL_Tuple
new Handle:SQL_Connection
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
register_cvar("SQLx_host","127.0.0.1")
register_cvar("SQLx_db","amxxmodx")
register_cvar("SQLx_user","admin")
register_cvar("SQLx_password","pass")
register_concmd("select_sql_result","sqlx_select_result")
}
public plugin_cfg(){
new host[33],dbase[33],user[33],pass[33]
get_cvar_string("SQLx_host",host,30)
get_cvar_string("SQLx_db",dbase,30)
get_cvar_string("SQLx_user",user,30)
get_cvar_string("SQLx_password",pass,30)
SQL_Tuple = SQL_MakeDbTuple(host,user,pass,dbase) // Создание картежа данных для соединения с БД
new err, error[256]
SQL_Connection = SQL_Connect(SQL_Tuple, err, error, charsmax(error)) // Соединение с БД
if(SQL_Connection != Empty_Handle)
{
log_amx("[SQLx connect ok]") //Если соединение установлено
}else{
log_amx("[SQLX sql error] %s ",error) //Если нет и выводим причину(ошибку)
pause("a")
}
}
public sqlx_select(id){
//Подготовка Запроса
new Handle:query = SQL_PrepareQuery(SQL_Connection,"SELECT * FROM `dle_files` WHERE id = '1'")
// Выполняем запрос к базе даанных
SQL_Execute (query)
new id = SQL_ReadResult(query, 0)
new str[32]
SQL_ReadResult(query, 1, str, 31)
new name[32]
SQL_ReadResult(query, 2, name, 31)
server_print("SQL Select Result: %d %s %s",id,str,name)
}
public plugin_end(){
SQL_FreeHandle(SQL_Connection)
}
Описание:
Будем считать что вы изучили все необходимые функции для коннекта к базе данных отправки запроса, рассмотрим функцию в которой происходит запрос к базе данных и получение результата.
public sqlx_select(id){
//Подготовка Запроса
new Handle:query = SQL_PrepareQuery(SQL_Connection,"SELECT * FROM `table` WHERE id = '1'")
// Выполняем запрос к базе даанных
SQL_Execute (query)
//Получение данных
new id = SQL_ReadResult(query, 0)
new steamid[32]
SQL_ReadResult(query, 1, steamid, 31)
new name[32]
SQL_ReadResult(query, 2, name, 31)
server_print("SQL Select Result: %d %s %s",id,steamid,name)
}
И так, для того что бы получить какие то результаты, необходим запрос, который получит какие то данные из таблицы.
Для удобства вы можете создать какую то свою таблицу с данными или использовать любую существующую таблицу.
Главное сформируйте запрос, у меня он выглядел так:
SELECT * FROM `table` WHERE id = '1'
Звучит он так:
Выбираем ВСЕ Из таблицы `table` ГДЕ в колонка id = '1'
То есть будет выбрана одна строка из таблицы где id равно единице.
Составить вопрос проще будет phpmyadmin, или в другом удобном интерфейсе для работы с базой данных.
И так, составили? Идем дальше.
При получении результата, необходимо точно знать какой тип данных будет получен строка,число или дробное число.
Так как запись полученных данных происходит или в массив или в переменную.
Вот какая таблица была при тестировании:
id Steamid name
1 Steam_ Admin
1 Steam_ Admin
То есть первый столбец это число, остальные 2 это строки.
Для получения числа можно использовать такую запись:
new id = SQL_ReadResult(query, 0)
Объявление массива и сразу же туда получение результата из колонки номер 0.
Обратите внимание, что нумерация колонок идет с 0, а не с 1.
Остальные данные состоят из строк, их необходимо получать так:
new steamid[32]
SQL_ReadResult(query, 1, steamid, 31)
Сначала объявляется новый массив, и потом в функции указывать номер колонки, в какой массив записывать данные и максимальную длину записи.
Если вы все сделает правильно, то в консоли после выполнения команды select_sql_result,
вы получите результат, у меня он был таков:
SQL Select Result: 1 Steam Admin
Будь те внимательными с Типами данных и номерами колонок.
Во второй части данной статьи, я расскажу как получать не 1 строку, а 2 и более строк из таблицы, например для формирования топ15.
к примеру : "select count(*) from table;"
возможно так,
new id = SQL_ReadResult(query, 0);
субд базы скалярные запросы он будет возращять как и обычный select *
но с 1 колонкой и 1 столкибом.
Возможно я не прав.