Szerző Téma: Random kérdéssor MySql-bõl  (Megtekintve 2247 alkalommal)

Random kérdéssor MySql-bõl
« Dátum: 2013. július 30. - 16:37:59 »
0 Show voters
Azzal a kéréssel fordulok hozzátok, hogy sajnos nem igazán értek a MySql-hez, ezért szeretném a segítségeteket kérni.
Lényeg a lényeg, hogy van MySql-ben egy nagy halom kérdés, 3 válaszlehetõség, valamit a helyes válasz száma. Afféle RP kérdéssor induláskor. Nos a lényeg, hogy le kéne kérnem az adatbázisból mondjuk 20-at random (esetleg többet, és ha lehet ne legyen többször ugyan az egy kérdéssoron belül), aztán kiíratnom. A kiíratást textdraw-ba terveztem. Majd pedig eldönteni, hogy melyik a helyes. De ezt már megoldom, csak a lekérdezéssel és annak kiíratásával van gondom.
Azon gondolkoztam, hogy egyszerre lekérdezni, majd változóba rakni lenne a helyes, vagy pedig egyenként.
A segítségeteket elõre is köszönöm :)

Random kérdéssor MySql-bõl
« Válasz #1 Dátum: 2013. július 30. - 19:37:02 »
+1 Show voters
SELECT * FROM `tablename` ORDER BY RAND() LIMIT 20

Random kérdéssor MySql-bõl
« Válasz #2 Dátum: 2013. július 30. - 20:36:08 »
0 Show voters
Köszönöm, bár így sem teljesen tiszta még :)
Ha mondjuk van olyan a \"kerdesek\" táblában, hogy: \"id\",\"val1\", \"val2\", \"val3\",\"helyes\" akkor azt hogy kell kiíratni? Egy ilyen sql lekérdezés körülbelül hány karaktert kezel? Valamint ha textdraw-ba akarom õket kiíratni, akkor az ékezeteket hogy oldom meg?.
Köszi a segítséget elõre.
« Utoljára szerkesztve: 2013. július 30. - 20:41:04 írta Dexter95 »

Random kérdéssor MySql-bõl
« Válasz #3 Dátum: 2013. július 30. - 20:46:01 »
0 Show voters
A fenti sor véletlenszerûen visszatér 20 darab sorral (ha van annyi a táblán).
Ez azt jelenti hogy 20 darab sort a benne lévõ összes adattal visszaküldi (SELECt *), tehát mint a példádban:
d\",\"val1\", \"val2\", \"val3\",\"helyes\"
d\",\"val1\", \"val2\", \"val3\",\"helyes\"
d\",\"val1\", \"val2\", \"val3\",\"helyes\"
d\",\"val1\", \"val2\", \"val3\",\"helyes\"
..
d\",\"val1\", \"val2\", \"val3\",\"helyes\"
20 darab sor.
Ezt neked kell feldarabolni részekre, mondjuk sscanf vagy cache funkciókkal részekre osztva majd tárolva különbözõ változókba.
Edit:
Milyen plugin verziót használsz, mert én már a thread verziót alkalmazom, így arra tudok példát írni.
Az ékezetekhez keress valami olyant hogy \"fixchars.inc\".
Nem tudom hány karaktert kezel de én ~3900-at már kértem le gond nélkül.
« Utoljára szerkesztve: 2013. július 30. - 20:49:52 írta ɐʞzssǝlosz »

Random kérdéssor MySql-bõl
« Válasz #4 Dátum: 2013. július 31. - 09:26:37 »
0 Show voters
Jelenleg nem használok semmilyen MySQL plugint, szóval ha a tiedre tudnál egy példát írni, azt megköszönném.

