Autor Zpráva
ann
Profil *
Zdravím
zkouším si udělat z zájmu učení jak by mohl vypadat asi tak script na level a expy v php
zatím to je ok,ale mám tu jeden problém kterej už opravdu nevím
v db mám
users (tam mám aktualní kolik má zkušeností(exp))
exp(tam mám vypsaný lvl->exp)
takže tam mám
lvl exp
1   500
2   700
3   900
4   1300

Do lvl 3 mě to všechno jde,ale pokud si nastavím expu víc jak 1000 tak mě to vypíše že mám lvl 1.
jak je to možný?
Script má vlastně jenom porovnávat.
pokud mám expu 500 tak si v tabulce exp najde sloupec exp,a porovná ho že bud se rovná nebo je menší.
potom vypíšu jen kolik má lvl kterej je ve stejným řádku jako porovnaný exp (ID,LVL,EXP)
script je tady
          $query = DB::queryOne('SELECT *
                                   FROM users
                                   INNER JOIN exp
                                    ON users.exp >= exp.exp
                                   WHERE users.username = ?',array($name));//name je proměnná kde mám jméno v db
        return $query ;
funkce queryOne - Spustí dotaz a vrátí z něj první řádek
Micruss
Profil
Zkoušel jsi tam přihodit do Where exp.lvl = (user-level)...?
juriad
Profil
Je to z důvodu toho, že dotaz vrací víc řádků v náhodném pořádí a občas to prostě vyjde.

Dotaz byl blbě, zkusím to ještě jednou v [#5].

Můžeš si poddotazem najít největší level takový, že je na něj třeba méně expů; takový bude maximálně jeden.
ann
Profil *
juriad:
Zdravím,díky za raekci.
Nějak jsem nepochopil váš script.
co znamená l.level? to má být z databáze exp lvl?
a proč nakonci left join je jednička?


nebo co je efektivnější?
nechat tam jen expy,a v php pak pomocí podmínek podle expu vyhodnocovat level?nebo je to tak jak to mám ted přes db lepší?
co jsem koukal na netu tak tam to většina dělá přes podmínky dle expu uložených v databázi...
juriad
Profil
ann:
O efektivitu se nestarej. Nebudeš mít tolik uživatelů, aby na výkonu záleželo a až je budeš mít, tak budeš mít prostředky celou aplikaci přepsat pořádně.

Klidně bych tu informaci nechal v databázi, ale provedl bych změny:
- tabulku exp přejmenovat na levels
- změnit logiku záznamů - číslo u levelu znamená minimalní nutný počet expů
Tedy tabulka bude vypadat:
levels:
lvl exp
1   0
2   500
3   700
4   900
5   1300

Pak je vlastně úloha: najdi maximální číslo takového levelu, že počet expů, které má uživatel je menší nebo rovno.
Pokud bys měl jen podmínku na nerovnost, měl by uživatel level třeba 3, ale i 2 a 1. Tedy chceš nejvyšší takový.
SELECT MAX(lvl) AS level FROM levels WHERE exp <= $user_exp
Tento dotaz řeší tu úlohu. Pro počet expů, který zadáš, vrátí číslo levelu. Vrátí vždy (proto je tam ten záznam 0 1).
OK?

Teď to propojit s uživatelem.
Ukázka na http://sqlfiddle.com/#!2/bf2545/7. Přidáš ten předchozí dotaz jako poddotaz (do závorek).
Pozor na to, že tento dotaz není úplně vhodný na výpis velkého množství uživatelů (to se pak řeší trochu jinak).
ann
Profil *
juriad:
jasný,už to chápu..
ps: já to nemám tak že bych opravdu chtěl dělat hru,já to mám opravdu jen pro učení,jelikož se momentálně doučuju klasický php a začínám s oop tak se chci trochu posunout i na jiné věci :)
Jinač děkuju moc za radu a vysvětlení,pomohlo.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: