Показано с 1 по 10 из 20

Опции темы
Поиск по теме
Отображение
  • Линейный вид
  • Комбинированный вид
  • Древовидный вид

Основные запросы mysql

Всем добры день и сегодня я вам покажу пожалуй основные запросы в mysql и объясню, что они делают.

1 на нашем подиуме покажется функция обновления статистики для игрока:

Можно и по другому, но для меня легче таким образом.

2 на нашем подиуме — функция создания таблицы:

Например мы создадим таблицу, где будет хранится только ник персонажа.
!ВНИМАНИЕ, если таблица создана, то она будет обновлена на те параметры, которые вы введете.

3 будет следующее по счету — функция проверяет значение в БД

Давайте проверим, есть ли данный ник в тестовой БД

4 мы расмотрим 3 функции, которые будут читать нашу статистику из БД

Для начала делаем запрос на проверку.
А затем уже и загружаем

Ну вот и все. Не судите строго. Не давно начал учить работу с MySQL. Это основные запросы, которыми пользуются скриптеры. Ну вроде я описал, что какая делает.
Всем спасибо, кому помог поставьте +
Если будут ошибки, приношу свои извинения, но вроде писал правильно. Буду рад, если покажете ошибки.

Последний раз редактировалось DeadScripter; 29.08.2015 в 02:57 .

Если Вы видите такие термины как: MySQL, SQL, база данных, БД, database, DB, таблица, СУБД, то знайте, речь идет о БАЗЕ ДАННЫХ!
Конечно все это немного разные вещи, но если Вы в этом не разбираетесь, то не забивайте себе голову, в конце статьи расскажем кому интересно.

База Данных, как Вы уже могли догадаться, это ящик с информацией. В этот ящик информацию можно положить, удалить или найти. Любой сайт использует сервер для хранения данных, будь то список юзеров, комментарии посетителей, или счетчик посещений.
Но мы используем Базу Данных для сервера кс1.6. Для чего?
Например для статистики игроков, или список банов, админки и пароли тоже храним в базе.

Так почему бы не хранить все эти данные на сервере в файлах? Зачем нам какой то SQL?
Все очень просто!
Чтобы серверу получить необходимую информацию из файла, нужно прочитать сначала 1-ую строку, посмотреть есть в ней то что нужно, если нет то, 2-ую и тд, пока не найдет то что нужно.
MySQL же работает так: друг, я знаю где это лежит! Держи!

Круто да? Почему MySQL такая быстрая штука? Правильней сказать, что база данных это не ящик, а таблица. Смотрите как выглядит например статистика игроков:

Или вот так выглядит хранение банов:

Плагин посылает запрос в базу, типа: проверь, есть ли игрок со стим айди STEAM_0:0_123456789 в таблице `amx_bans` с не истекшим сроком бана
MySQL говорит: да, есть, вот такая причина бана и истечет срок через 10 дней. Плагин в свою очередь не пускает игрока на сервер.
Все данные в каждой колонке таблицы имеет свой тип: INT целое число, varchar текст, есть еще BOOL, FLOAT и куча других типов, их значения занимают мало места, благодаря «индексам» таблица сортируется и еще тонна всяких штук, благодаря которым из миллиона строк в таблице с банами, mysql найдет игрока меньше чем за секунду.
В файлах, на сервере кс, обычно хранят мало информации, потому что сервак просто зависнет если это будет не так. Помните да, что csstats.dat может очиститься и статистика игроков обнулится, этого не произойдет если использовать CsStats MySQL!

А где лежат эти таблицы MySQL?

MySQL это типа программа, запущенная на компе. Это такой же сервер как и Counter-Strike. Все популярные хостинги предоставляют своим клиентам доступ к Базе Данных.

Как подключиться к MySQL?

Разберем какие данные нужны для подключения сервера кс1.6 к mysql

  • IP сервера MySQL — это IP адрес на котором находится MySQL. Он может быть буквенный(mysql.hosting.ru) или цифровой(12.34.56.78)
  • DataBase — это имя базы данных, в которой будут находиться таблицы со статистикой игроков, банами и прочим
  • User — имя пользователя, который имеет доступ к базе данных DataBase и вносить в ее таблицы изменения и и тп
  • Пароль — пароль, чтобы никто кроме вас и вашего сервера не имел доступ

Эти данные вводите например в конфиг csstats_mysql.cfg, при первом включении плагин создает таблицу под названием csstats_players в базе данных DataBase. И потом уже добавляет в нее игроков.

Связь сервера и сайта через MySQL

Тут не совсем связь, сервер пишет статистику в MySQL, а сайт берет информацию из MySQL и показывает ее пользователю в красивом оформлении.
Просто сайт своими средствами не может получить доступ, например к csstats.dat, но легко может получить доступ к БД

