logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 31-01-2018 20:49:00

Invité-8
Invité

Requête SQL : Vous feriez comment ?

Bonsoir à vous,

J'aurais besoin de retours et/ou conseils concernant votre manière de construire des requêtes SQL propre set réutilisables facilement avec des conditions différentes.
J'vous peint le tableau : Un bon gros programme des familles, écrit en PHP, Mysql/Mariadb pour base de données et la librarie PDO pour lier le tout.

La base de données comprends environ 80 tables, et il arrive régulièrement que nous soyons obligé de lier plusieurs tables pour avoir les résultats que nous souhaitons. Quand je dis "nous", je parle de l'équipe de développeur dont je fais modestement partie.
Bref, nous avons tout fait à la mimine, sans Framework top moumoute (MVC...), en créant nos classes et en codant aussi proprement que nous pouvions. Dans notre programme, nous mettons un point d'honneur à rendre un maximum de choses disponibles à l'utilisateur. C'est pourquoi on se retrouve avec des formulaires conséquents permettant de filtrer diverses données.

Ce sont ces formulaires, ou plutôt les requête SQL derrière ces requêtes, qui nous soulèvent des questions. Actuellement, on fonctionne avec des gigantesque requêtes, coupées par des IF, où l'on créé les liaisons en fonction des arguments du formulaire, on fait des boucles sur les conditions... Certaines requêtes font près de deux ou trois cents lignes. Cela reste lisible (Si, si, j'vous assure), mais il y a sûrement moyen de faire mieux, non ?

Une première piste serait probablement l'utilisation de Vues, peut-être...


D'où ma question, vous, vous faites comment vous ? :)

#2 01-02-2018 00:28:26

otyugh
CA Debian-Facile
Lieu : Quimperlé/Arzano
Distrib. : Debian Stable
Inscription : 20-09-2016
Site Web

Re : Requête SQL : Vous feriez comment ?

Moi : je fais de la dev php du dimanche en mouffles, pas sur d'être intéressant.

J'vais dire une connerie : je fais des fonctions précuites, je fais du SQL 2 fois dans l'année, donc j'aime pas y penser, je les "forge" (en suant) une bonne fois pour toute dans des fonctions, genre "sqlSetUser($nom,$date,$tel,$x,ŷ)" ou "sqlGetPoemsByAuthorID(id)", je fais mes 20-30 requêtes que je sais j'aurais besoin, et je m'y tiens.
Ensuite je ferai un "include mesfonctionssql.php" pour pouvoir les utiliser.

Pour moi la difficulté dans les formulaire, bien plus que le SQL, c'est toutes les routines de verification pour empêcher les injections malveillantes bien sûr, mais surtout pour aiguiller la personne quand un bout de formulaire rempli est incorrect. Chaque champ, fastidieuuuux.

Bref. C'était la diatrib de roger au bistro quand il fait ses pages perso dans un moment d'ennui. Suis curieux du type de réponse que ferait quelqu'un de "pro" là-dessus. Probablement un "utilise symfony ducon !"  x)

Dernière modification par otyugh (01-02-2018 00:30:33)


virtue_signaling.pngpalestine.png

Hors ligne

#3 01-02-2018 12:46:33

Invité-8
Invité

Re : Requête SQL : Vous feriez comment ?

J'suis curieux aussi big_smile
Merci pour ton retour en tout cas. A priori, je dois fréquenter le même bistro que Roger, puisque j'utilise pratiquement les mêmes astuces de sioux.

#4 21-02-2018 15:36:31

Artheriom
Membre
Lieu : Clermont-Ferrand
Distrib. : Debian Stretch
Noyau : Linux 4.9.0-5-amd64
(G)UI : Gnome3
Inscription : 29-01-2018
Site Web

Re : Requête SQL : Vous feriez comment ?

Coucou,

Je réponds car visiblement il n'y à pas eu trop de réponses.
En effet, votre gestion des requêtes SQL semble pour le moins chaotique. x). Question toute bête à laquelle vous aurez déjà probablement réfléchi, mais SQL permet par défaut des jointures (INNER JOIN, LEFT JOIN & cie). Vous avez tenté de regarder par là ? Car même sur des gros projets où je dois interconnecter 3/4 tables entre elles, j'y suis toujours arrivé sans trop de casse comme ça.

@otyugh > C'est une bonne méthode de programmation, forger des requêtes génériques et passer les arguments derrière. Tant que les requêtes sont préparées et parsées correctement... tongue

PS : Symphony n'est pas une fatalité, on peut se débrouiller sans même sur des très gros projets. Personnellement j'ai une aversion pour ce genre de Framework, si je veux coder en Orienté-Objet et en MVC, j'utilise Java avec Spring. Quitte à faire propre, autant le faire totalement.

Dernière modification par Artheriom (21-02-2018 15:49:42)


Étudiant en Master à l'Institut Informatique d'Auvergne.
Parfois je fais des trucs sur le Oueb", et généralement ça fonctionne. Fondateur de Goldheim https://goldheim.fr/
Linuxien convaincu depuis 2010. Adepte de Debian, CentOS, Mandrake, Ubuntu, SolusOS. Mandravia, c'était pas si mal.

Hors ligne

#5 21-02-2018 16:05:46

hyrr0
Membre
Distrib. : Debian stable
Inscription : 12-01-2018

Re : Requête SQL : Vous feriez comment ?

Artheriom a écrit :


@otyugh > C'est une bonne méthode de programmation, forger des requêtes génériques et passer les arguments derrière. Tant que les requêtes sont préparées et parsées correctement... tongue



Et tant qu'on a pas une migration à faire sur une table... Après faut penser à modifier toutes les requêtes concernées dans les fonctions. Je comprends les raisons de faire un projet à la mimine : pas de contraintes imposées par un framework, plus rapide car moins de dépendances... mais un bon vieil ORM des familles ça fait quand même bien plaisir!

Bon, dans tous les cas, c'est trop tard pour vous. Je pense qu'en effet la solution des fonctions est la plus simple (mais pas la plus propre). Essayez de mutualiser au maximum (DRY - Don't Repeat Yourself):

Par exemple : un getUserById et un getUserByName c'est un getUser... donc créer une fonction getUser qui génère le SQL pour récupérer un user. Exemple:

SELECT * FROM USER



et getUserById ferait un truc dans le genre :

function getUserById(id){
$sql = getUser();
$sql . "WHERE id=".$id
return $sql
}
 



Bon, c'est pas parfait, mais c'est juste pour montrer l'idée. Comme ça, le jour où un truc change, vous êtes tranquille. Par contre, ça vous fait créer plein de fonctions pour chaque requête... c'est lourd.

Perso, j'identifierai les besoins de vos requêtes. J'essaierai d'établir une hiérarchie d'appels dont je me servirai pour créer une factory qui me pondera mon SQL à la demande.

Un truc qui pourra être appeler comme ça :


$factory = new RequestFactory('user'); // ici c'est le nom de la table SQL
$sql = factory.get('id',$value); //ici on passe le nom du paramètre et sa valeur.



De cette façon, on n'a qu'une seule factory qui gère tout. ça simplifie les appels et niveau maintenant, c'est centralisé. Par exemple si vous voulez faire un UPDATE :


$factory = new RequestFactory('user');
$sql = factory.update('id',$new_user);
 



ça reste schématique hein... je dis pas que c'est la meilleure solution mais ça me parait pas trop mal smile

Hors ligne

Pied de page des forums