Jump to content
  • Announcements

    • Xmat

      Pravidlo pro postování v TTT

      Do sekce Tipy, triky, tutoriály nepatří žádné dotazy.   Postujte sem vaše návody, tipy a různé další věci jež uznáte za vhodné sdělit zdejšímu osazenstvu, ale veškeré dotazy směřujte do sekce Všeobecná diskuse.
    • Replik

      Seznam návodů a důležitých témat v této sekci

      Pro lepší přehlednost jsem vytvořil tento seznam, který vás, méně zkušené, lépe provede touto sekcí. Věřím, že zde najdete, co hledáte. Vypsané jsou návody, které jsou oficiálně uznané jako návody. Běžné diskuze, které neposkytují postupy a rady zvěřejněny nejsou.   Instalace vlastního MaNGOS Serveru Díky těmto návodům budete (měli by jste být) schopni vytvořit a následně spustit váš vlastní server. Nastavení je pro verze s i bez datadisku.   Instalace MaNGOS Serveru (bez datadisku TBC) - Autor Benny Instalace MaNGOS Serveru (s datadiskem TBC) - Autor Malfik Instalace MaNGOS Serveru v prostředí Linux - Autor charlie Instalace MaNGOS Serveru v prostředí Linux - Autor kupkoid   Chyby a jejich řešení při přihlašování k serveru - Autor Cybe   Zálohování uživatelských dat   Dávkový soubor (BAT soubor) pro vytvoření SQL záloh - Autor Replik   Kompilování - tvoření vlastních release (revizí)   Tvorba kompilací pro Win32 (MangoScript) - Autor bLuma   Ostatní - těžko zařaditelné, ale neznamená to, že nejsou dobré   VIP Systém - Autor charlie Tvorba Webových stránek pro MaNGOS - Autor zahuba Tvorba teleportačních NPC (MangoScript) - Autor Replik Registrační web (původně předělaná SPORA) Funkční pro Antrix i MaNGOS - Autor Replik Nastavení a spuštění Minimanager pro MaNGOS - Autor BlackMartin Nastavení MaNGOS Website - Autor Artorius   Samozřejmě jsou zde i jiné návody, ale tyto jsou nejvíce používané, proto věřím, že vám budou nápomocné. Tuto sekci budeme upravovat podle potřeby. Pokud by jste něco nenašli nebo si nevěděli rady, hledejte na fóru a teprve potom založte vlastní topik. Pokud nějaký autor vytvoří kvalitní návod a chtěl by ho zveřejnit i v tomto seznamu, doporučuji, aby mi napsal zprávu skrze PM.   Díky a přeji hezký den na WoWResource   Replik
    • Aristo

      Příspěvky tam, kde nemají co dělat

      Dodržujte zákaz přispívání do topiků s repaky pokud si to zakladatelé nepřejí!! Opakované psaní příspěvků bude trestáno warnem.
    • Aristo

      Používání spoilerů

      Poslední dobou má většina uživatelů fora zvláštní nutkání postovat extrémně dlouhé texty nebo kódy, které zabírají v nejedenom případu i 80% obsahu celé stránky a hodně tak zvedají nepřehlednost v topiku. Chtěl bych všechny uživatele požádat, aby při postování citací, jakýchkoliv kódů, errorů, atp... delších než 30 řádků používali funkci spoileru.   Funkci vyvoláte příkazem [spoiler] text [/spoiler]   Ukázka:  
Sign in to follow this  
Drahoš

[PHP] SkyFire class

Recommended Posts

Zdravím,

rozhodl jsem se napsat PHP class speciálně pro SkyFire DB. Vše jsem psal já a vše je v OOP. Živá ukázka je http://drahos.nhx.cz/projects/skyfire/. S projektem budu pokračovat a teď je spíš v alpha test verzi. Jestli máte nějaký nápad, sem s ním :).

 

Ke stažení:

Verze 0.9 - all: http://new.sharex.cz/soubor/SkyFireWeb-class-all-4563320696.zip (1.4 MB)

Verze 0.9 - jen SkyFireWeb.class: http://new.sharex.cz/soubor/SkyFireWeb-class-only-9972647629.zip (7.86 kB)

 

Tento class dokáže:

- Registrace, Login, ověření přihlášení a logout

- Server status

- Online info (online hráčů, z hordy, z aliance, procentuálně)

- Počet registrovaných accountů

- Počet vytvořených postav

- Uptime serveru

- Smazat a přejmenovat (s možností nastavení ceny za rename) charakter

- Vypsat charaktery na daném accountu

- Vypsat online hráče

- Honor top - dnes, celkově

- Top played time

- Nejbohatší hráči

- Reset instancí

- Teleportovat hráče

- Konečně podporu i nejnovější PHP verze :)

- a další použitelné funkce ...

 

Použití HonorTopu atd.:

 

 

 <?php
  require_once("SkyFireWeb.class.php");

  $web = new SkyFireWeb;
  $honorTop = $web->HonorTop();

  foreach($honorTop as $player) {
   echo $player['name'];
   echo $player['level'];
   // ... podrobné rozebrání pole máte v "Podrobné rozebrání funkcí:"
  }
 ?>

 

 

 

Podrobné rozebrání funkcí:

 

 

Funkce SkyFireWeb::UserInfo()

 

Očekává: nic

Vrací: pole s informacemi o přihlášeném uživateli

 

Funkce SkyFireWeb::IsLogged()

 

Očekává: nic

Vrací: true = když je přihlášen, false = když není

 

Funkce SkyFireWeb::LogIn()

 

Očekává: nic

Vrací: true = když se povede, false = když ne

Poznámky: Vykreslí login formulář.

 

Funkce SkyFireWeb::LogOut()

 

Očekává: nic

Vrací: true = když je odhlášen, false = když není

Funkce SkyFireWeb::Registration()

 

Očekává: nic

Vrací: true = když se povede, false = když ne

Poznámky: Vykreslí registration formulář.

 

Funkce SkyFireWeb::Protect()

 

Očekává: $security = "user", "admin" (defaultně "user")

Vrací: nic

Poznámky: Ochrání stránku: "user" - jen pro přihlášené uživatele, "admin" - jen pro přihlášené GM

 

Funkce SkyFireWeb::ServerStatus()

 

Očekává: nic

Vrací: true = když je server online, false = když není

Poznámky: adresu a IP serveru si script vybere sám z DB

 

Funkce SkyFireWeb::Online()

 

Očekává: nic

Vrací: pole: online => počet online hráčů, alliance => počet online z alli, horde => počet online z hordy, alliancePercent => aliance procentuálně, hordePercet => horda procentuálně

 

Funkce SkyFireWeb::Accounts()

 

Očekává: nic

Vrací: počet accountů na serveru

 

Funkce SkyFireWeb::Characters()

 

Očekává: nic

Vrací: počet characterů na serveru

 

Funkce SkyFireWeb::Uptime()

 

Očekává: nic

Vrací: pole: d => dní, h => hodin, m => minutm s => sekund od posledního uptime

Funkce SkyFireWeb::IsOnline()

 

Očekává: $id = id accountu, guid postavy, $type = "account" - účet, "character" - postava (defaultně "character")

Vrací: true = když je online, false = když není

 

Funkce SkyFireWeb::ChracterInfo()

 

Očekává: $guid = guid postavy

Vrací: pole s info o postavě, false = když postava neexistuje

Funkce SkyFireWeb::CharacterDelete()

 

Očekává: $guid = guid postavy

Vrací: true = když smaže, false = když ne

 

Funkce SkyFireWeb::CharacterRename()

 

Očekává: $guid = guid postavy

Vrací: true = když přejmenuje, false = když ne

 

Funkce SkyFireWeb::GetPlayers()

 

Očekává: $justOnline = jen online true/false (defaultně false), $accountID = id accountu, 0 = když nechceme vypisovat chary z acc (defaultně: 0)

Vrací: pole: 1 => array(guid = > guid, name => jmeno, race => id rasy, class => id classu, level => level, gender => id pohlaví, online => 0-off, 1-on, money => peníze, map => id mapy, zone => id zony, latency => latence)

 

Funkce SkyFireWeb::HonorTop()

 

Očekává: $showPlayers = počet zobrazených hráčů, $justToday = jen za dnešek true/false (defaultně: false)

Vrací: pole: 1 => array(guid = > guid, name => jmeno, race => id rasy, class => id classu, level => level, gender => id pohlaví, online => 0-off, 1-on, money => peníze)

 

Funkce SkyFireWeb::MostMoney()

 

Očekává: $showPlayers = počet zobrazených hráčů

Vrací: pole: 1 => array(guid = > guid, name => jmeno, race => id rasy, class => id classu, level => level, gender => id pohlaví, online => 0-off, 1-on, money => peníze)

 

Funkce SkyFireWeb::ResetInstance()

 

Očekává: $guid = guid characteru

Vrací: false = když se nepovede resetovat, true = když ano

Funkce SkyFireWeb::Teleporter()

 

Očekává: $guid = guid characteru, $where = místo, kam teleportovat ("stormwind", "ironforge", "darnassus", "exodar", "orgrimmar", "thunder_bluff", "undercity", "silvermoon", "dalaran"), $fromInstance = povolit port z instance true/false (defaultně: false), $toOtherSide = povolit do zón jiné frakce (defaultně: false)

Vrací: treu = když se teleportuje, false = když ne

 

 

 

Pokud jste našli nějakou chybu, tak mi ji prosím napište. Děkuji.

Edited by Drahoš
  • Upvote 3

Share this post


Link to post
Share on other sites

Tak už viem čo si robil.

 

Je to veľmy užitočné, hodí sa to viacerým uživateľom.Pekné +1

Share this post


Link to post
Share on other sites

Jako vždy bych měl pár připomínek :)

  • Když už máš napsanou třídu pro mysql, měl bys ji tam plně využívat a ne míchat s mysql_* funkcemi (aspoň podle mého názoru)
  • fce mysql_db_query je od PHP 5.3.0 zavrhnuta (deprecated), nedoporučuji používat, navíc ji v několika případech používáš zbytečně
  • fce eregi je taky deprecated
  • fce SkyFireWeb::CharacterRename přebírá jako argument zcela zbytečně $account (guid je unikátní identifikátor postavy, nebude tam 2x)
  • fce mysql_result nevrací int, přesto tam někde máš něco jako if(mysql_result > 0), tady by se měla použít fce mysql_num_rows
  • Znalost názvu databáze world je v mysql třídě zcela zbytečná, nikde ve scriptu se nevyužívá
  • fce MySQL::ShowError by podle mě neměla vůbec nic vracet (má přece podle názvu jen něco zobrazit, ne?)
  • fce MySQL::connect zcela zbytečně vrací spojení
  • údaje k databázi by se měly zásadně zadávat z vnějšku, ne uvnitř třídy
  • znalost jména, hesla a hostitele databáze je pro třídu MySQL zcela neužitečná
  • SkyFireWeb::redirect - provádět přesměrování tagem meta jinde než v hlavičče je nevalidní a nemělo by se to dělat, na to se používá header (a musíš zajistit, aby byl v případě potřeby volán jako první)
  • SkyFireWeb::GetSide - když uz nic jiného, využíj konstrukce default: (ještě lepší by bylo využít fce in_array)

 

Nakonec, kdyby chtěl tuto třídu někdo využít samostatně (bez css a toho, co k ní přidáváš), nezdá se mi moc dobře napsaná, protože jsou v ní výpisy různých věcí do HTML značek a vůbec výpisy do stránky. Tohle by měla obstarávat až sama stránka, která třidu využívá, třída by měla použít třeba dobře srozumitelné návratové kódy definované třeba třídními konstantami.

 

Připomínek by bylo nejspíš víc, toto byl zběžný průlet kódem, ale asi to shrnu tím, že celou třídu trochu přepíšu, až bude čas, protože vypisovat se mi všechno to opravdu nechce.

Edited by brseker

Share this post


Link to post
Share on other sites

Ok, děkuji za připomínky :). Určitě to přepíšu a máš pravdu, že by tam mělo být míň toho HTML, ale napsal sem to ve dou dnech...

Ohledně toho mysql_result: Používám to takto => $pocet = mysql_result(mysql_query("SELECT COUNT(guid) ... blablabla"), 0); takže to vrátí číslo typu int ;). Nad tim redirectem jsem už přemýšlel, ale ten header by musel být nad hlavičkou a to se mi nechtělo řešit. To určitě napravím. SkyFireWeb::CharacterRename přebírá $account pro ochranu, aby jsi nemohl přejmenovat postavu na jiném acccountu. A nakonec SkyFireWeb::GetSide -> to máš pravdu, měl by tam být default, kdyby náhodou.

 

Mimochodem @Dejvor: děkuji

Edited by Drahoš

Share this post


Link to post
Share on other sites

Problém je, že mysql_result nevrací int dokonce ani když napíšeš $totojeint = mysql_result(). Vrací to myslím pole, ale PHP to v tom porovnání hezky přetypuje na číslo, proto ti to funguje (v PHP se totiž stejně na datové typy moc "nehraje", takže ta konstrukce není špatně, ale šlo by to napsat lépe no)...

SkyFireWeb::CharacterRename - Zkus pochopit, že guid (Global Unique IDentifier) je jedinečný identifikátor postavy ne na účtu, ale v databázi, více postav nemůže mít různé guid.

Edit: nic ve zlým, jestli to tak vyznělo.

Edited by brseker

Share this post


Link to post
Share on other sites

No tak tedy ten mysql_result přepíšu no :-), ale to mysql_result vrací int pokud to použiješ v tomhle znění: mysql_result(prikaz, 0), kde 0 představuje index pole. Kdyby to vracelo pole, PHP si to nepřepíše automaticky, prostě vyhodí Array(); ;). A já to chápu, že guid je jen jedno, ale když tomu uživatel zadá do GET guid jiné postavy, mohl by mu změnit jméno... to account ID je přiděleno systémem, kdežto guid je GET, jak už sem říkal. Ale šlo by to přečíst rovou v té funkci ...

Edit: Ve zly? Ne prosimtě, já sem rád, že mi to komentuješ ;).

Edited by Drahoš

Share this post


Link to post
Share on other sites

S tim $account mas pravdu, ja jsem se totiž nedíval, odkud se to získává, ale tohle by taky měla ošetřovat aplikace, ne třída.

Share this post


Link to post
Share on other sites

S tim $account mas pravdu, ja jsem se totiž nedíval, odkud se to získává, ale tohle by taky měla ošetřovat aplikace, ne třída.

 

V tom případě je to správně, nebo sem tě špatně pochopil. Teďka to account ID přiděluje aplikace ... $web->CharacterRename($guid, $new, $ui['id']);

Share this post


Link to post
Share on other sites

pekne moc .. jen bych potreboval poradit co mi ukazuje v server info

 

 

Deprecated: Function mysql_db_query() is deprecated in C:\xampp\htdocs\SkyFireWeb.class.php on line 406

 

Deprecated: mysql_db_query() [

function.mysql-db-query

]: This function is deprecated; use mysql_query() instead in C:\xampp\htdocs\SkyFireWeb.class.php on line 406

 

 

poradite mi co je spatne ?

Share this post


Link to post
Share on other sites

pekne moc .. jen bych potreboval poradit co mi ukazuje v server info

 

 

Deprecated: Function mysql_db_query() is deprecated in C:\xampp\htdocs\SkyFireWeb.class.php on line 406

 

Deprecated: mysql_db_query() [

function.mysql-db-query

]: This function is deprecated; use mysql_query() instead in C:\xampp\htdocs\SkyFireWeb.class.php on line 406

 

 

poradite mi co je spatne ?

 

Máš na serveru PHP 5.3 co? U tebe nic špatně není, já sem to napsal špatně... Tyhle funkce už nejsou podporovany v tyhle verzi PHP (btw. dik bersekr). Musim to přepsat a omlouvám se za to, mám na hostignu starší verzi PHPčka...

Share this post


Link to post
Share on other sites

[*]fce mysql_result nevrací int, přesto tam někde máš něco jako if(mysql_result > 0), tady by se měla použít fce mysql_num_rows

 

Blbost, mysql_result vrací hodnotu sloupečku z výsledku a je to tam vždy použito v dotazu typu SELECT COUNT(), takže to dává smysl a používat mysql_num_rows je neefektivní, pokud nás zajímá jen počet výsledků a ne jejich hodnoty.

 

Jinak taky mám připomínky:

Metody GetSide, expansion, ... Nahradit vyhledáním v poli. Zpřehledníš tím kód.

session_register, session_is_registerer používáš naprosto nesprávně. Buď použij _SESSION proměnnou nebo tyto funkce, ale nemíchej to. Tyto funkce jsou navíc deprecated.

Uchovávání údajů pro přístup do db je bezpečnostní riziko, ty údaje se mají zničit ihned po připojení. Označit ty proměnné navíc za public je další hazard.

Mysql::query - dotaz je dotaz a ne připojení do db. Tuhle blbost dělá spousta lidí. Připojení na tomhle místě nemá co dělat.

V logoutu rušíš cookies, které jsi nikdy předtím nepoužil a tedy u klienta neexistují.

Na některých místech počítáš hash hesla až po escapování uživatelského jména, ale to je špatný postup operací.

Share this post


Link to post
Share on other sites

@bLuma: Ty switche plánuji přepsat na pole, máš pravdu, bude to přehlednější. Ohledně těch sessions, díky za upozornění a co se těch údajů do DB týče, budou mimo class a budu je hned po připojení do DB unsetovat ;-). To mazání COOKIES je jen v případě, že nastavíte $clearcookies na true. Připravil jsem si to tam na další verzi toho classu, kde COOKIES budu možná využívat.

 

Edit: Mysql::query - díky za upozornění, ani jsem si toho nevšim, že sem to tam napsal :).

Edited by Drahoš

Share this post


Link to post
Share on other sites

Tak je tu nová verze ke stažení. Prosím, neberte to jako PostHount nebo tak, chci jen znát Vaše názory ;).

Share this post


Link to post
Share on other sites

Stáhnul jsem novou verzi z prvního příspěvku a zde je pár postřehů při velice zběžném projití src (nespouštěno a netestováno)

 

SkyFireWeb.class.php

- class MySQL

- privátní proměné address, user a pass nemají v této třídě vůbec co dělat

- public realmlistID a characterRename porušení zapouzdření a viz 1

 

- ShowError() - měla by vracet pouze error

- connect() - encoding by měl jít předávat parametrem a error by se měl volat buďto jinde, nebo vyhodit výjimku, dbHandler by se neměl vracet, ale třída by si jej měla nastavit jako vnitřní stav

- query() - neošetřuješ, když ti query nic nevrátí, ikdyž bys to čekal

 

- class SkyFireWeb nemá vůbec co dědit třídu MySQL, s čím bych se smířil je to, že bude mít instanci třídy MySQL

- CheckMail() - místo eregi (DEPRECATED) používej preg_match, Case sensitivitu vyřešíš úpravem regulárního výrazu na A-z

- jak již bylo zmíněno redirect() pouze v hlavičce, lepší volat header, ikdybys měl bufferovat výstup

- pole races, expansions, genders, classes, map, zone bych možná dal jako privátní vlastnosti třídy (lepší přístup, editace na jednom místě)

- GetMoneyString() by opět měl vracet spíš pole a výstup z něj udělat až kde je potřeba, takhle je ta metoda značně jednoúčelová

- nevidím důvod proč v SESSIONS držet uživatelské heslo

- LogIn() opět neuniverzální metoda kvůli formu, jež obsahuje, metoda by měla dělat jen to, k čemu je určená, tzn pomocí parametrů získat jméno a heslo a provést přihlášení, tzn vracet třeba bool, ale ne vypisování formulářů, zachytávání requestů..

- dále jaksi nevidím důvod proč z account vybírat username a sha_pass_hash kvůli ověřování, id accountu ti nestačí?

- Registration() to samé

- ServerStatus() v selectu vybíráš vše, přitom potřebuješ jen address a port

- Online() by šlo řešit šikovnějším dotazem/dvěma..

- Acounts(), Characters() by chtělo lépe pojmenovat, přidat aspoň slovíčko count, ať je na první pohled jasné, co dělají

- IsOnline() zbytečné parametry, buď jen jméno charakteru, což musí být unique, nebo rovnou uid charu

- CharacterDelete() ti defacto stačí jen jedna podmínka, jinak máš nekonzistentní db

- CharacterRename() neověřuješ, jestli už takové jméno někdo nemá

- GetPlayers() - defaultní parametr (justOnline) nemá smysl, pokud má zpráva další..

- HonorTop() - mícháš mysql_query ikdyž na to máš vlastní třídu, neověřuješ showPlayers, v query neošetřené ač v klauzoli limit!

- MostMoney(), PlayedTime() - to samé

- ResetInstance - opět kombinace mysql_* a tvojí třídy

 

Koukám narazil jsme na limit řádků, takže prozatím stačí :)

Edited by Filgron

Share this post


Link to post
Share on other sites

  while(list($guid, $name, $race, $class, $level, $gender, $online, $money, $map, $zone, $latency) = mysql_fetch_row($query)) {
  $output[$count]['guid'] = $guid;
  $output[$count]['name'] = $name;
  $output[$count]['race'] = $race;
  $output[$count]['class'] = $class;
  $output[$count]['level'] = $level;
  $output[$count]['gender'] = $gender;
  $output[$count]['online'] = $online;
  $output[$count]['money'] = $money;
  $output[$count]['map'] = $map;
  $output[$count]['zone'] = $zone;
  $output[$count]['latency'] = $latency;
  $count++;
 }

porovnej s

while($row = mysql_fetch_assoc($query)) {
   $output[] = $row;
}

Edited by bLuma

Share this post


Link to post
Share on other sites

Děkuji Vám za připomínky. To s tim polem mě ani nenapadlo :). Až budu mít zase někdy čas, podivám se na to a upravím ten class ;). Momentálně bohužel moc času nemám :(.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

×