Forum Clubic

Creer une requette a partir d'un formulaire? php (page 3)

mdr :clap:
nn mais ca a l’air nickel j’essaye ca …parce que ma BDD n’est pas encore terminée…et puis je te redi ce que ca donne tres bientot

le problemen c’est que je n’ais pas une table site une table employé…
justement j’ai une table differente par site…et dans ces tables les services peuvent etre n’imorte lesquelles…:frowning:

Tu veux dire que tu as une table d’employés par site ?
Donc si t’as 12 sites, tu as 12 tables d’employés (ou employés/site) ?

Qu’en est-il de ta relation avec les sociétés ? Toutes les sociétés n’ont certainement pas accès à n’importe quelle table d’employés/site.

Faut que ça soit bien précis, parce qu’en fonction de ta base, tu ne vas pas gérer ton code PHP exactement pareil (la preuve !).

non je n’ai que 3 tables…une par type d’agence…vu que l’entreprise est divisée en 3 parties differentes…

Et comment fais tu pour déterminer sur laquelle des 3 tables tu dois pointer ?

ben justement avec les checkbox…:paf:

Ok, ça j’avais compris. C’était pas ma question.

Résumons :

t’as une société, qui a un annuaire d’employés en BDD.
la société est divisée en trois sites, donc l’annuaire aussi --> 1 table par site
pour chaque site, tu as droit à la totalité des services --> ces services sont répertoriés dans 1 table ou il y a 1 table de services par site aussi ?

nn c’est la premiere solution…dans chaque table (donc une par societe au nombre de 3) mais dans ces 3 tables il peut y avoir n’importe quels sites ou services :wink:

Donc, le choix de société en checkbox détermine quelle table tu dois vérifier puisqu’il y a une table par société.

Problème : si tu choisis les 3 sociétés, faut faire une vérification dans tes 3 tables, qui ne sont pas joignables entre elles (pas de relation clé primaire/clé étrangère entre elles) c’est bien ça ?

Bon, ben il te suffit de décomposer : Un select par entreprise et de faire un/des Union de tes selects.

Si j’ai encore compris de travers, je pense qu’une petite description de ta base de données s’impose ! :wink:

non ca y’est tu as tout saisi !!! :super: mdr
par contre qu’est ce que tu entends par des unions de mes selects ?

Ben, y a une commande SQL très partique qui s’appelle UNION ! Frocément, ça ne pouvait qu’être problématique si tu ne la connaissais pas !

Ca te permet de faire un truc dans le genre :


Select
          id,
          nom,
          prenom
From
          tab_employe1
Where
          pays = 'France'
Union
Select
          id,
          nom,
          prenom
From
          tab_employe2
Where
          rue_adresse = '4 rue debile'
Union
Select
          id,
          nom,
          prenom
From
          tab_employe3
Where
          telephone = '0102030405'

Donc, comme tu l’auras remarqué : les select renvoient exactement le même nombre de colonnes et elles s’appellent toutes pareils. C’est la condition sinequanone pour que l’Union fonctionne. Donc si les colonnes ne s’appellent pas pareil dans tes tables, n’oublie pas de les renommer dans ton select (avec le mot clé As : nom As nom_employe).

donc en gros les unions servent a ce que les conditions d’autres requetes soient prises en compte par d’autres tables quand celles ci ne peuvent pas etre liées ??

Le Union te permet de ramener en un seul jeu de résultats ce qui normalement t’aurait pris plusieurs requêtes (et donc plusieurs jeux de résultats). Voilà une définition du Union.

Un exemple tout con :



Select
          id,
          nom
From
          tab_employe
Where
          prenom = 'Toto'
          Or telephone = '0102030405'


équivaut à ça en Union :



Select
          id,
          nom
From
          tab_employe
Where
          prenom = 'Toto'
Union
Select
          id,
          nom
From
          tab_employe
Where
          telephone = '0102030405'


Sauf qu’il serait débile d’écrire un Union alors que t’attaques la même table et que le mot clé OR existe.

Il se trouve que l’Union se prête plutôt bien à ton cas : 3 tables à attaquer et elles ne sont pas joignables 1 à 1, ce qui t’oblige à faire un select différent par table. Donc tu fais tes 3 select, et tu les unis grâce au Union.

A mon avis, tu ferais mieux d’apprendre le SQL, et quelques concepts :slight_smile: car c’est ça dans ton cas, mais ce n’est pas que pour ça.

Les unions c’est juste pour faire l’union entre elles plusieurs tables (nommées, vues, temporaires, ou anonymes (ie: (select 1) union (select 2)). ie: A u B si on parle d’ensembles.

Et en l’occurrence, l’opérateur “union” n’est possible que si les éléments de A et B sont équivalent d’un point de vue structure.

In fine, inutile de dire que les union ne sont pas performantes du tout (= A u B = tout ce qui est dans A et dans B, de telle sorte à ce qu’il n’y ait pas de doublons)

ok merci j’essaye de finir mes conditions dans mes boucles et je vous redis :slight_smile:

effectivement tu as raison les UNION vont m’etre utiles…
j’aurais une autre petite question en ce qui concerne la concatenation…en effet j’utilise une expression du genre pour former mes conditions du where


for ( $k=1; $k < 17; $k++) {
	if (isset($_POST['service'.$k])){
    $service_selectionnes=$service_selectionnes .$_POST['service'.$k];
    if ($k < 16) {
        $service_selectionnes .= $service_selectionnes . " AND service= "; 
    }
}
}

le probleme est que chaque valeur est prise en compte 2 fois au moins…enfin autant de fois que de checkbox cochées meme logiquement…or a part la concatenation je ne vois pas… comment faire ??

D’abord, à mon avis, dans ta dernière concaténation, il y a un problème. Tu concatènes 2 fois $service_selectionnes, puisque tu mets un point avant ton égal, et que tu rajoute $service_selectionnes après ton égal. Ca va pas aller, comme ça. Soit tu mets le point avant l’égal, soit tu rajoutes ta variable après. :wink:

Sinon, moi, je vois ça comme ça : si les colonnes que tu as à récupérer sont toutes les mêmes quelle que soit la table que tu attaques, tu déclares 1 variable $select où tu mettras ton instruction select et tes champs à prendre.

Ensuite, tu déclares 3 variables de type $from : $from1, $from2 et $from3, toutes les trois avec une chaîne vide.



$from1 = "";
$from2 = "";
$from3 = "";


$from1 sera la variable où tu mettras par défaut ton instruction From et la table que tu dois interroger (je suppose que tu impose de cocher 1 des cases des entreprises donc tu auras toujours au moins 1 table sur laquelle chercher), puis les autres tables que du va devoir joindre (site et services).

Si tu as coché une deuxième entreprise, tu renseigneras alors $from2 de la même manière que $from1, mais en mettant la table d’entreprise qui va bien.

Idem si t’as coché la troisième checkbox : tu renseignes alors $from3 comme les 2 premières, mais avec la troisième table qui va bien.

Pour finir, tu créés ta clause where telle que tu le fais déjà : elle sera la même pour tous les select de ton union.

Et tu montes ta requêtes de cette manière :



$requête = $select . " " . $from1 . " " . $where;

if ($from2 != "")
{
          $requete .= " Union " . $select . " " . $from2 . " " . $where;
}

if ($from3 != "")
{
          $requete .= " Union " . $select . " " . $from3 . " " . $where;
}


Et ensuite, tu peux exécuter ta requête.
Edité le 16/06/2008 à 17:27

Et ça donne quoi la requête?

(au passage, pourquoi ne pas utiliser un tableau de checkbox, comme on te l’a dis je crois? Ca te permettrait d’avoir des requêtes qui marchent, car je ne suis pas sûr du fonctionnement de ton algo si tu ne coches que la case 2 et 5 par exemple).

ben si ca marche mais j’ai des doublons a chaque fois…et puis il faut que je place mes virgules au bon endroit

Comment ça, il faut que tu places tes virgules au bon endroit ? Ca devrait toujours être le cas, ça !

Bizarre que tu aies des doublons : normalement, le Union ne fait ressortir que les lignes distinctes, justement (c’est d’ailleurs écrit dans la page décrivant le Union que je t’ai filée). Si tu veux les doublons avec un Union, il faut faire Union All. Donc, c’est que les lignes ont quelque chose de différent quelque part. Révois-ta requête, à mon avis.