Bonjour,

Je vous explique:

  • J'ai 3 tables différentes USERS, ROLES, SERVICES
  • La table USERS possède une colonne ID_ROLE et ID_SERVICE en index
  • J'ai un formulaire de création d'utilisateur sur lequel j'ai des listes déroulantes pour le role et le service.
  • J'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.

3 réponses


Curvata
Réponse acceptée

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.

Arnaud Lemercier
Réponse acceptée

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.