Insertion données provenant d'une table dans une autre

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Insertion données provenant d'une table dans une autre

par betman » 06 avr. 2006, 17:46

Merci bcp c'est bien plus clair. Je réflechir à tous ça. je vous montrerai l'avancée demain :)

Mais en tout cas j'ai bien saisie le principe cette fois ci

Meric pour votre aide

par sadeq » 06 avr. 2006, 17:06

lol, j'ai enfin compris le fonctionnement, je peux proposer alors une solution :

Les tables :

1. Compte d'une personne enregistrée (A)

2. Carnet d'adresse contenant les contacts d'une personne (B)

3. Contact définissant les infos utiles (Agents compris mais pas les seuls contacts possibles) (C)

4. Agents pouvant être aussi des contacts (D)

Relations entre tables :

(A) <--- 1/1 --- (B) : une personne a un carnet d'adresses (B dépond de A)

(B) --- 1/N ---> (C) : le carnet d'une personne contient N contacts (Agents compris mais pas les seuls)

(C) <--- 1 --- (D) : 1 Agent est un contact potentiel

Remarque : le sens de la flêche est une dépondence, qui sera représentée par la migration de la clé primaire en tant que clé étrangère dans le sens inverse de la flêche

Donc :
(A): Table Personne (id, ....) Clé primaire = id

(B): Table Carnet_adresse (id_personne, id_contact) Clé étrangères = id_personne et id_contact
Le carnet d'adresse est alors une association entre la personne et ses contacts

(C): Table Contact (id, nom, prenom, adresse, ville, cp, email, tel,....) Clé primaire = id

(D): Agent (id, id_contact, ....) Clé primaire = id, Clé étrangère = id_contact
Un Agent est aussi un contact

Comment utiliser le modèle :
1. une personne peut être créée sans conditions relationnelles
2. un contact peut être créé sans conditions relationnelles
3. un carnet est créé pour une personne existante et un contact existant
4. En créant un Agent, un contact est forcement créé ou existant

Une proposition de remplissage d'un carnet d'adresses d'une personne existante

Organigramme du Formulaire:

1. Saisie id Personne (choix d'une valeur existante ou nouveau)
2. Saisie Infos Contact (nouveau ou existant)
3. Enregistrer l'id personne et l'id_contact dans la table "Carnet_adresse"
4. Répéter les actions 2 et 3 pour ajouter d'autres contacts dans le carnet de la même personne

par zeus » 06 avr. 2006, 15:51

Donc un carnet d'adresse peut contenir plusieurs agent et un agent peut être dans plusieurs carnets d'adresses.

En modélisation, c'est ce qu'on appelle une relation n-n, ce qui veut dire qu'il te faut une table intermédaire qui va contenir les associations entre les agents et les carnets d'adresse.

Je te propose le schéma suivant :

Code : Tout sélectionner

CREATE TABLE agent_carnet ( `idcarnet` int(11) NOT NULL default '0', `idagent` int(11) NOT NULL default '0', KEY `assoc` (`idcarnet`, `idagent`) )
A chaque fois que tu veut mettre un agent dans un carnet d'adresse, il te suffit d'insérer une ligne dans cette table avec l'id du carnet et l'id de l'agent

Pour voir les agents d'un carnet, il te suffit de sélectionner toutes les lignes de cette table où idcarnet correspond et vice-versa

par betman » 06 avr. 2006, 15:40

Pour bien expliquer :

Sur le site, les personnes qui ont un compte dispose d'un carnet d'adresse perso, qu'il peuvent remplir manuellement.

D'autre part il y a une table agent (commerciaux en gros) qui contient +3000 enregistrements.

Lorsque qu'un personne effectue une recherche sur la table agent, j'aimerai que les données de l'agent (nom, adresse, tel ...) se rajoute dans le carnet d'adresse perso de la personne.

les tables sont construites différement

par zeus » 06 avr. 2006, 15:25

Quelle est la différence entre ce qui est stocké dans agent et dans carnet_add ?

Un agent peut-il avoir plusieurs carnet d'adresse ?

par betman » 06 avr. 2006, 15:22

Ces 2 tables sont existantes et comportent déjà des données.

Moi je pensais rajouter un champ dans chacunes d'elles pour pouvoir effectuer le lien.

Je me servirai de la clé primaire de la table agent (code)

Pour faire la liaison avec la table carnet_add (idagent)

ca ne peux as fonctionner comme ca ?

par zeus » 06 avr. 2006, 15:00

A qui est associé un carnet d'adresse ?

Il ne faut pas qu'il y ait les champs non, prenom, adresse, ... dans la table carnet_adr ...

Je voudrais un schéma syntétique me donnant les principales entitées de ta bases et leurs intéractions

par betman » 06 avr. 2006, 14:39

Oui ça j'ai pigé le principe.

Mais je ne vois pas vraiment comment construire la requête pour effectuer un lien entr les bases j'ai fait ça pour le moment :
<?php require_once('../Connections/bdIntranetConnect.php'); ?>
<?php
$query = "INSERT INTO carnet_add (code) VALUE '".$_POST['code']."' , WHERE idagent='".$_GET['code']."'" ; 

$result = mysql_query($query) or die ('Erreur SQL !<br>'.mysql_error());

header('location: recherche.php');

?>
mes tables sont structurés comme ceci now :)

