[SourcePawn] Урок 13 - Работа с базами данных (MySQL, SQLite)

Drop

Участник
Сообщения
41
Реакции
1
нашел в чем причина.
Есть запрос FormatEx(szQuery, sizeof(szQuery), "UPDATE `users` SET `steamid` = '%s' WHERE `ip` = '%s';", steamid, ip);
он добавляет стим ид, но если игрок уже был на сервере и стим ид уже есть, его начинает кикать, т.к. возвращается сообщ, на сколько я понял, как можно сделать, чтобы в случае, если запись уже есть не кикало?
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #28
Имеет смысл закрепить в шапку следующую информацию.

Перед выполнением каждого запроса вызов функции SQL_SetCharset() / Database.SetCharset() нежелателен.
На MySQL данная операция выполняется в одном потоке с плагином, из-за чего неизбежен фриз. Пруф 1 (обсуждение проблемы фриза при выполнении sm_rehash в репозитории SourceBans++), Пруф 2 (код драйвера).
На SQLite вызов этой функции не имеет смысла. Пруф (код драйвера).

Устанавливайте кодировку только один раз, при коннекте, и только если у Вас MySQL. На SQLite, повторюсь, вызов этой функции не имеет смысла.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #29
@Kr1kuzya, я сколько тестил: если после подключения установить кодировку - в бд пишутся иероглифы, если же перед INSERT ставить кодировку - всё норм.
 

DenisPukin

Капитан Костыль
Сообщения
185
Реакции
34
Урок достаточно хорош, но не для новичков(Прочитав 5 раз я так и не понял).Хотелось бы примеры попроще и описание работы бд, так как не понятно как она работает.(Это всего лишь пожелания, если возможно то можете их пожалуйста реализовать)
 
Последнее редактирование:

Allen

love society
Сообщения
352
Реакции
274
  • Команда форума
  • #31
Урок достаточно хорош, но не для новичков(Прочитав 5 раз я так и не понял).Хотелось бы примеры попроще и описание работы бд, так как не понятно как она работает.(Это всего лишь пожелания, если возможно то можете их пожалуйста реализовать)
В основах написано, что не желательно начинать с SP, для начала следует выучить основы стандартного языка программирования,а как работает бд учат на уроках информатики с 8-9 класса. Да и можно открыть любой плагин, который работает с бд и понять принцип.
 

DenisPukin

Капитан Костыль
Сообщения
185
Реакции
34
В основах написано, что не желательно начинать с SP, для начала следует выучить основы стандартного языка программирования,а как работает бд учат на уроках информатики с 8-9 класса. Да и можно открыть любой плагин, который работает с бд и понять принцип.
Ну это вы в провинциях на уроках посидели бы и поняли чему там учат.
Я высказывал в прошлом сообщении своё мнение со стороны новичка.И ни в коем случае не высказывал недовольство.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #33
@DenisPukin, напиши по пунктам что именно не ясно.
 

Arthur Don

Участник
Сообщения
1,696
Реакции
256
@R1KO , прошу вас дополнить статью информацией, как составлять запросы в базу данных, а именно какие слова использовать, в каком порядке. Я думаю что это будет очень полезно новичкам и мне) Заранее спасибо.
 

Саша Шеин

Кому костылей?
Сообщения
1,697
Реакции
621
@R1KO, добавь ещё про новые функции, если они есть. Теперь ведь 1.9 стабильная версия.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #36
@R1KO , прошу вас дополнить статью информацией, как составлять запросы в базу данных, а именно какие слова использовать, в каком порядке. Я думаю что это будет очень полезно новичкам и мне) Заранее спасибо.
окей.
@R1KO, добавь ещё про новые функции, если они есть. Теперь ведь 1.9 стабильная версия.
крузя говорил. на выходных добавлю.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #38
@Rabb1t, я имел ввиду что он говорил мне добавить инфу по новым ф-ям
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #39
по просьбе @artushonok пишу небольшую справку по SQL (актуально как для mysql так и для sqlite).

Сначала 1 важный момент насчет кавычек.
  • В косых кавычках только имена столбцов и таблиц (`steamid`)
  • В прямых кавычках только значения ('STEAM_0:0:123456789'). Обычно это используется для строк. Целые числа можно не заключать в кавычки.


Самые основные запросы бывают 3-х видов:
  1. SELECT - Выборка данных из таблицы (одну запись, несколько, или даже не запись, а просто количество записей)
  2. INSERT - Вставка данных в таблицу (можно как одну так и несколько сразу)
  3. UPDATE - Обновление данных в таблице
