-
Üdv.
MTA-ba ha insertelek valamit a dbQuery-vel utána miért ad minden SELECT-re 1 sort?
Tehát van egy regisztrációs rendszer amibe ha regisztrál valaki lefut pl ez:
INSERT INTO users (username,password) VALUES (\'valami\',\'valami123\')
Ezután az INSERT után egy SELECT nem működik normálisan.
Tehát ha megakarom nézni, hogy van-e ilyen játékos az adatbázisba akkor 1 sort ad vissza mindig.
SELECT 0 FROM users WHERE username=\'ilyenugysincs\' AND password=\'ilyenjelszosincs\'
Itt vissza kellene adni 0 sort mert ilyen felhasználó-jelszó páros nincs az adatbázisba de valamiért mégis 1 sort ad vissza.
És az az érdekes mielőtt még nem fut le az INSERT addig tökéletesen működik a SELECT is és annyi sort ad vissza amennyit talál.
Próbáltam közvetlen az adatbázisba lefuttatni az sql-t ott tökéletesen működik.
A talált sorokat így kérem le:
adatok, sorok, last_insert_id = dbPoll(dbQuery(db_kapcs, \"SELECT 0 FROM users WHERE username=\'\"..uname..\"\' AND password=\'\"..pw..\"\'\"), -1)
if sorok == 0 then
nincs ilyen felhasználó
else
van ilyen felhasználó
end
Mi lehet a probléma?
Válaszokat előre is köszönöm!
-
Szia.
Elsőként is javaslom az alábbi sql select használatát:
function functionname()
dbQuery(function(query)
local query, query_lines = dbPoll(query, 0)
if query_lines > 0 then
for k, v in pairs(query) do
-- ide jöhet minden
end
else
-- üres a tábla, itt történjen valami, pl beszúrja neki az adatot vagy amit szeretnél.
end
end, connection, \"SELECT * FROM tablaneve\")
end
Másik fele, hogy amennyiben nem szükséges vagyis nem akarsz választ kapni a történetben, akkor javaslom az alábbi függvény használatát:dbExecA kérdésedre pedig:
Selectálás során a teljes táblából kell selectálni (SELECT * FROM ... etc) és utána kell megadnod az argumentet hogy mi alapján. Ahogy nézem alapból maga a felépítés sem stimmel nálad (legalábbis én soha nem láttam még így felépítve egy scriptet sem).
Inserthez:
dbExec(sqlkapcsolat, \"INSERT INTO table_neve SET username = ?, password = ?\", username, password )
Selecthez:
function functionname()
dbQuery(function(query)
local query, query_lines = dbPoll(query, 0)
if query_lines > 0 then
for k, v in pairs(query) do
if v[\"username\"] == username and v[\"password\"] == password then
-- van találat
else
-- nincs találat
end
end
else
-- üres a tábla, itt történjen valami, pl beszúrja neki az adatot vagy amit szeretnél.
end
end, connection, \"SELECT * FROM tablaneve\")
end
Ha minden igaz itt stimmelni fog a dolog. Ami fontos, hogy ne jelents el titkosítani sem, illetve valami kulcsot sem árt hozzáadni. Remélem tudtam segíteni.
-
És, hogy ha most csak egy konkrét felhasználóra szeretnék rákeresni akkor is a \"SELECT * FROM tablanev\"-et kellene használnom?
Mert ez most mindent kijelöl a táblába az összes felhasználót.
Ha \"SELECT * FROM tablenev WHERE username=felhasznalo123\"-at használnám akkor csak azt a felhasználót jelölné ki akivel éppen dolga van.
Valami ilyesmire gondolok amit leírtál alapján
dbQuery(function(query)
local query, query_lines = dbPoll(query, 0)
if query_lines > 0 then
-- van találat
else
-- nincs találat
end
end, connection, \"SELECT * FROM tablaneve WHERE username=\'felhasznalo123\'\")
Ennek működnie kellene elvileg nem?
-
dbQuery(function(query)
local query, query_lines = dbPoll(query, 0)
if query_lines > 0 then
-- van találat
else
-- nincs találat
end
end, connection, \"SELECT * FROM tablaneve WHERE username= ?\", felhasznalo123)
Ezt kell akkor. WHERE -> ahol username = ? -> felhasználónév ezt lezárod és megadod hogy milyen username az amit keresel tehát jelen esetben felhasznalo123
De amúgy ez a szelektálás fajta azért is jobb, mert egyszer fut le, majd megáll, ellenben a -1-s értékkel, ami folyamatosan újra és újra fog futni, ameddig nem talál értéket.
Use 0 for an instant response (which may return nil). Use -1 to wait until a result is ready.
[/quote]
Ha elolvasod a wiki-t amúgy és nem csak \"kimásolod\" a szükséges dolgokat, akkor ezekről mind tájékoztatást kapsz mellesleg (ha nem tudsz angolul bemásolod google translateba és azzal is megfogod tudni érteni a dolgokat úgy ahogy).
-
Még mindig nem jó valami sajnos.
Miután ez lefut
dbExec(db_connection, \"INSERT INTO users (username,password,serial,ip) VALUES (?,?,?,?)\", uname, hash(\"md5\", pw), getPlayerSerial(source), getPlayerIP(source))
a dbPollokban a query_lines változó mindig csak 1-et ad vissza, még akkor is ha nem talál 1 sort se.
-
Még mindig nem jó valami sajnos.
Miután ez lefut
dbExec(db_connection, \"INSERT INTO users (username,password,serial,ip) VALUES (?,?,?,?)\", uname, hash(\"md5\", pw), getPlayerSerial(source), getPlayerIP(source))
a dbPollokban a query_lines változó mindig csak 1-et ad vissza, még akkor is ha nem talál 1 sort se.
Hát miután rosszul akarod hozzáadni. Úgy nézz ki nem érted meg, hogy rosszul akarod az argumenteket feltölteni. dbExec a következő képen kell kinézzen:
dbExec(db_connection, \"INSERT INTO users SET username=?, password=?, serial=? , ip=? \", uname, hash(\"md5\", pw), getPlayerSerial(source), getPlayerIP(source))
Nézd meg utána, hogy SQL-be bemegy -e az érték.
-
INSERT INTO users \"SET\" nem jó sqlite-ba csak mysql-ba.
Legalábbis debugscript hibát ad vissza rá. (dbExec failed; near \"SET\": syntax error)
De már megoldottam valahogy. Köszi a segítséged! :D
-
INSERT INTO users \"SET\" nem jó sqlite-ba csak mysql-ba.
Legalábbis debugscript hibát ad vissza rá. (dbExec failed; near \"SET\": syntax error)
De már megoldottam valahogy. Köszi a segítséged! :D
Ja hogy nem mysql-t használsz. Akkor már értem. :D Örülök, hogy tudtam valamennyit segíteni. :) Mellesleg miért sqlite-t használsz? :D
-
Igen azt elfelejtettem mondani mit használok, bocsi. :D
Azt mondták, hogy ha nem szeretném weboldallal összekötni a szervert akkor az sqlite is megfelelő adatok eltárolására.
-
Hát lehetséges, én nem használtam még.
Én szeretem a phpmyadminos vonalat, bár lehet majd kifogok próbálni mást is egyszer.