Est-ce une bonne pratique de préparer ses requêtes depuis le controller?

Fermé
abisko - Modifié le 7 nov. 2020 à 03:06
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 - 7 nov. 2020 à 16:28
Bonjour les Amis,

Avec mon niveau intermédiaire en PHP; j'aimerais savoir si ma façon de préparer mes requêtes depuis mon controller est une bonne pratique!

Voici un extrait de mon controller :

if ( isset($_POST['table'])  && isset($_POST['carId']) && isset($_POST['carActuStatus'])
    &&  isset($_POST['actionAuthor']) && isset($_SESSION[ $_POST['actionAuthor'] ]) ) {

      $table = htmlspecialchars($_POST['table']);
      $carId = htmlspecialchars($_POST['carId']);
      $carActuStatus = htmlspecialchars(trim($_POST['carActuStatus']));
      $carAvailability='';
      $actionAuthor = htmlspecialchars($_POST['actionAuthor']);
     
      if ($carActuStatus == 'Indisponible') { 
          $carAvailability='non';
      }else{
          $carAvailability='oui';
      }
 
       //je vérifie si la variable $table est correcte avant de l'insérer dans ma requête
       if ( $table != 'car_to_sell' AND $table != 'car_to_rent' ) {
           echo 'Inpossible d\'effectuer cette action';
           return;
       }
    
     $reqMessage = " UPDATE $table SET car_availability = :car_availability WHERE car_id = :car_id  ";
     $valueArray = ['car_id' => $carId,
       'car_availability' => $carAvailability ];
    
     //si l'action ne vient pas d'un administrateur
     if ( $actionAuthor != 'admine') {
         $authorPseudo = $_SESSION['partener_members']['pseudo'];
         $reqMessage = $reqMessage." AND owner_pseudo = :owner_pseudo  "; 
         $valueArray['owner_pseudo'] = $authorPseudo;
         //pour être sûr que le véhicule appartient vraiment à cet utilisateur
     }
     //je passe ensuite en argument la requête préparée ainsi que mon array d'exécution à ma fonction
      $carManager = new CarManager();
      $reponse = $carManager->UpdateCarWithCustomableReq($reqMessage, $valueArray);
}


Et dans mon fichier model.php, la fonction se présente ainsi :
public function UpdateCarWithCustomableReq($reqMessage, $valueArray){
   $req = $this->db->prepare(" $reqMessage ");
   $result = $req->execute( $valueArray );
   return $result;
}

Je sollicite votre regard d'expert SVP!!

1 réponse

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
7 nov. 2020 à 08:59
Bonjour,

Donc non, ce n'est pas une bonne pratique.

De plus, la fonction htmlspecialchars ne dois servir que pour l'affichage des données dans le code html.. et jamais en "traitement" des variables à insérer (ou requêter) en bdd

Et pour finir, connais tu l'écriture ternaire ? ça simplifie un peu l'écriture du code
par exemple
  if ($carActuStatus == 'Indisponible') { 
          $carAvailability='non';
      }else{
          $carAvailability='oui';
      }

en ternaire, donne
$carAvailability = ($carActuStatus == 'Indisponible' ) ?  'non' : 'oui';

0
Merci Jordane45 pour ta réponse.
Cependant comment m'y prendre pour adapter mes requêtes en fonction de chaque situation? surtout les situation que je ne peux pas parfaitement contrôler? Par exemple lorsque l'utilisateur souhait filtrer les résultats sur la liste des produits avec plusieurs paramètres!
je m'y prenais comme cela :
$reqMessage = "SELECT * FROM $table WHERE admine_approbation = 'oui' ";
$filterInfo = [];

//Mais variable POST sont envoyées via Ajax
if ( isset($_POST['brandFilter']) AND trim($_POST['brandFilter']) != ''  ) {			
		$carBrand = trim($_POST['brandFilter']);
		$reqMessage = $reqMessage. " AND carBrand REGEXP '^$carBrand' ";
}
if ( isset($_POST['carTypeFilter']) AND trim($_POST['carTypeFilter']) != ''  ) {
		$carType = trim($_POST['carTypeFilter']);
		$reqMessage = $reqMessage. " AND car_type = :car_type ";
		$filterInfo['car_type'] = $carType;
}
//....Ainsi de suite pour une quinzaine de paramètres; ensuite:

$carManager = new CarManager();
$reponse = $carManager->SelectCarWithCustomableReq($reqMessage, $filterInfo);		

Comment pourrai-je gérer une telle situation en créant des requêtes prédéfinies dans mon model?
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650 > abisko
7 nov. 2020 à 16:28

Cependant comment m'y prendre pour adapter mes requêtes en fonction de chaque situation?

Ben.. tu déplaces dans ton modèle le bout de code qui te permet de créer ta requête...

Au passage : https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code

.
0