Теперь подробнее о каждом из них.
  1. SELECT
    Синтаксис:
    SELECT имена столбцов, которые необходимо выбрать FROM имя_таблицы WHERE условие;
    Если нужно выбрать полностью все записи - то WHERE и всё что после него - не пишем!

    С именами столбцов всё просто и думаю ясно.
    Но добавлю немного пояснений.
    • Если хотим выбрать все то пишем просто *
    • Функции агрегирования данных
      • COUNT(*) - получает количество записей, удовлетворяющих условие
      • SUM(имя_столбца) - сумма значений в столбце
      • AVG(имя_столбца) - среднее значение в столбце
      • MAX(имя_столбца) - самое большое значение в столбце
      • MIN(имя_столбца) - самое малое значение в столбце
      Для функций SUM и AVG рассматриваемый столбец должен содержать числовые значения.
    С именем таблицы всё ясно.

    Теперь по условиям.
    Поддерживаются типичные операции сравнения:
    Так же условия можно комбинировать используя логические операторы:
    • AND - И (условие выполняется если обе части выполняются)
    • OR - ИЛИ (условие выполняется если хоть одна из частей выполняется)
    • NOT - инвертирование значения
    Несколько примеров:
    C-подобный:
    SELECT * FROM `players` WHERE `steam_id` = 'STEAM_0:0:123456789';
    Вернет все записи у которых значение столбца steam_id равно STEAM_0:0:123456789
    C-подобный:
    SELECT * FROM `players` WHERE `steam_id` = 'STEAM_0:0:123456789' OR `ip` = '127.0.0.1';
    Вернет все записи у которых значение столбца steam_id равно STEAM_0:0:123456789 ИЛИ значение столбца ip равно 127.0.0.1
    C-подобный:
    SELECT * FROM `players` WHERE `steam_id` = 'STEAM_0:0:123456789' AND`ip` = '127.0.0.1';
    Вернет все записи у которых значение столбца steam_id равно STEAM_0:0:123456789 И значение столбца ip равно 127.0.0.1
    Еще в запросах выборки можно использовать сортировку и лимит количества.
    • Сортировка (ORDER BY)
      Сортировка пишется сразу после условия.
      Она бывает:
      • ASC - по возрастанию значений
      • DESC - по убыванию значений

      C-подобный:
      SELECT * FROM `players` WHERE `score` NOT NULL ORDER BY `score` DESC;
      Выберет все записи у которых score не NULL и отсортирует по значению столбца scoreпо убыванию (от больших к маленьким)
      C-подобный:
      SELECT * FROM `players` ORDER BY `score`ASC;
      Выберет все записи и отсортирует по значению столбца score по возрастанию

      Если нужно сортировать по нескольким столбцам то просто перечисляем их:
      C-подобный:
      SELECT * FROM таблица ORDER BY столбец1 ASC, столбец2 ASC, столбец3 DESC;
      Один важный момент - Все столбцы по которым происходит сортировка должны быть указаны для выборки (перечислены после SELECT)
    • Лимит (LIMIT)
      Ну тут всё просто.
      Пишется в запросе на самом последнем месте и позволяет ограничить количество выбранных записей. Сильно ускоряет поиск.
      Например когда нам нужно получить данные по одному игроку то всегда нужно указывать LIMIT 1 чтобы база сразу вернула результат, как только найдет этого игрока, а не продолжала поиск.

      C-подобный:
      SELECT * FROM таблица ORDER BY `score` DESC LIMIT 10;
      Выберет 10 записей, у которых значение score больше всех (отсортирует по убыванию). Т.е. это запрос выбора ТОП 10 игроков во всех статистиках.

      Еще у лимита есть одна полезная фича - пропуск строк. Например, мы делаем постраничный вывод по записей. Это значит что нам нужно выводить сначала с 1-й по 10-ю запись, потом с 11-й по 20-ю и т.д.
      Мы пишем
      C-подобный:
      SELECT * FROM таблица LIMIT 0, 10;
      это выборка 1-й страницы
      C-подобный:
      SELECT * FROM таблица LIMIT 10, 10;
      это выборка 2-й страницы

      Т.е. 1-е число - это сколько записей нужно пропустить, 2-е - сколько записей нужно взять.

  2. INSERT
    Синтаксис:
    INSERT INTO имя_таблицы ( имена столбцов, в которые необходимо вставить данные) VALUES (сами данные);
    Тут всё очень просто
    C-подобный:
    INSERT INTO `players` (`steam_id`, `ip`, `name`, `score`) VALUES ('STEAM_0:0:12345678', '127.0.0.1', 'R1KO', 0);
    Если еще не ясно то вот иллюстрация:
    upload_2018-7-12_22-3-4.png

    Если столбец не указан к вставке но имеет значение по умолчанию то ему будет присвоено именно оно.
  3. UPDATE - Обновление данных в таблице
    Синтаксис:
    UPDATE имя_таблицы SET имя_столбца = значение, имя_столбца = значение, ... WHERE условие;
    По условию тут всё как и выборки (кроме сортировки и лимита - их здесь нет, при попытке использовать - получите ошибку)

    C-подобный:
    UPDATE `players` SET `name` = 'Боженька', `score` = `score`+10 WHERE `steam_id` = 'STEAM_0:0:12345678';
    Добавит к текущему значению `score` 10.
 

Rabb1t

Амбассадор
Сообщения
2,968
Реакции
1,429
  • Команда форума
  • #40
@R1KO, добавь в топик ссылку на этот пост, а то как мы знаем не все просматривают тему полностью.
 
Сверху Снизу