Главная | Комментарии | О проекте
Чтение RSS
Суперсайт
Главная Контакты Карта сайта Добавить в избранное
  • Кто OnLine

    Всего на сайте: 8
    Гостей: 3
    Пользователи: - отсутствуют
    Роботы: Yandex Bot, Mail Ru, Mail Ru, crawl Bot, Mail Ru

    Опрос пользователей

    Для какого мода Вы пишите плагины?

    • Популярное

    Рекомендуем

    • AMX Mod X
    • up.org.ua

    Наши друзья


  • Автор: Admin Дата: 29-11-2011, 02:58 Просмотров: 5320

    SQL_ReadResult Часть 1. Функция получает результаты SQL запроса

    И так, если вы изучили предыдущие материалы данного раздела, то можно приступить непосредственно к получению данных из базы данных.
    Если вам не знакомы какие либо функции в ниже следующем примере, то обязательно изучите их, иначе у вас может получиться каша в голове.

    Инфо из 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

    То есть первый столбец это число, остальные 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.
    Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
    Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
    gavrilyuc

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Интересно как выполняются Скалярные запросы ?
    к примеру : "select count(*) from table;"

    возможно так,
    new id = SQL_ReadResult(query, 0);
    субд базы скалярные запросы он будет возращять как и обычный select *
    но с 1 колонкой и 1 столкибом.

    Возможно я не прав.

    Информация

    Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Наверх

Реклама