Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Spis treści:
- 1). Wprowadzenie
- 2). Wymagania
- 3). Tworzenie tabel
- 4). Typy pól
- 5). Łączenie z bazą
- 6). Wysyłanie zapytania
- 7). Omówienie kilku funkcji dot. MySQL
- 8). Obsługa danymi:
- - stworzenie rekordu
- - pobranie rekordu
- - zapisanie danych
- 9). Rady, zakończenie
- Wprowadzenie:
- MySQL to inaczej wolnodostępny system zarządzania bazą danych.
- Jest obsługiwany przez wiele systemów, dzięki czemu nie mamy problemu z utrzymaniem kompatybilności.
- Dodatkowo jest wydany wersji źródłowej, co umożliwia skompilowanie go dla dowolnej platformy systemowej.
- Istnieje kilka typów mechanizmów każdy z nich służy do innego zastosowania:
- - MyISAM - domyślny mechanizm (nie obsługuje transakcji ani kluczy obcych, umożlwia wyszukiwanie pełnotekstowe)
- - InnoDB - także domyślna opcja (obługuje transakcje, klucze obce oraz zakładanie blokad na poziomie wierszy)
- Jest jeszcze kilka typów, ale nimi się nie będziemy interesować, ponieważ zostały wycofane.
- Wymagania:
- Co prawda MySQL nie potrzebuje dużych wymagań z takiego powodu iż sam w trakcie wykonywania procesów, stara się je sam optymalizować.
- To także dotyczy się tabel, baz danych...
- Z doświadczenia nauczyłem się, że w teorii bazy potrzebują dużo pamięci RAM i szybkie dyski, można też trafić na to, że procesory też są brane pod uwagę.
- Głównie MySQL opiera się na cache'ch, bo ponad 90% wykonywanych zapytań trafia właśnie tam.
- Konfiguracja dla osób, które chcą w przyszłości otworzyć firme oferująca bazy danych:
- - Procesor: sempron 3000+
- - Pamięć: 2 GM RAM
- - Dysk twardy (główny): 2x250 GB (RE, 16 MB cache) z RAID
- - Dysk twardy (poboczny): 1x400 GB (wolniejsze dyski, dla przeprowadzanych backup'ów)
- Druga konfiguracja "optymalna" dla użytkownika:
- - Procesor: 1000+
- - Pamięć: 256/512 MB RAM
- - Dysk twardy: 20 GB z (RE, 16 MB cache i RAID)
- Tworzenie tabel:
- Jest to główny proces obsługi naszej bazy, wymaga utworzenia bazy i połączenia się, ale o łączeniu w następnym rozdziale.
- Możemy zacząć wprowadzać dane, najpierw jednak trzeba utworzyć tabele, robimy to według następującego schematu:
- [code]
- CREATE TABLE nazwa_tabeli (nazwa_pola1 typ_pola1 [atrybuty], nazwa_pola2 typ_pola2 [atrybuty], nazwa_pola3 typ_pola3 [atrybuty], PRIMARY KEY(nazwa_polaX))
- [/code]
- Przykład:
- [code]
- CREATE TABLE NBA (id int NOT NULL AUTO_INCREMENT, imie char(30), lata char(3), punkty char(3), mistrzostwa char(3), PRIMARY KEY(id))
- [/code]
- Każda tabela musi posiadać co najmniej jedno pole, dodatkowo co najmniej jedno pole, które będzie jednoznacznie identyfikuje wiersz w tabeli - tak zwany klucz główny.
- Jeśli jest masa danych, a Ty znasz klucz główny jednego z wierszy wtedy możesz bez problemu dostać się do tego wiersza.
- W naszym przypadku kluczem głównym jest pole pierwsze - id.
- Przeważnie nadaje jako klucz główny określa się pierwsez pole tabeli.
- Dodatkowo klucz główny posiada dwa atrybuty:
- pierwszy - NOT NULL - oznaczający, że wartość tego pola nigdy nie może być pusta;
- drugi - AUTO_INCREMENT* - oznaczający, że wartość pola będzie automatycznie zwiększania przez baze danych przy dodaniu rekordu;
- * Atrybut AUTO_INCREMENT - możemy stosować tylko do pól typu całkowitoliczbowego.
- Typy pól:
- Dostępnych jest wiele typów pól, najpopularniejsze poniżej:
- - CHAR(x) / VARCHAR(x) - ciąg znaków o maksymalnej dł. X, gdzie X nie może być większy od 255;
- - BLOB - binarny ciąg znaków o dł. ograniczonej przez pamięc Twojego serwera;
- - TINYINT(ilość znaków) - liczby z zakresu od -128 do 127 lub liczby dodatnie od 0 do 255;
- - SMALLINT(ilość znaków) - liczby z zakresu od -32768 do 32767 lub liczby dodatnie od 0 do 65535;
- - MEDIUMINT(ilość znaków) - liczby z zakresu od -8388608 do 8388607 lub liczby dodatnie od 0 do 16777215;
- - INTEGER / INT - liczba całkowita z przedziału -2147483647 do 2147483647 lub liczby dodatnie od 0 do 4294967295;
- - TEXT - tekstowy ciąg znaków o dł. ograniczonej przez pamięć Twojego serwera;
- - DATE - data w formacie określonym przez ustawienia serwera;
- - ENUM - enumeracja (wyliczenie). W kolumnie może się znaleźć jedna z podanych wartości;
- - YEAR - rok, jeśli zostanie podany zły, jego wartość zmieni się w 0000;
- - DECIMAL(x, y) - liczba dziesiętna, gdzie X oznacza maksymalną liczbe cyfr, a Y maksymalną liczbę cyfr po przecinku;
- Łączenie z bazą:
- Za pomocą poniższego kodu połączymy się poprawnie z naszą bazą (plugin: MySQL StrickenKid):
- [code]
- #define SQL_HOST "localhost"
- #define SQL_USER "user"
- #define SQL_PASSWORD "password"
- #define SQL_DB "datebase"
- new MySQL:sql_init;
- public OnFilterScriptInit()
- {
- sql_init = mysql_init(1);
- new sql_handle = mysql_connect(SQL_HOST, SQL_USER, SQL_PASSWORD, SQL_DB, sql_init, .auto_reconnect=1);
- if (sql_handle) // mysql_connect jeśli nastąpi poprawne połączenie z bazą zwróci nam wynik "true"
- {
- // jeśli warunek się wykona
- printf("Połączono z bazą danych, gratulacje!");
- } else {
- // jeśli warunek się nie wykona
- printf("Niepołączono z bazą danych!!!");
- SendRconCommand("exit"); // zamykamy serwer
- }
- return 1;
- }
- public OnFilterScriptExit() return mysql_close(sql_init);
- [/code]
- I tak oto połączyliśmy się z naszą bazą!
- Wysyłanie zapytania:
- W tym kroku nauczymy się wykonywać polecenia/zapytania, które wyślemy do naszej bazy.
- Dla przykładu pobierzemy z naszej przykładowej tabeli lata oraz punkty, którego wyszukamy za pomocą imienia.
- [code]
- new buffer[127], playerNick[MAX_PLAYER_NAME];
- GetPlayerName(playerid, playerNick, MAX_PLAYER_NAME);
- mysql_real_escape_string(playerNick, playerNick); // sprawdzamy, czy nie ma zadnych podejrzanych znakow, ktore moga naszej bazie zaszkodzic
- format(buffer, 127, "SELECT lata, punkty FROM NBA WHERE imie='%s'", playerNick);
- if (mysql_query(buffer)) mysql_ping(); // Ta linijka pozwoli nam podtrzymać nasze połączenie
- mysql_store_result(); // zapisujemy do pamięci
- if (mysql_num_rows() && mysql_fetch_row(playerNick, ""))
- {
- new lata, punkty;
- sscanf(playerNick, "dd", lata, punkty);
- format(buffer, 127, "Masz %d punktów i %d lat.", punkty, lata);
- SendClientMessage(playerid, -1, buffer);
- }
- mysql_free_result(); // czyścimy pamięć
- [/code]
- Jeśli nasz rekord będzie istniał otrzymamy wiadomość np.
- [code]
- Masz 14 punktów i 19 lat.
- [/code]
- Omówienie kilku funkcji dot. MySQL:
- Ogólnie w MySQL posiadamy bardzo dużo funkcji, które przydają się nam w różnych problemach można znaleźć rozwiązenia dzięki nim.
- Podam tylko te związane z datą:
- [code]
- -------------------------------------------------
- | Funkcja | Przykład użycia | Opis |
- -------------------------------------------------
- HOUR() | HOUR(kolumna) | Zwraca samą godzine, ze wskazanej daty
- MINUTE() | MINUTE(kolumna) | Zwraca same minuty, ze wskazanej daty.
- SECOND() | SECOND(kolumna) | Zwraca same sekundy, ze wskazanej daty.
- DAYNAME() | DAYNAME(kolumna) | Zwraca nazwę dnia tygodnia.
- DAYOFMONTH() | DAYOFMONTH(kolumna) | Zwraca sam dzień miesiąca, ze wskazanej daty (wyrażone liczbą).
- MONTHNAME() | MONTHNAME(kolumna) | Zwraca nazwę miesiąca występującego we wskazanej dacie.
- MONTH() | MONTH(kolumna) | Zwraca sam miesiąc ze wskazanej daty (wyrażony liczbą).
- YEAR() | YEAR(kolumna) | Zwraca sam rok ze wskazanej daty.
- ADDDATE() | ADDDATE(kolumna INTERVAL x typ) | Dodaje do daty przechowywanej w kolumnie x jednostek i zwraca wynik
- SUBDATE() | SUBDATE(kolumna INTERVAL x typ) | Odejmuje od daty przechowywanej w kolumnie x jednostek i zwraca wynik.
- UNIX_TIMESTAMP()| UNIX_TIMESTAMP(data) | Zwraca liczbę sekund jaka upłynęła od początku tzw. epoki unixa lub od wskazanej daty.
- [/code]
- Obsługa danymi:
- - stworzenie rekordu
- W życiu codziennej pracy MySQL, przyjdzie taka pora, że trzeba będzie stworzyć REKORD.
- A więc napiszmy taką, sugerując się wcześniejszą tabelą
- Przykład 1).
- [code]
- INSERT INTO NBA (imie, punkty, lata, mistrzostwa) VALUES ('Imie', '17', '2', '1');
- [/code]
- Przykład 2).
- [code]
- INSERT INTO NBA SET imie='Imie', punkty='17', , lata='2', mistrzostwa='1';
- [/code]
- Przykład 3).
- [code]
- INSERT INTO NBA ('Imie', '17', '2', '1');
- [/code]
- Jak widzimy, można zrobić to na wiele sposobów.
- - pobranie rekordu
- Ten krok pozwoli się nam przyjrzeć jak powinno wygladać poprawne pobranie rekordu.
- Stwórzmy sobie funkcje, która wyśle zapytanie, czy dane konto o nicku np. 'Jaś' istnieje...
- [code]
- public OnPlayerConnect(playerid)
- {
- if (SprawdzCzyKontoIstnieje(playerid))
- {
- SendClientMessage(playerid, -1, "Twoje konto istnieje w bazie danych!");
- } else {
- SendClientMessage(playerid, -1, "Twoje konto nie istnieje w bazie danych!");
- }
- return true;
- }
- SprawdzCzyKontoIstnieje(graczid)
- {
- new buffer[127], nick[24], bool: istnieje = false;
- GetPlayerName(graczid, nick, MAX_PLAYER_NAME);
- mysql_real_escape_string(nick, nick);
- format(buffer, 127, "SELECT 1 FROM NBA WHERE imie='%s'", nick);
- if (mysql_query(buffer)) mysql_ping();
- mysql_store_result();
- if (mysql_nom_rows()) istnieje=true;
- mysql_free_result();
- return istnieje; // jeśli znalazlo konto otrzymamy wynik true, jesli nie, to false
- }
- [/code]
- Proste, prawda?
- - zapisanie danych
- Przyszła pora na zapisanie/zaaktualizowanie danych gracza
- Użyjemy SEPARATORA "UPDATE":
- [code]
- enum p_info { bool: logged, imie[24], punkty, lata, mistrzostwa };
- new pInfo[MAX_PLAYERS][p_info];
- public OnPlayerDisconnect(playerid, reason)
- {
- if (pInfo[playerid][logged]) // Sprawdzamy czy zalogowany jest
- {
- new buffer[127];
- GetPlayerName(playerid, pInfo[playerid][imie], MAX_PLAYER_NAME);
- pInfo[playerid][punkty] = GetPlayerScore(playerid);
- format(buffer, 127, "UPDATE NBA SET punkty='%d', lata='%d', mistrzostwa='%d' WHERE imie='%s'", pInfo[playerid][punkty], pInfo[playerid][lata], pInfo[playerid][mistrzostwa], pInfo[playerid][imie]);
- mysql_query(buffer);
- }
- return true;
- }
- [/code]
- I tak oto, zapisaliśmy dane gracza, gdy opuścił serwer.
- Zakończenie:
- W końcu nadszedł koniec tego skromnego poradnika.
- Należy pamiętać o SQL Injection, można się przed tym zabezpieczyć stosująć w formatach tj. '%s', '%d', '%f';
- P.S: Gdy będe miał jeszcze czas, to poprawie co nieco.
- Podałem możliwe przykłady stosując do tego PAWN, aby było prościej zrozumieć znaczenie...
- Życzę sukcesów z pozdrowieniami, AXV.
- (C) 2012, AXV
Advertisement
Add Comment
Please, Sign In to add comment