- Dokumentacja
- Funkcje serwera
- dbFetch
Funkcja
dbFetch
Wykonuje zapytanie i od razu zwraca wynik. Jedno wywołanie zamiast dbQuery, dbPoll i dbFree. Działa z SELECT, INSERT, UPDATE i DELETE.
Składnia
table dbFetch(element connection, string query, mixed ...)Argumenty
connectionelement- Uchwyt z
dbConnect. querystring- Zapytanie SQL z
?w miejscu wartości. ...mixed- Wartości wstawiane w miejsce
?, bezpiecznie zacytowane.
Zwraca
Tablica wierszy (każdy wiersz to kolumna = wartość). Dodatkowo rows.insertId (ID wstawionego wiersza), rows.affectedRows (liczba zmienionych wierszy) i rows.columns (nazwy kolumn po kolei). Przy błędzie false i opis błędu.
Przykład
local db = dbConnect("mysql", "glowna")
addCommandHandler("top", function(player)
async(function()
local rows, err = dbFetch(db, "SELECT nick, kasa FROM gracze ORDER BY kasa DESC LIMIT 5")
if not rows then
outputChatBox("Błąd bazy: " .. err, player)
return
end
for i, row in ipairs(rows) do
outputChatBox(i .. ". " .. row.nick .. " - $" .. row.kasa, player)
end
end)
end)
addCommandHandler("rejestracja", function(player)
async(function()
local result = dbFetch(db, "INSERT INTO gracze (nick, kasa) VALUES (?, ?)", getPlayerName(player), 500)
if result then
outputChatBox("Twoje konto ma numer " .. result.insertId, player)
end
end)
end)
Uwagi
Najprościej w async. W zadaniu async(function() ... end) serwer nie czeka na bazę: wstrzymane jest tylko to zadanie, a gra i inne skrypty działają dalej. Poza zadaniem dbFetch też działa, ale serwer stoi, dopóki baza nie odpowie. Przy szybkim SQLite to bez znaczenia, przy MySQL używaj async.
Pola insertId i affectedRows nie przeszkadzają. ipairs, pairs i #rows widzą tylko wiersze. Wartość NULL z bazy przychodzi jako false.
Zobacz też
dbFetchOneWykonuje zapytanie i zwraca tylko pierwszy wiersz. Wygodne, gdy szukasz jednego rekordu, na przykład konta gracza.dbFetchValueWykonuje zapytanie i zwraca jedną wartość: pierwszą kolumnę pierwszego wiersza. Do liczenia (COUNT(*)), sum i pojedynczych pól.asyncUruchamia funkcję jako zadanie (korutynę). Kod w zadaniu biegnie od razu, aż do pierwszego czekania (sleep,await,waitForEvent). Wtedy oddaje sterowanie, a serwer i gra działają dalej. Gdy czekanie się skończy, zadanie rusza od miejsca, w którym stanęło. Dzięki temu kroki rozłożone w czasie (odliczanie, zapytanie do bazy, odpowiedź HTTP, czekanie na gracza) piszesz po kolei, bez zagnieżdżonych callbacków i timerów.dbExecWykonuje zapytanie, które nie zwraca wyniku (INSERT, UPDATE, CREATE). Argumenty wstawiasz w miejsce znaków?.