Как посмотреть/изменить/удалить данные в базе?

Для этих целей есть инструмент под названием PhpMyAdmin.
Его предоставляет так же хостинг. Это веб панелька, заходите на нее через обычный браузер, вводите логин и пароль от базы данных и там увидите примерно следующее:

Тут можно создавать, удалять, очищать, обновлять и все все все.

Что такое SQL запросы?

Чтобы добавить/изменить/удалить или просмотреть запись в таблице, нужна сказать mysql чего мы хотим, человеческий язык он конечно не понимает, но понимает SQL запросы.
Чтобы добавить нового игрока в статистику игроков csstats_mysql, плагин посылает запрос:

Чтобы показать статистику игрока плагин шлет:

Это просто небольшие примеры SQL запросов, подробнее можете почитать в интернете.
Вы можете тоже слать SQL запросы в phpmyadmin, но вряд ли они Вам понадобятся, просто знайте 😉

Термины

• База Данных, БД, DataBase, DB — это все сама база данных, в ней хранится информация
• SQL — язык управления базами данных. То есть это и есть SQL запросы, которыми можно вносить изменения в базах
• СУБД — Система Управления Базами Данных. То есть это программа(сервер), которая управляет базами данных, принимает SQL запросы и тд. Есть много разных СУБД: SQLite, PostgreSQL, MySQL и другие. Самая популярная из них это MySQL
• MySQL — это СУБД, смотрите выше.
Старался писать простым, чтобы новички поняли суть. Более подробно можете почитать в интернете, информации на эту тему там много.

Ошибки MySQL, что они означают и как с ними бороться

Если в error_ логах Вы увидите ошибку, типа: Ошибка MySQL! или MySQL Error! и подобное, ЗНАЙТЕ! Это ошибка MySQL, а не плагина.
Если Вы не знаете английский, воспользуйтесь переводчиком, это не сложно.
Тут разберем несколько популярных ошибок

    Access denied for user ‘user’@’localhost’ (using password: YES)

Показано с 1 по 4 из 4

Опции темы
Поиск по теме
Отображение
  • Линейный вид
  • Комбинированный вид
  • Древовидный вид

Плагин MySQL — разбор функций

В сем здравствуйте. На данном форуме много уроков по MySQL и по переводу мода на него, но нет урока, который бы описывал функции данного плагина. В официальном Pawno описание функций только на английском.

Поэтому я решил написать урок, посвященный всем доступным функциям MySQL

Ну для начала: по этой ссылке можно скачать плагин MySQL для сервера. Тут же есть и описание функций (на англ)
Кстати, функции подходят только к плагину от BlueG (G-sTyLeZzZ)

Функции плагина
Примечание: Каждая функция (кроме mysql_connect и mysql_debug) имеет параметр connectionHandle — ID базы данных. Если вы подключены только к одной базе данных, то вам не нужно использовать данный параметр. Он всегда будет 1 по умолчанию

С помощью данной функции можно включить / отключить запись всех действий с базой данных в лог (не рекомендую, если не требуется — может тормозить сервер)

enable: 0 — отключить, 1 — включить

Пример использования (так, как его использую я):

С помощью данной функции можно подключиться к Базе Данных
Важное замечание: Не пытайтесь переподключиться к Базе Данных с помощью этой функции. Для этого используйте mysql_reconnect()

const host[]: IP, на котором расположена База Данных
const user[]: логин пользователя для доступа к Базе Данных
const database[]: имя Базы Данных
const password[]: пароль, для подключения к Базе Данных

Возвращает: ID соединения (его нудно использовать в connectionHandle)

Данная функция проверяет, если ли соединение с Базой Данных
Важное замечание: проверка на состояние соединения (и рестарт, если нужно) происходят автоматически при использовании потоков

Возвращает : 1 — если соединение есть, 0 — если нет

Данная функция получает статистику MySQL сервера

Синтаксис:

const destination[]: строка, в которую необходимо записать полученный результат
connectionHandle: ID соединения

new stats [ 150 ]; mysql_stat ( stats ); print( stats );

//Выведет:
Uptime : 380 Threads : 1 Questions : 3 Slow queries : 0 Opens : 12 Flush tables : 1
Open tables : 6 Queries per second avg : 0.008

С помощью этой функции можно изменить кодировку симовлов в Базе Данных. Полезно для использования в БД символов, отличных от английских (например, кириллицу)

charset[]: необходимая кодировка
connectionHandle: ID соединения

С помощью этой функции можно узнать, какая сейчас кодировка установлена

destination[]: строка, в которую запишем текущую кодировку
connectionHandle: ID соединения

С помощью этой функции можно переподключиться к БД

connectionHandle: ID соединения

С помощью этой функции можно попросить MySQL сервер перезагрузить таблицы пользовательских привилегий (сам не юзал)

connectionHandle: ID соединения

//Данный запрос имеет тот же смысл, что и строка выше
mysql_query ( "FLUSH PRIVILEGES" );

С помощью этой функции можно попросить MySQL сервер перезагрузить таблицы пользовательских привилегий (сам не юзал)
Важное замечание: функция добавлена в версии R6-2 плагина и не работает в более ранних версиях
Замечание: такие спецификаторы как %2.f, %10.s еще не поддерживаются

connectionHandle: ID соединения
output[]: строка, в которую придется записать результат
format[]: строка, которую нужно подготовить для запроса
. тут аргументы

Дополнения:
Эту функцию можно использовать (и надо использовать) вместо простого format, если вы хотите отправить этот запрос к БД, т.к. она автоматически проверяет запрос на запрещенные символы, которыми можно вызвать SQL инъекцию и заменяет их не безопасные

Доступные спецификаторы:

%s — обычная строка (опасные символы не трогаются)
%e — строка, которую необходимо почистить от возможной SQL инъекции (в этом и есть вся разница с format
%d — целое число (ну это и так понятно. )
%f — вещественный тип (дробь)
%i — число

Самая главная функция в плагине. Отправляет запрос к Базе Данных
Важное замечание: я рекомендую всем Вам для каждого запроса создавать потоки. Подробнее о них ниже

query[]: запрос, который необходимо отправить к Базе Данных
resultid: ID запроса (необходимо для потоков)
extraid: переменная, которую вы хотите передать в поток
connectionHandle: ID соединения

//Если вы не хотите использовать потоки
mysql_query ( "SELECT * FROM `mytable` WHERE condition=true" );

//А это если хотите использовать их
#define THREAD_MYSELECT (1)
mysql_query ( "SELECT * FROM `mytable` WHERE condition=true" , THREAD_MYSELECT , playerid );
//Данный запрос будет отправлен и обработан в отдельном потоке
//Подробнее ниже.

Возвращает: 1 — если запрос отправлен, 0 — если произошла ошибка

Функция схожа с mysql_query. Разница в том, что тут вы на каждый поток можете создать свой паблик

index: переменная, которую вы хотите передать для использования в потоке
query[]: запрос, который необходимо отправить к Базе Данных
callback[]: название потока (паблика)
extraid: (дополнительный) переменная, которую вы хотите передать в поток
connectionHandle: ID соединения

Замечание: так как создается новый public, не забудьте добавить к нему forward

Пример использования:

f

orward MySqlCallback ( query [], index , extraid , connectionHandle );

public OnPlayerConnect ( playerid )
<
mysql_query_callback ( playerid , "SELECT * FROM `mybuildings`" , "MySqlCallback" );
>

public MySqlCallback ( query [], index , extraid , connectionHandle )
<
//Query processed, you can execute your code now
>

Возвращает: 1 — если запрос отправлен, 0 — если произошла ошибка

Всегда используйте эту функцию после отправки запросов SELECT, SHOW, DESCRIBE, EXPLAIN, CHECK TABLE. Иначе будут создавать пробки
Замечание: Функция используется для сохранения результата запроса для последующей обработки. Не забывайте очищать данные, когда они больше не нужны — mysql_free_result().

connectionHandle: ID соединения

Возвращает: 1 — если сохранено, 0 — если произошла ошибка

Функция используется для очистки результата после использования mysql_store_result

connectionHandle: ID соединения

Данная функция проверяет строку на символы, которые могут вызвать SQL инъекцию и отключа Например, x00,
,
, , ‘, " и x1a.
Важное замечание: Всегда используйте эту фунцкию (если не используете mysql_format), если хотите отправить запрос с данными полученными от игрока. Во избежание SQL инъекции

const source[]: первоначальная строка
destination[]: строка, в которую записать безопасную строку
connectionHandle: ID соединения

Замечание: Перед использованием этой функции необходимо, чтобы соединение с БД было установлено.
Замечание: Символы % и _ не блокируются, т.к. используются в некоторых запросах.

Возвращает: кол-во найденных и нейтрализованных вредоносных символов

Функция получает код ошибки предыдущей MySQL операции

connectionHandle: ID соединения

Возвращает: код ошибки, 0 — если ошибок нет

Функция получает кол-во ошибок / предупреждений из предыдущего запроса

connectionHandle: ID соединения

Возвращает: код кол-во предупреждений, 0 — если их нет

Функция получает кол-во строк работа с которыми совершилась через запросы INSERT, UPDATE, REPLACE или DELETE

connectionHandle: ID соединения

Замечание: Если последний запрос был DELETE, но без WHERE — все строки из данной таблицы будут удалены, но это функция вернет 0.

Возвращает: кол-во строк

Функция получает кол-во строк, полученных в результате выполнения запросов SELECT и SHOW (схожа с mysql_affected_rows)

connectionHandle: ID соединения

Возвращает: кол-во строк

Функция получает кол-во столбцов в результате запроса

connectionHandle: ID соединения

Возвращает: кол-во столбцов

Функция получает ID сгенерированный благодаря AUTO_INCREMENT в предыдущем INSERT запросе

connectionHandle: ID соединения

Возвращает: число вставленное в таблицу, как AUTO_INCREMENT

Функция получает кол-во столбцов в самом последнем запросе

mysql_query ( "SELECT * FROM mytable" );
mysql_store_result ();

printf ( "В результате запроса %d столбцов." , mysql_field_count ());

Возвращает: число столбцов

Функция получает число из результата запроса (только если получено 1 число)

Синтаксис:

connectionHandle: ID соединения

mysql_query ( "SELECT myid FROM players LIMIT 1" );
mysql_store_result ();

new myid = mysql_fetch_int ();

Возвращает: полученное число

Функция получает дробь из результата запроса (только если получена 1 дробь)

Функция служит для обработки полной строки из результата запроса

Замечание: Если запросом получено несколько строк, то данная функция после обработки текущей строки перейдет на следующую.
Замечание: Есть еще одна функция (точнее макрос) — mysql_fetch_row. В нем в отличии от данной функции используется разделитель по умолчанию — ‘|’

mysql_query ( "SELECT * FROM players WHERE name=’Myname’" );
mysql_store_result (); new resultline [ 200 ];

if( mysql_fetch_row_format ( resultline ))
<
//Для разделения можете использовать — sscanf, split, strtok или любой другой способ. Я использую sscanf
sscanf ( resultline , "p dds" , PlayerInfo [ playerid ][ pLevel ], PlayerInfo [
playerid ][ pAdmin ], PlayerInfo [ playerid ][ pRandomString ]);
>
else SendClientMessage ( playerid , 0xFFFFFF , "В базе данных нет!" );

Возвращает: 1 — при обработке, 0 — если нет строк для обработки

Функция служит для перехода на следующую строку.

Замечание: Помните, что mysql_fetch_row_format автоматически переводит на следующую строку (будьте внимательны)
Замечание: Есть еще одна функция (точнее макрос) — mysql_next_row. Она полностью дублирует данную

connectionHandle: ID соединения

Возвращает: 1 — если строка сменилась, 0 — если больше нет строк

Функция получает название определенного столбца.

Синтаксис:

number: номер столбца
dest[]: строка, в которую нужно записать название столбца
connectionHandle: ID соединения

Важное замечание: Если вы укажите неверный номер столбца, плагин крешнется
Замечание: Номер первого столбца — 0

Функция получает данные из указанного столбца

Замечание: Есть еще одна функция (точнее макрос) — mysql_get_field

string[]: строка куда будет помещен результат из столбца
const fieldname[]: имя столбца, из которого будем брать данные
connectionHandle: ID соединения

Коллбеки плагина
Примечание: Используйте потоки, только если вы профессионал

Данный коллбек вызывается, когда число (отличное от -1) передается через result >mysql_query

query[] — выполненный запрос
resultid — ID потока (передается через resultid в mysql_query)
extraid — переменная (передается через extraid в mysql_query)
connectionHandle — ID соединения

#define THREAD_LOADPLAYER (5)

public OnPlayerConnect ( playerid )
<
mysql_query ( "SELECT * FROM players WHERE name=’Myname’" , THREAD_LOADPLAYER , playerid );
return 1 ;
>

public OnQueryFinish ( query [], resultid , extraid , connectionHandle )
<
switch( resultid )
<
case THREAD_LOADPLAYER :
<
mysql_store_result ();
if( IsPlayerConnected ( extraid ))
<
//Ваш код
>
mysql_free_result ();
>
>
return 1 ;
>

Данный коллбек вызывается, когда происходит ошибка при отправлении запроса

Параметры:

p

ublic OnQueryError ( errorid , error [], resultid , extraid , callback [], query [], connectionHandle )

errorid — ID ошибки
error [] — название ошибки
resultid — ID потока
extraid — переменная ( передается через extraid в mysql_query )
callback [] — название коллбека , если был mysql_query_callback ( если не было — NULL )
query [] — отправленный запрос
connectionHandle — ID соединения