Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[Problem]Query/Zapytania sql w questach


Rekomendowane odpowiedzi

Opublikowano
Witam, Endymion_ napisał mi o to takiego queścika:



Quest działa następująco:

Jeśli zabiję coś innego niż "npc.is_pc()" to losuje liczbę z przedziału 1-2 jeśli liczba jest równa 2 to daje nam przedmiot jeśli mamy lvl 1-26 to losuje przedmiot z [1] tablicy, jeśli mamy 27-85lvl to losuje przedmiot z [2] tablicy a jeśli większy to z [3].


Wszystko ładnie śmiga tylko jest problem z funkcją mysql_query a mianowicie nie dodaje rekordów do bazy danych ;/

Mam na serwerze bazę danych "itemshop" a w nim tabelkę o nazwie "item_shop_test" która zawiera następujące kolumny:

  • id
  • id_konta
  • id_przedmiotu
  • wybrano
wszystkie cztery mają typ "int" bo wszystkie będą przechowywać liczby.


Dodałem do "questlib.lua"


function mysql_query(query)
i = 1

math.randomseed(os.time())
random = math.random()

n = "/tmp/mysql_"..random..pc.get_vid()

os.execute (MYSQL_BIN.." \""..MYSQL_CONFIG.."\" \""..query.."\" > " .. n)

local ret = dofile(n)
os.remove (n)

return ret
end


i do "quest_functions"


mysql_query


więc nie ma c**a że nie dodałem funkcji "mysql_query"


W grze działa to tak, bije sobie psy i przeważnie z co drugiego "leci" czyli wyświetla się na chacie że otrzymałem "PRZEDMIOT" można go odebrać na stronie po zalogowaniu. Lecz po wbiciu do Navicat'u połączeniu się z serwerem wybraniu bazy danych "itemshop" i tabelki "item_shop_test" ukazuje mi się pusta tabelka.... wynik - nie dodaje nowych rekordów do bazy :(


Jeśli ktokolwiek wie jak to naprawić niech mi pomoże z poważaniem baran860 :P

8910814572903361049127.png

Opublikowano

Ja drogi Baranku dałbym taką funkcję na query:

 

function query(sql)
    user = "mt2"
    pw = "mt2!@#"
    local var = {}
    var.pre = ''
    if user ~= nil then
        var.pre = var.pre..' -u'..user
    end
    if pw ~= nil then
        var.pre = var.pre..' -p'..pw
    end
    var.scriptfile = 'sc_'..pc.get_name()..number(1,999)..number(2,999)..number(3,999)
    var.outputfile = 'op_'..pc.get_name()..number(1,999)..number(2,999)..number(3,999)
    sql = string.gsub(sql,'"',"'")
    var.str = "/usr/local/bin/mysql -N -L "..var.pre.." < "..var.scriptfile.." > "..var.outputfile
    script = io.open(var.scriptfile,"a+")
    script:write(sql)
    script:close()
    os.execute(var.str)
    back = io.open(var.outputfile)
    quer = back:read()
    back:flush()
    back:close()
    os.remove(var.scriptfile)
    os.remove(var.outputfile)
    return quer
end

 

Kolejna sprawa:

Nie tak negujesz metody w queście:

 

when kill with !npc.is_pc() begin

 

Tylko tak:

 

when kill with npc.is_pc() == false begin

 

Co to k**** jest??

if number(1,2) >= 2 thenZrób tak:local x = number(1, 2)if x == 2 then -- co tam chcesz.w funkcji query w lua nie dawaj znaku `


arijh2.jpg

Opublikowano

Lazarus'ku :P dopasowałem się do Twoich uwag ale nie wiem czy poprawnie.

  • Dodałem funkcję query.
  • Oraz zmieniłem warunek na taki jaki mi podałeś czyli:
    when kill with npc.is_pc() == false begin
  • Zamieniłem również
    if number(1,2) >= 2 then
    na
    local x = number(1, 2)            if x == 2 then

Quest po "wgraniu" Twoich poprawek wygląda tak: http://wklej.to/4Xvx2

Działa tak samo więc nie wiem w czym różnica ;]

 

i tego zdania nie zrozumiałem: "w funkcji query w lua nie dawaj znaku ` " zamiast ` dałem ' również próbowałem żeby wcale nie dawać żadnych cudzysłowów, apostrofów etc.

Lecz dalej nie działa :(, nie zapisuje do bazy danych jeszcze wywala taki błąd:

 

http://zapodaj.net/10a0d6b2d4ff5.jpg.html

Jeśli dobrze znam angielski to wywnioskowałem że mam błąd w składni ;/ ale jaki? Wersja MySQL na serwerze to: Nie wiem jak sprawdzić

8910814572903361049127.png

Opublikowano

Up oh, panie wielki zły proszę nie bij mnie... Chociaż z drugiej strony, proszę zbij mnie.

 

Baranku, wejdę na pc to ogarne to :)

Ok, dodam jeszcze ze w syserr na serwerze wywala taki blad:

 

SYSERR: Sep 16 01:31:24 :: RunState: LUA_ERROR: locale/singapore/quest/questlib.lua:2535: attempt to concatenate global `MYSQL_CONFIG' (a nil value)
SYSERR: Sep 16 01:31:24 :: WriteRunningStateToSyserr: LUA_ERROR: quest MPCforum.start click

 

Wskazuje to na blad w 2535 lini w pliku questlib.lua

Caly plik questlib.lua

 

http://wklej.to/vIcnZ

 

Przepraszam ze nie pisze z PL znakami ale cos mi nie chce klawiatura pisac :]

 

Jeszcze zeby nie zakladac nowego tematu to ta funkcja:

 

function addmapsignal(x,y) raw_script("[ADDMAPSIGNAL x;"..x.."|y;"..y.."]") end

tworzy takie ptk. na mapie jak np. trzeba bylo robic misje na konia bojowego? Tzn. ze trzeba bylo dojechac do tego ptk?

8910814572903361049127.png

Opublikowano

Więc tak:

 

To jest Twoje query

 

query("INSERT INTO itemshop.item_shop_test ('id', 'id_konta', 'id_przedmiotu', 'wybrano') VALUES ('', '"..pc.get_account_id().."', '"..item.."', '0';")

 

a ja zrobiłbym je tak:

local pid = pc.get_account() -- nie bardzo kapuje co spowodowało, że pc.get_account_id() deaktywowało się.

 

query("INSERT INTO itemshop.item_shop_test VALUES (0, "..pid..", "..item..", 0);")

 

Jeżeli moje query wywali Ci error, podaj ss tej tabeli.

arijh2.jpg

Opublikowano

Dzięki Lazarus, już działa a co do funkcji "..pid..",

Zamieniłem ją na pc.get_account_id()

 

Dzięki jeszcze raz, limicik jak najbardziej zasłużony ;] Szkoda że lajki mało warte są :P

8910814572903361049127.png

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...