Random kérdéssor MySql-bõl
« Válasz #5 Dátum: 2013. július 31. - 12:55:52 »
0 Show voters
Akkor elég érdekes kéréssel álltál elõ ha nem használsz semmilyen mysql plugint, bérelt sa-mp szervered legalább van (host-os)?
Jár mellé mysql adatbázis?
Létre van már hozva a tábla szerkezet, bennük az adatokkal?
Ha nincs ezekkel kellene kezdened.
Kapcsolatot kellene teremtened egy adatbázissal (mysql) (amit persze létre is kell hozni), a sa-mp szervereddel ehhez elengedhetetlen egy mysql plugin használata (jelenleg).
Ha ezt sikerül létrehoznod akkor kezdhetsz ilyen dolgokkal foglalkozni. (adatlekérés, adatfrissítés, új adatsor létrehozása stb)

Random kérdéssor MySql-bõl
« Válasz #6 Dátum: 2013. július 31. - 13:09:57 »
0 Show voters
Eddig még nem használtam MySQL-t samp-ban. Nincs bérelt szerverem, nem is azért kell, van nekem itthon sajátom nem is egy, ha kell belövök egyet  Debian server-el, de egyenlõre még csak a saját gépemen szeretném futtatni uniform server-el. Szóval a szerver adott, tábla struktúra kész, és adatokkal is fel van töltve. Nem vagyok Én elveszett, csak PHP programozó. Ha kell rakok plugint is be, csak azt nem tudom, hogy melyik lehet a jó, és Te mondtad, hogy a sajátodhoz tudsz példát írni, gondoltam akkor majd azt rakom be. A PAWN-val nem régen ismerkedtem meg, ezért kicsit nehézkes a dolog.
Köszi.

Random kérdéssor MySql-bõl
« Válasz #7 Dátum: 2013. július 31. - 21:15:22 »
0 Show voters
Nem okoskodásként de ez így szerintem visszatérhet azonos kérdésekkel, ha pont véletlen ugyanazok a számok sorsolódnak ki.
Így 100% hogy nem lesz két egyforma:
 
SELECT DISTINCT * FROM `tablename` ORDER BY RAND() LIMIT 20

Random kérdéssor MySql-bõl
« Válasz #8 Dátum: 2013. július 31. - 21:30:29 »
+1 Show voters
Idézetet írta: hegdavid95 date=1375298122\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"40641\" data-ipsquote-contentclass=\"forums_Topic
Nem okoskodásként de ez így szerintem visszatérhet azonos kérdésekkel, ha pont véletlen ugyanazok a számok sorsolódnak ki.
Így 100% hogy nem lesz két egyforma:
 
SELECT DISTINCT * FROM `tablename` ORDER BY RAND() LIMIT 20

 

