Bonjour,
Je vous explique:
USERS, ROLES, SERVICES
USERS
possède une colonne ID_ROLE et ID_SERVICE en indexJ'ai des fonction dans une classe qui me permettent de récupérer ses éléments
public function searchService() :array
{
$req = $this->bdd->prepare('SELECT * FROM services ORDER BY name ASC');
$req->execute();
$findservice = $req->fetchAll();
return $findservice;
}
public function searchFonction() :array
{
$req = $this->bdd->prepare('SELECT * FROM fonctions ORDER BY name ASC');
$req->execute();
$findfonction = $req->fetchAll();
return $findfonction;
}
public function searchRole() :array
{
$req = $this->bdd->prepare('SELECT * FROM roles ORDER BY name ASC');
$req->execute();
$findrole = $req->fetchAll();
return $findrole;
}
Je les appelles dans le fichiers HTML/PHP où j'ai le formulaire et j'intègre la boucle dans le form
$searchservice = new Search();
$dataservice = $searchservice->searchService();
$datafonction = $searchservice->searchFonction();
$datarole = $searchservice->searchRole();
<div class="required">
<label for="service">Service</label>
<select name="service" id="service" required>
<option value="">--- Choisissez le service ---</option>
<?php foreach($dataservice as $k => $value):?>
<option value="<?= $dataservice[$k]['name'] ?>"><?= $dataservice[$k]['name'] ?> </option>
<?php endforeach;?>
</select>
</div>
La question est comment puis-je optimiser ces fonctions?
Est-il optimal de faire la requête à partir de l'utilisateur genre users.id_service -> services.name?
Si oui comment fait-on? (ouais je sais j'abuse, mais je ne comprends pas bien comment fonctionne les requêtes entre table liées)
Merci par avance de votre aide.
Pourquoi tu fais 3 fonctions ? Pas besoin de préparer tes requêtes.
public function search(string $table) :array
{
$req = $this->bdd->query("SELECT * FROM ".$table." ORDER BY name ASC");
return $req->fetchAll();
}
$searchservice = new Search();
$dataservice = $searchservice->search('services');
$datafonction = $searchservice->search('fonctions');
$datarole = $searchservice->search('roles');
Quand tu voudras récupérer tes utilisateurs, il faudra utiliser les jointures pour récupérer les données de tes 3 tables.
Salut,
Dans ton cas, tu dois récupérer 3 données qui n'ont rien à voir : Une liste des rôles, une liste des services et les informations de l'utilisateur.
Tu peux donc faire 3 requêtes pour cela.
Idéalement, si tu fais trop de requêtes SQL, tu peux mettre en cache le résultat pour éviter de le faire à chaque chargement.
Pour ce qui est de la requête préparée, personnellement je la laisserais car ça garantie qu'il n'y aura pas de faille de sécurité liée à l'injection d'une variable mal contrôlé à l'intérieur de la requête.
Enfin, si tu utilises PDO, je te conseile de faire un fetchAll(PDO::FETCH_COLUMN);
pour récupérer directement un tableau indexé par colonne.
Bonjour,
Merci à vous deux. J'avais pas pensé au PDO::FETCH
.
Et effectivement tant que je maîtrise pas ce que je fais je sécurise un max mon code en préparant mes requête.