la tables qui doit receptionner le lien :

Code : Tout sélectionner

CREATE TABLE `carnet_add` ( `idcarnet` int(11) NOT NULL auto_increment, `idagent` int(11) NOT NULL default '0', `identifiant` varchar(7) NOT NULL default '', `nom` text, `contact` text, `adresse` text, `postal` text, `ville` text, `tel` text, `portable` text, `mail` text, KEY `idcarnet` (`idcarnet`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
dans la table emmetrice de données je me sers de la clé primaire "code"
et du champ idagent dans la table receptrice carnet_add

donc si j'ai bien pigé le principe, je dois :

Lors de l'insertion dans la table carnet_add, lié code = idagent

en gros c ça ??

par mario » 06 avr. 2006, 14:25

le problème avec ta structure est que si tu modifie un contact, il ne sera pas modifié dans le carnet d'adresse :D

par betman » 06 avr. 2006, 14:16

mes tables sont construites comme ceci :

Code : Tout sélectionner

TABLE `carnet_add` ( `idcarnet` int(11) NOT NULL auto_increment, `identifiant` varchar(7) NOT NULL default '', `nom` text, `contact` text, `adresse` text, `postal` text, `ville` text, `tel` text, `portable` text, `mail` text, KEY `idcarnet` (`idcarnet`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;

Code : Tout sélectionner

TABLE `agent` ( `code` int(10) NOT NULL default '0', `nom` varchar(24) NOT NULL default '', `adresse1` varchar(24) NOT NULL default '', `adresse2` varchar(24) NOT NULL default '', `postal` int(5) NOT NULL default '0', `ville` varchar(24) NOT NULL default '', `tel` int(14) NOT NULL default '0', `fax` int(14) NOT NULL default '0', `ctp` int(3) NOT NULL default '0', PRIMARY KEY (`code`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Sur la page ou les données s'affichent :
<?php
require_once('../Connections/bdIntranetConnect.php');

$query = "SELECT * FROM agent WHERE nom LIKE '".$_POST['nom']."%' AND postal LIKE '".$_POST['postal']."%' ORDER BY nom";

$reponse = mysql_query($query)or die ('Erreur SQL !<br>'.mysql_error());

while ($donnees = mysql_fetch_array($reponse) )
{
?>
Ma page qui ajout ces données dans l'autre table
<?php require_once('../Connections/bdIntranetConnect.php'); ?>
<?php
$query = "INSERT INTO carnet_add nom='".$_POST['nom']."', contact='".$_POST['contact']."', adresse='".$_POST['adresse']."'" ; 

$result = mysql_query($query) or die ('Erreur SQL !<br>'.mysql_error());

header('location: recherche.php');

?>
Mais ton idée est bien meilleur ca simplifie les choses et comme tu dis pas de multiplication de données

Il faut que je revois la structure des mes tables

par sadeq » 06 avr. 2006, 12:57

Zeus +1 :pouce:

par zeus » 06 avr. 2006, 12:37

Tout simplement avec une requete INSERT SELECT

Code : Tout sélectionner

INSERT INTO carnet_adresse(nom, prenom, ...) SELECT nom, prenom, ... FROM contact WHERE id_contact = le_bon_id
Mais je te conseillerais de revoir la conception de ta table car tu va multiplier les données dans ta table et c'est très déconseillé ...

Je te propose le shéma suivant :

Code : Tout sélectionner

+---------------+ | contact | +---------------+ | id_contact | | nom | | prenom | | ... | +---------------+ +---------------+ | carnet_adr | +---------------+ | id_carnet | | id_proprio | +---------------+
Dans lequel la table carnet_adr ne contient qu'un lien vers le contact. Du coup, plus de multiplication de données, ce qui entraine :
- moins de place prise
- pas de pb de mise à jour ...

par mario » 06 avr. 2006, 12:26

montre nous la structure des deux tables stp ?

par betman » 06 avr. 2006, 12:25

Bah, mes données qui s'affiche ne portent pas le forcément le même nom de champs. Par exemple je dois insérer un "agent" dans un champ "nom" sur une autre table.

est-que un truc du genre insert into agents='$_post['nom'] pourrais fonctionner ?

par mario » 06 avr. 2006, 12:17

il te suffit donc d'insérer l'ID du contact dans la deuxième table
je ne comprend pas ce qui t'embete