IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Plusieurs valeurs pour un champ sql


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Graphiste
    Inscrit en
    Avril 2019
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Graphiste
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2019
    Messages : 25
    Par défaut Plusieurs valeurs pour un champ sql
    Bonjour,

    Je vais essayer d'être claire et me faire comprendre :-)

    Pour une centrale de mobilité, je dois créer un site internet permettant aux internautes de retrouver tous les moyens de transports alternatifs aux transports en commun dans leur commune.

    J'ai donc une table "communes", une table "catégorie" (pour le type de transport) et une table "service" avec tous le descriptif du service.

    Sur ma page d'accueil, j'ai un formulaire demandant aux gens de sélectionner leur commune et le type de transports souhaité (personne à mobilité réduite, taxi, ...).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    <h3>2. Rechercher une solution de mobilité alternative dans ma commune :</h3>	
     
     
    <form action="communes.php" method="POST">
     
     
    <?php // communes
    	$reponse = $bdd->query("SELECT * FROM communes ORDER BY commune ASC;");
    ?>
     
     
    <select value="id_communes" name="id_communes" type="text" class="form-control">
     
     
            <?php
    while ($donnees = $reponse->fetch())
    {
     
    echo '<option value="'.$donnees['id'].'">'.$donnees['commune'].'</option>';
     
    }
    		$reponse->closeCursor();
    $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    	?>
    ?>
    		</select><br>
     
    <h3>3. De quel type de transport adapté avez-vous besoin ? </h3>
     
    	<?php // categories
    	$reponse = $bdd->query("SELECT * FROM categories ORDER BY id;");
    ?>
     
    <select value="id_categories" name="id_categories" type="text" class="form-control">
     
     
            <?php
    while ($donnees = $reponse->fetch())
    {
     
    echo '<option value="'.$donnees['id'].'">'.$donnees['categorie'].'</option>';
     
     
    ?>
     
    	<?php }
    	$reponse->closeCursor();
    $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    	?>	</select>		<br>
     
     
    	<input type="submit" value="Rechercher" class="btnrouge"/>
    										</form>
    Après avoir sélectionné les deux informations, on affiche tous les services relatifs au type de transport et à la commune souhaitée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    <?php // 1- requête
    $sql = "SELECT S.*, C.*, T.*
    	FROM services S
    	INNER JOIN communes C 
    		ON S.id_communes = C.id
    	INNER JOIN categories T 
    		ON S.id_categories = T.id
    	WHERE S.id_communes = :id_communes
    	AND S.id_categories = :id_categories
    	";
    // 2- Préparation de la requête
    $reponse = $bdd->prepare( $sql ); 
    // 3- Exécution, avec passage des paramètres externes
    $reponse->execute(array(
    	':id_communes' => $_POST["id_communes"],
    	':id_categories' => $_POST["id_categories"]
    ));
     
    while ($donnees = $reponse->fetch())
    {?>
     
    				<div class="col-lg-12">
    				<div class="pricing-box-alt">
    					<div class="pricing-heading">
    					<div class="col-lg-4">
    						<img src="img/logos/<?php echo nl2br($donnees['logo']);?>" style="width : 160px;"/>
    					</div>
     
    									<div class="col-lg-8">
     
     
    						<h4 class=""><?php echo ($donnees['nom']);?></h4>
    						<p><?php echo nl2br($donnees['motif_de_transport']);?><br>
    						<p class="beneficiaires"><strong>Bénéficiaires : </strong><?php echo nl2br($donnees['beneficiaires']);?></p><br><br>
     
     
    						</div>
     
    					<div class="pricing-action">
    						<a href="service.php?idservice=<?php echo $donnees['idservice']; ?>" class="btnrouge"><i class="icon-bolt"></i> Plus d'informations sur ce service</a>
    										</div></div>
    					</div>
    				</div>
     
    <?php				
     
    }
    $reponse->closeCursor(); 
    ?>
    Tout ceci fonctionne, mon problème, le voici : les services de transport peuvent se retrouver dans plusieurs communes et plusieurs catégories. Je pense qu'on ne peut pas mettre plusieurs valeurs dans un champ, je ne peux donc pas mettre dans "id_communes", 1,3,5 pour faire le lien avec la table commune et c'est là que je cale.

    Voici comment mes tables sont formées:
    communes : id, commune
    categories : id, catégorie
    services : idservice (primary key), id_communes, id_categories, nom, type_de_service, etc.

    Pouvez-vous m'aider ? Je suis sûr que ça ne doit pas être compliqué mais je ne sais pas par où commencer.

    Merci

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2018
    Messages : 119
    Par défaut
    Bonjour,

    vois du cote des tables intermediaires.

    Si j'ai bien compris, tu as plusieurs communes, plusieurs moyens de transports, et des descriptifs (en fait j'ai pas trop compris ton histoire de descriptif, mais c'est pas grave...). une commune a plusieurs moyens de transport et inversement et et suivant ce couple des descriptifs.

    Perso je ferai une table commune, une table transports, comme tu as fait.
    Une table descriptif, sauf que dans celle ci tu mets juste : idservice (primary key),nom, type_de_service, etc.

    et pour finir une table intermediaire, qui unifie les trois autres : idIntermediare(quoi que facultatif), id_communes, id_categories, id_service.

    cette table te permet de tout gerer, si tu as commune id_C=1 pour transport id_T=2 id_T=6, et pour service id_S=8 id_S=14
    tu auras plusieurs tuple (ligne) :
    id=1 id_C=1 id_T=3 i d_S=8
    id=2 id_C=1 id_T=6 id_S=14
    id=3 id_C=19 id_T=6 id_S=8 (la une autre commune, meme moyen de transport, un autre descriptif)
    ....
    .....


    Evidemment tous ces id (id_communes, id_categories, id_service) de ta table intermediare sont des foreign keys des autres tables, donc via les jointures tu recupereras les infos que tu desirs.

  3. #3
    Membre averti
    Femme Profil pro
    Graphiste
    Inscrit en
    Avril 2019
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Graphiste
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2019
    Messages : 25
    Par défaut
    Merci pour la réponse.

    En gros, comme exemple :
    Dans la table "services", on retrouve "Ambulance X" avec ses horaires, ses tarifs, sa description.
    "Ambulance X" est dans les catégories "transport pour personne à mobilité réduite" et dans la catégorie "transport médical assisté"
    "Ambulance X" est active sur la commune A, B et C.

    Donc sur la page d'accueil, quand l'internaute choisi sa commune et le type de déplacement souhaité, le site affiche tous les services disponibles par rapport à ses critères.

    Je vais tester ce que vous avez mis ;-)

    Merci

  4. #4
    Membre averti
    Femme Profil pro
    Graphiste
    Inscrit en
    Avril 2019
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Graphiste
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2019
    Messages : 25
    Par défaut
    J'ai bien modifié mes bases de données mais je cale quand même sur comment faire pour que "Ambulance X", par exemple, soit lié à plusieurs communes. Même en faisant une table intermédiaire, on ne sait pas le lié à plusieurs id de la table communes ?

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2018
    Messages : 119
    Par défaut
    Donc si j'ai bien compris :


    si il y a plusieurs services par moyen de transport alors seconde table intermediaire.


    ca donne :

    table commune => InterCT => plusieurs moyens de transport => InterTS =>plusieurs services par moyen de transport



    table commune inchange

    InterCT
    id_commune|id_transport

    table transport inchange

    T.interTS
    id_transport|id_service


    et tu fais des multiples jointures, tu joins les tables les unes aux autres, comme tu as fais deja.....


    dis moi si ca te parles ??

  6. #6
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2018
    Messages : 119
    Par défaut
    Bon voila,

    Je t ai fait un exemple suivant le deuxieme model que je t ai indique (2 tables intermediaires): table commune => InterCT => plusieurs moyens de transport => InterTS =>plusieurs services par moyen de transport

    j'ai donc recreer 5 tables :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    -- phpMyAdmin SQL Dump
    -- version 4.7.7
    -- https://www.phpmyadmin.net/
    --
    -- Host: localhost:8889
    -- Generation Time: Jun 19, 2019 at 05:03 AM
    -- Server version: 5.6.38
    -- PHP Version: 7.2.1
     
    SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
    SET time_zone = "+00:00";
     
    --
    -- Database: `help`
    --
     
    -- --------------------------------------------------------
     
    --
    -- Table structure for table `commune`
    --
     
    CREATE TABLE `commune` (
      `id` int(11) NOT NULL,
      `nom_commune` varchar(30) COLLATE utf8_unicode_ci NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
     
    --
    -- Dumping data for table `commune`
    --
     
    INSERT INTO `commune` (`id`, `nom_commune`) VALUES
    (1, 'paris'),
    (2, 'lille'),
    (3, 'marseille'),
    (4, 'toulouse');
     
    -- --------------------------------------------------------
     
    --
    -- Table structure for table `IntCT`
    --
     
    CREATE TABLE `IntCT` (
      `id_commune` int(11) NOT NULL,
      `id_transport` int(11) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
     
    --
    -- Dumping data for table `IntCT`
    --
     
    INSERT INTO `IntCT` (`id_commune`, `id_transport`) VALUES
    (1, 2),
    (1, 3),
    (2, 3),
    (2, 2),
    (2, 1),
    (3, 2),
    (4, 2),
    (4, 3);
     
    -- --------------------------------------------------------
     
    --
    -- Table structure for table `IntTS`
    --
     
    CREATE TABLE `IntTS` (
      `id_transport` int(11) NOT NULL,
      `id_service` int(11) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
     
    --
    -- Dumping data for table `IntTS`
    --
     
    INSERT INTO `IntTS` (`id_transport`, `id_service`) VALUES
    (1, 1),
    (1, 2),
    (2, 1),
    (2, 4),
    (3, 2),
    (3, 3),
    (3, 4),
    (4, 3);
     
    -- --------------------------------------------------------
     
    --
    -- Table structure for table `service`
    --
     
    CREATE TABLE `service` (
      `id` int(11) NOT NULL,
      `nom_service` varchar(30) COLLATE utf8_unicode_ci NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
     
    --
    -- Dumping data for table `service`
    --
     
    INSERT INTO `service` (`id`, `nom_service`) VALUES
    (1, 'ambulance'),
    (2, 'restauration'),
    (3, 'tourisme'),
    (4, 'bien-etre');
     
    -- --------------------------------------------------------
     
    --
    -- Table structure for table `transport`
    --
     
    CREATE TABLE `transport` (
      `id` int(11) NOT NULL,
      `nom_transport` varchar(30) COLLATE utf8_unicode_ci NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
     
    --
    -- Dumping data for table `transport`
    --
     
    INSERT INTO `transport` (`id`, `nom_transport`) VALUES
    (1, 'velo'),
    (2, 'voiture'),
    (3, 'train'),
    (4, 'avion');
     
    --
    -- Indexes for dumped tables
    --
     
    --
    -- Indexes for table `commune`
    --
    ALTER TABLE `commune`
      ADD PRIMARY KEY (`id`);
     
    --
    -- Indexes for table `service`
    --
    ALTER TABLE `service`
      ADD PRIMARY KEY (`id`);
     
    --
    -- Indexes for table `transport`
    --
    ALTER TABLE `transport`
      ADD PRIMARY KEY (`id`);
     
    --
    -- AUTO_INCREMENT for dumped tables
    --
     
    --
    -- AUTO_INCREMENT for table `commune`
    --
    ALTER TABLE `commune`
      MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;
     
    --
    -- AUTO_INCREMENT for table `service`
    --
    ALTER TABLE `service`
      MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;
     
    --
    -- AUTO_INCREMENT for table `transport`
    --
    ALTER TABLE `transport`
      MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;

    1er exemple tu veux toutes les infos d'une commune d'un coup :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //affiche tout => tout pour la commune id=1 (ici Paris): les moyens de transport + tous les services qui leurs correspondent
    SELECT * FROM help.commune
    INNER JOIN help.IntCT 
    	ON commune.id = IntCT.id_commune
    INNER JOIN help.transport
    	ON IntCT.id_transport = transport.id
    INNER JOIN help.IntTS
    	ON transport.id = IntTS.id_transport
    INNER JOIN help.service
    	ON IntTS.id_service = service.id
    WHERE commune.id = 1;
    2eme exemples tu veux pour commune definit et un transport definit les services dispo

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //affiche pour la commune id=1 tous les services correspondant au moyen de transport id=3 (train)
    SELECT * FROM help.commune
    INNER JOIN help.IntCT 
    	ON commune.id = IntCT.id_commune
    INNER JOIN help.transport
    	ON IntCT.id_transport = transport.id
    INNER JOIN help.IntTS
    	ON transport.id = IntTS.id_transport
    INNER JOIN help.service
    	ON IntTS.id_service = service.id
    WHERE commune.id = 1 AND transport.id = 3;
    tu vois le principe, apres vous mettez/recherchez ce que vous voulez.

    Note qu il tres tres tres fortement recommander de mettre des foreign-keys sur chaque colonne des tables intermediaires, "ca protege des erreurs de saisies", mais en plus ca te permettra de mettre ON DELETE par exemple, permettant de mettre a jour automatiquement les tables intermediaires si un moyen de transport venait a diparaitre par exemple....

    ps: en esperant avoir bien compris ton probleme !!!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème récuperation plusieurs valeurs pour même champ
    Par Cocotonio20 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/09/2013, 21h22
  2. [MySQL] Inserer plusieurs valeurs dans meme champs SQL
    Par chris52 dans le forum PHP & Base de données
    Réponses: 27
    Dernier message: 19/04/2012, 16h56
  3. plusieurs valeurs pour un champ ? -- debutant
    Par copeau31 dans le forum Débuter
    Réponses: 8
    Dernier message: 03/10/2007, 22h27
  4. Plusieurs valeurs pour un même champ
    Par will89 dans le forum Requêtes
    Réponses: 32
    Dernier message: 14/06/2006, 10h06
  5. [MySQL] Plusieurs valeur pour un meme champs
    Par poissonsoluble dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 12/06/2006, 15h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo