Beste PHP'ers, Ik heb een kleine query gemaakt voor het laden van speler data (user data), Dit doe ik op de volgende manier:


$res = $db->query("SELECT us.hp, 
						  us.hp_max, 
						  us.energy, 
						  us.energy_max, 
						  us.awake, 
						  us.awake_max, 
						  us.nerve, 
						  us.nerve_max, 
						  us.exp, 
						  us.exp_today, 
						  u.username FROM 
						  sys_users_stats us 
						  JOIN sys_users u 
						  ON us.uid = u.id 
						  WHERE u.id = $userID");
$my = $res->fetch_object();


Mijn vraag is, is deze query juist opgebouwd?

echo '<pre>';
var_dump($my);
echo '</pre>';


Geeft de juiste data weer, alleen ben ik niet helemaal zeker over de query. ( mySQL is niet mijn sterkste punt :P)

Heeft iemand nog tips of een voorbeeld hoe het beter kan?
Gebruik je:
- pdo,
- mysqli,
- mysql,
- mogelijk in combinatie met een eigen databaselaag?

Is $userID gefilterd?

Voordat je een resultaat ophaalt is het misschien beter dat je eerst controleert of er een resultaat is?

Als je maar één resultaat verwacht moet je hier misschien ook expliciet op controleren?

Als je meer pointers wilt, zul je meer to-the-point moeten zijn (meer informatie geven).
Ik gebruik mysqli.

$userID word gefilterd:

$userID = (int)$_SESSION['id'];


Wordt ook gecheckt wanneer de gebruiker inlogt, Als de login naam & wachtwoord voorkomen in de database wordt $_SESSION['id'] geset, en geredirect naar het spel oftewel de pagina's waarvoor je ingelogd moet zijn.

Voordat je een resultaat ophaalt is het misschien beter dat je eerst controleert of er een resultaat is?

Dit doet een functie vooraf in mijn init.php bestand.

function secureSession($uid) {
        global $db;
        
        $res = $db->query("SELECT browser, hostname, lastip FROM sys_users WHERE id = $uid");
        if($res->num_rows == 0) {
            session_destroy();
            session_regenerate_id(TRUE);
            $this->redirect('home');
            exit;
        }
        else {
            $row = $res->fetch_object();
            
            // Empty User ID
            if(empty($_SESSION[AUTH_PARAM])) {
                session_destroy();
                session_regenerate_id(TRUE);
                $this->redirect('home');
                exit;
            }
            
            // Empty IP
            if(empty($_SESSION['ip'])) {
                session_destroy();
                session_regenerate_id(TRUE);
                $this->redirect('home');
                exit;
            }
            
            // Empty Browser
            if(empty($_SESSION['browser'])) {
                session_destroy();
                session_regenerate_id(TRUE);
                $this->redirect('home');
                exit;
            }
            
            // Empty Hostname
            if(empty($_SESSION['hostname'])) {
                session_destroy();
                session_regenerate_id(TRUE);
                $this->redirect('home');
                exit;
            }
            
            if($row->lastip != $_SERVER['REMOTE_ADDR']) {
                session_destroy();
                session_regenerate_id(TRUE);
                $this->redirect('home');
                exit;
            }
            
            if($row->browser != $_SERVER['HTTP_USER_AGENT']) {
                session_destroy();
                session_regenerate_id(TRUE);
                $this->redirect('home');
                exit;
            }
            
            if($row->hostname != @gethostbyaddr($_SERVER['REMOTE_ADDR'])) {
                session_destroy();
                session_regenerate_id(TRUE);
                $this->redirect('home');
                exit;
            }
        }
    }


Misschien is de secureSession($uid) functie niet helemaal de juiste manier, maar gebruik het al tijden zo.

$_SESSION['id'] oftewel $_SESSION[AUTH_PARAM]
$_SESSION['ip']
$_SESSION['hostname']
$_SESSION['browser']

^ worden aangemaakt tijdens het inloggen (als er een resultaat gevonden is)

De data die ik ophaal via deze query is alleen voor de ingelogde gebruiker. Dus verwacht één resultaat.
global $db :(.

(int) is geen filtering, maar een typecast.

Bovenstaande functie kan ook wel wat korter he, maar goed dat was niet je vraag.

---

Ga je nog data wijzigen nadat je deze hebt opgehaald? Dan moet je wellicht een en ander in een transactie zetten.
Data wijzigen is wel de bedoeling ja, Het idee is om er een mafia MMORPG spel van te maken, met verschillende modules/functies.

Korte informatie over de modules/functies:

Crime - Een gebruiker heeft een bepaald aantal 'nerve', Dit kunnen zij gebruiken om misdaden te doen, hebben ze een misdaad voltooid dan gaat er bijv 1 nerve af. En krijgen ze een bepaald aantal EXP of Geld. (Dit wordt dan met een query geüpdatet)

Exp - oftewel experience, Dit wordt gebruikt voor de 'level' van het account. Dit wordt zo berekend:
$my->exp_max = $my->level * 1500;


Is de huidige EXP ($my->exp) hoger of gelijk aan ($my->exp_max) dan gaan ze een level omhoog. (Ook dit wordt geüpdatet via een query)

Hoop dat dit een beetje voldoende informatie is, er zullen verschillende modules/functies komen waardoor de gebruiker zijn of haar account beter kan maken.

Ik eigenlijk wel benieuwd waarom global $db; niet zou mogen
Je moet het zo zien.

Met classes bouw je als het ware aparte afgeschermde delen in je applicatie waarin data / functionaliteit zit die enkel onder bepaalde (speciale) condities toegankelijk is of uitgevoerd mag worden, vergelijk dit met kamers in een gebouw, met deuren en sleutels.

global $x is dan zoiets als met een tank door alle muren heenploegen om bij een bepaalde ruimte te komen.

Je kunt prima een referentie naar je database aan een klasse doorgeven bij de creatie (doorgeefluikjes tussen de ruimtes zonder alle tussenmuren eruit te slopen).

Dit heeft ten minste twee voordelen:
- het zorgt voor een losse koppeling in/tussen je componenten
- je bent niet meer in de globale scope bezig

Het mag wel, maar het is eigenlijk vragen om ongelukken en in OOP "not done", je helpt het hele principe van scopes om zeep met global. Daarnaast is het ook een lelijke hack om jezelf toegang tot functionaliteit te verschaffen.

Het is net als autorijden zonder gordels: het gaat goed zolang het goed gaat. Maar als je ten minste één natuurkundeles over stoot en impuls hebt gevolgd bedenk je je (hopelijk) wel twee keer voordat je zonder gordel rijdt. Aan de andere kant, sommige mensen leren het nooit.

@RJD Gaming; heb je nog een concrete vraag? We kunnen moeilijk aan de hand van een beschrijving van een "crime game" je hele applicatie structureel vormgeven. Dat zul je echt zelf moeten doen.

Mijn ervaring met "mafia MMORPGs" is dat deze meestal nogal brak in elkaar zitten. Als dit je eerste uitstapje in PHP/MySQL is zou ik de lat wat lager leggen.

Reageren