Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
Je travaille sur la création d'une base de données qui sera alimentée par des formulaires HTML/CSS avec du PHP pour la récupération des informations saisies et l'écriture dans la base (classique, j'imagine). Je m'interroge sur la gestion des clés étrangères. Un exemple simple avec les tables suivantes :
- intervention (int_id, int_date, int_type)
- agent (age_id, age_prenom, age_nom)
- intervention_agent (int_id, age_id)
La table intervention_agent stocke les correspondances entre les tables intervention et agent car il peut y avoir plusieurs agents pour une même intervention.
En PHP, je procède de la manière suivante (volontairement simplifiée mais c'est pour le principe) :
1. Récupération des informations saisies dans des variables
$date = $_POST['date'];
$type = $_POST['type'];
$prenom = $_POST['prenom'];
$nom = $_POST['nom'];
2. Requêtes d'écriture des informations dans les tables :
$rqt_intervention = $bdd->prepare('INSERT INTO intervention (int_id, int_date, int_type) VALUES ('', '$date', '$type');');
$rqt_intervention->execute();
$rqt_intervention_agent = $bdd->prepare('INSERT INTO intervention_agent (int_id, age_id) VALUES ( ??? );');
$rqt_intervention_agent->execute();
Comment se gère l'écriture des clés étrangères dans la table intervention_agent ? En effet, j'ai bien paramétré les champs int_id et age_id comme clés primaires dans PostgreSQL, donc mes requêtes d'écriture laissent vides ces champs qui seront automatiquement numérotés à la suite par PostgreSQL lors de l'écriture. Mais quelles valeurs dois-je indiquer dans ma requête d'écriture dans la table intervention_agent (cf. mes points d'interrogation dans la dernière requête ci-dessus) ? Là, je ne vois pas bien comment ça se passe, sur le principe...
Merci par avance pour votre aide !
Thomas
Hors ligne
Re,
Après une journée de recherches, impossible de mettre le doigt sur un cas d'école... Et pourtant, ça doit être une situation courante. Je tourne autour du pot avec la clause RETURNING [ colonne ] qui permet à une instruction SELECT / INSERT de renvoyer la valeur serial affectée par le SGBD. Mais je ne vois pas comment gérer ça en PHP...
Si je reprends mon exemple du premier message, je peux avoir plusieurs agents pour une même intervention. Cela signifie que la création d'une ligne dans la table intervention peut impliquer la création de plusieurs lignes dans la table intervention_agent...
Si quelqu'un a une idée, vraiment je suis en galère !
Merci !
Thomas
Hors ligne
Bonjour,
je pense que vous faîtes une confusion entre une clé primaire et un champ qui s'incrémente automatiquement. Vous avez du utiliser un type «serial» ou «bigserial» pour ce champs, ce qui implique la création d'une séquence.
Donc si vous voulez affecter plusieurs agents à une intervention, il faudra récupérer la valeur renvoyée par le INSERT ... RETURNING..., et boucler sur la liste de vos agent, ou idéalement générer une seule requête. Vous pouvez également manipuler la séquence à la main si vous le préférez ( fonction nextval('nom_sequence'), voir http://docs.postgresql.fr/9.2/functions-sequence.html).
Julien.
https://rjuju.github.io/
Hors ligne
Bonjour,
un exemple :
$sql = "insert into licencie(id_licencie,id_identite,qualif_cartet,diplome,discipline)
values(default,$identiter,'$carte_pro','$diplome','$discipline')returning id_licencie";
$result = pg_query($db, $sql);
if (!$result) {
die("Erreur SQL: " . pg_last_error());
}
$ligne = pg_fetch_row($result);
$id_licencie = $ligne[0];
Alex
Hors ligne
Pages : 1