Sose volt egyforma tudomásom szerint, de utána fogok nézni.
Mivel pontosan azért lassú ez a fajta rand lehetõség mysql-ben mert az egész adattábla adatait véletlenszerûen elrendezi és úgy térne vissza az összes sorral, de csak 20 sor adattal tér vissza mert limitnek ennyi van megadva, talán ha kevesebb adatsor van benne mint a limit akkor lenne benne egyezés de még akkor se hiszem.
@Dexter95
Jó akkor le kellene szedned egy mysql plugint, és installálnod kellene a samp szerveredhez (csak be kell másolni a megfelelõ helyre9 de mivel linux pár verziót lehet le kell töltened hogy valamelyiket gond nélkül betöltse a sa-mp szervered.
http://forum.sa-mp.com/showthread.php?t=56564
https://code.google.com/p/sa-mp-mysql-plugin/
Ui.:
A pawn kódot meg megírom lehet még ma este, de csak beolvasás részt.
Edit:
OnGameModeInit alá vagy OnFilterScriptInit alá:
 
new
Mod_CH;
Mod_CH = mysql_connect(.......); // Ide be kell írni a csatlakozási adatokat, phpmyadminon látnod kell ÁLLAPOT FOLYAMATOK-nál a csatlakozott állapotot ha fut a szervered, persze a sa-mp szerver is írni fogja több helyen is ha beleírod de mysql_log.txt fájl biztosan jelzi. (sa-mp szervered mellett fogod találni a plugin hozza létre)
// Jelenleg sajnos csak egy csatlakozással mûködik a mysql plugin de most kicsit nagyon bezavarták a native kódokat, a plugin-t fejlesztik remélhetõleg jelenleg is, ezért nem árt vissza vissza nézni újabb verzióért.

 
Ahol meghívásra kerül a dolog oda kell ezt írni:
 
mysql_tquery(Mod_CH, \"SELECT * FROM `tablename` ORDER BY RAND() LIMIT 20\", \"THREAD_loadranddata\", \"\", \"\"); // olyan kérés mely egy új visszatérésbe küldi az adatokat (több szálon futó program ha a processzor magok száma lehetõvé teszi (kevesebb lagg meg bla bla bla ) meg kell szokni a használatát. :D

 

forward THREAD_loadranddata(); // Thread több szálon futó visszahívás mely nem laggoltatja a szervert, háttérben fut, ha készen vannak az adatok akkor kerül meghívásra ez a visszahívás
public THREAD_loadranddata()
{
new
rows,
fields;
cache_get_data(rows, fields, Mod_CH); // sorok illetve mezõk számának lekérése
 
new
ID,
str1[32], // Kérdés tárolása (karakterlánc (31 + NULL karakter) persze növelni kell ha több az adatbázisban
str2[32],
str3[32],
megoldas;
if(rows) // Van-e adatsor?
{
for(new i; i < rows; i++) // végig megyünk az összes visszatért adatsoron
{
   // ID = cache_get_row_int(i, 0, Mod_CH);  // Ha kell egyáltalán.
   cache_get_row(i, 1, str1, Mod_CH, 32);   // (i)sor , (1)mezõ (gondolom elsõ kérdés mezõszáma a második mezõ lehet, az elsõ mezõszám a mysql id), (str1)változó a kérdésnek, (Mod_CH)csatlakozás azonosító, (32)változó mérete
   cache_get_row(i, 2, str2, Mod_CH, 32);
   cache_get_row(i, 3, str3, Mod_CH, 32); // Figyelni kell hogy létezzen is mysql-ben mezõ 3-dik (vagy negyedik vagy több), ha nincs, szerver összeomlás is lehet.
   megoldas = cache_get_row_int(i, 4, Mod_CH);
   //persze lehet másképp is:
   // cache_get_field_content(i, \"kerdes1\", str1, Mod_CH, 32);
   // cache_get_field_content(i, \"kerdes2\", str2, Mod_CH, 32);
   // cache_get_field_content(i, \"kerdes3\", str3, Mod_CH, 32);
   // megoldas = cache_get_field_content_int(i, \"valasz\", Mod_CH);
   printf(\"%d | %s | %s | %s | %d\", ID, str1, str2, str2, megoldas);
}
} else print(\"nincs adatsor !!!!\");
return 1;
}
« Utoljára szerkesztve: 2013. augusztus 03. - 09:41:55 írta ɐʞzssǝlosz »

Random kérdéssor MySql-bõl
« Válasz #9 Dátum: 2013. augusztus 03. - 00:38:41 »
0 Show voters
Kipróbáltam, de sajna nem mûködik. valamiért nem jó a lekérdezés, mert kivágja, hogy nincs adatsor.
Becsatlakozik egyébként MySQL-re, és a tábla is a helyén van. A lekérdezés nem dolgozik valamiért.
LOG:
 
[00:35:44] [ERROR] \"mysql_tquery\" - invalid connection handle. (ID = 0).
[00:35:44] [ERROR] \"cache_get_data\" - invalid connection handle. (ID = 0).

Random kérdéssor MySql-bõl
« Válasz #10 Dátum: 2013. augusztus 03. - 09:37:14 »
0 Show voters
A többi mysql log adatot is másold be, nálam a csatlakozás azonosító:
 
[09:29:45] [DEBUG] mysql_tquery - connection handle: 1
[/quote]
Így valószínû hogy valami csatlakozási probléma lehet.
De az is lehet hogy ez is valami bug a mysql pluginnál mivel nagyon kezd szét esni a project. :D
A változónál amelyik a csatlakozás azonosítót tárolja adj meg neki 1 értéket alapból, mintha csatlakozva lenne:
 
new Mod_CH = 1;
« Utoljára szerkesztve: 2013. augusztus 03. - 09:41:27 írta ɐʞzssǝlosz »

Random kérdéssor MySql-bõl
« Válasz #11 Dátum: 2013. augusztus 03. - 11:22:40 »
0 Show voters
más nem volt a log-ban, viszont most, hogy az érték 1, mintha csatlakozva lenne. Hát..
 
[11:21:04] [WARNING] cache_get_data - no active cache
[11:21:04] [ERROR] cache_get_row_int - invalid data type
[11:21:04] [ERROR] cache_get_row_int - invalid data type
[11:21:04] [ERROR] cache_get_row_int - invalid data type
[11:21:04] [ERROR] cache_get_row_int - invalid data type
[11:21:04] [ERROR] cache_get_row_int - invalid data type
[11:21:04] [ERROR] cache_get_row_int - invalid data type
[11:21:04] [ERROR] cache_get_row_int - invalid data type
[11:21:04] [ERROR] cache_get_row_int - invalid data type
[11:21:04] [ERROR] cache_get_row_int - invalid data type
[11:21:04] [ERROR] cache_get_row_int - invalid data type
[11:21:04] [ERROR] cache_get_row_int - invalid data type
[11:21:04] [ERROR] cache_get_row_int - invalid data type
[11:21:04] [ERROR] cache_get_row_int - invalid data type
[11:21:04] [ERROR] cache_get_row_int - invalid data type
[11:21:04] [ERROR] cache_get_row_int - invalid data type
[11:21:04] [ERROR] cache_get_row_int - invalid data type
[11:21:04] [ERROR] cache_get_row_int - invalid data type
[11:21:04] [ERROR] cache_get_row_int - invalid data type
[11:21:04] [ERROR] cache_get_row_int - invalid data type
[11:21:04] [ERROR] cache_get_row_int - invalid data type

 

Dupla hozzászólás automatikusan összefûzve. ( 2013. augusztus 03. - 11:55:27 )

Szerk.: A cache_get_row_int-t elnéztem, és kijavítottam.
a cache_get_data - no active cache, az marad. Valami a lekéréssel rossz, mivel phpmyadmin-ba is látom,hogy becsatlakozik, log-ban sincs hiba.
« Utoljára szerkesztve: 2013. augusztus 03. - 11:55:27 írta Dexter95 »

Random kérdéssor MySql-bõl
« Válasz #12 Dátum: 2013. augusztus 03. - 21:07:17 »
0 Show voters
Ahogy írja ezt a hibát úgy bemásolnád a pawn kódod?
Úgy talán ha én is kitudom próbálni vagy ha látnám akkor tudnám mondani mi a hiba.
De biztosra veszem hogy csatlakozási hiba lehet, mert annak nem így kellene mûködnie hogy megadod az 1-es értéket, hanem a csatlakozás azonosítót kellene vissza adnia a mysql_connect-nek, valószínûleg emiatt írja hogy nincs aktív adat tárolva.
Még a mysql_connect után írd be ezt hátha kidob valami hasznos információt:
 
mysql_log(LOG_ERROR | LOG_WARNING | LOG_DEBUG);

Random kérdéssor MySql-bõl
« Válasz #13 Dátum: 2013. augusztus 03. - 22:35:32 »
0 Show voters
Most nem vagyok sajnos otthon, de majd bemásolom. Phpmyadmin irja hogy csatlakoztatva.

Dupla hozzászólás automatikusan összefûzve. ( 2013. augusztus 05. - 14:37:54 )

Mûködik, köszönöm szépen. Én voltam a figyelmetlen, mivel le is írtad nekem, hogy a lekérést kell meghívni, én pedig meghívtam a lekérést, utána pedig a callback-et is külön, holott azt a lekérés hívja meg. Utána pedig többdimenziós változóban tároltam el az adatokat. Még egyszer köszönöm a segítséget, megy a + :).
Szép napot.
« Utoljára szerkesztve: 2013. augusztus 05. - 14:37:54 írta Dexter95 »

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal