10-08-2013, 04:19 PM
(Modification du message : 10-08-2013, 04:21 PM par Sephi-Chan.)
Tu dois tout contrôler. Ce n'est pas si coûteux que ça. Un serveur SQL peut faire plein de choses très vite. Il ne faut pas avoir peur de faire des requêtes.
Le bon nombre de requêtes SQL par page, c'est le nombre de requête SQL dont tu as besoin pour faire ton traitement. Le nombre importe moins que la complexité des requêtes. Une requête du type
Ces chiffres sont totalement empiriques, mais une page d'affichage peut bien produire une dizaine de requête SQL, et une page d'action (appelée moins souvent et qui va modifier des choses) peut bien faire une trentaine de requêtes : ça ne pose généralement aucun problème.
Après, il faut le faire intelligemment. Ici, tu as au moins besoin de deux requêtes : une pour aller chercher le niveau du joueur courant (et donc le nombre de lignes autorisées). Je suppose que tu fais déjà cette requête sur toutes les pages pour avoir les informations du joueur courant.
Ensuite, pour les divisions autorisées, tu n'as pas besoin de faire une requête par division, tu peux faire une requête qui sélectionne les IDs des divisions du joueur. Un
Et une fois que tu as ces identifiants, tu peux les comparer à ceux données par l'utilisateur :
Si le joueur a mis l'ID d'une division qu'il ne possède pas (disons que
Le bon nombre de requêtes SQL par page, c'est le nombre de requête SQL dont tu as besoin pour faire ton traitement. Le nombre importe moins que la complexité des requêtes. Une requête du type
SELECT * WHERE id = X;
est très rapide (si la colonne requêtée est indexée).Ces chiffres sont totalement empiriques, mais une page d'affichage peut bien produire une dizaine de requête SQL, et une page d'action (appelée moins souvent et qui va modifier des choses) peut bien faire une trentaine de requêtes : ça ne pose généralement aucun problème.
Après, il faut le faire intelligemment. Ici, tu as au moins besoin de deux requêtes : une pour aller chercher le niveau du joueur courant (et donc le nombre de lignes autorisées). Je suppose que tu fais déjà cette requête sur toutes les pages pour avoir les informations du joueur courant.
Ensuite, pour les divisions autorisées, tu n'as pas besoin de faire une requête par division, tu peux faire une requête qui sélectionne les IDs des divisions du joueur. Un
SELECT id FROM divisions WHERE player_id = X;
n'est pas très coûteux.Et une fois que tu as ces identifiants, tu peux les comparer à ceux données par l'utilisateur :
$selected_ids = array(1, 2); // Le tableau bien filtré qu'on a créé tout à l'heure.
$allowed_ids = array(1, 2, 3); // Ce qui te vient de la requête SQL mentionnée plus haut.
$union = array_unique(array_merge($selected_ids, $allowed_ids)); // L'union des deux ensembles, sans doublons.
$allIdsAreAllowed = count($allowed_ids) == count($union);
Si le joueur a mis l'ID d'une division qu'il ne possède pas (disons que
$selected_ids = array(1, 2, 4)
), alors l'union contiendra 4 éléments (1, 2, 3, 4), donc plus que les 3 autorisées (1, 2, 3). On saura donc qu'il a essayé de tricher.