Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

#1 sam. 09 juin 2018 10:55

Yves TED
Membre
Lieu: Yaoundé
Date d'inscription: 26 mai 2015
Messages: 12

Ecriture de données avec PHP: gestion des clés étrangères

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 de données sur Postgres. Je m'interroge sur la gestion des clés étrangères. Un exemple simple avec les tables suivantes :

- panneau (id_panneau, date_instal,etat)
- technicien (id_tech, nom_tech,adresse)
- panneau_technicien (id_panneau, id_tech)

La table panneau_technicien stocke les correspondances entre les tables panneau et technicien car il peut y avoir plusieurs techniciens pour un même panneau et plusieurs panneaux installés par le même technicien.

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

Code:

$date_instal = $_POST['date_instal'];
$etat = $_POST['etat'];
$nom_tech = $_POST['nom_tech'];                                                             
$adresse = $_POST['adresse];

2. Requêtes d'écriture des informations dans les tables :

Code:

$rqt_panneau = $bdd->prepare('INSERT INTO panneau (id_panneau,date_instal, etat) VALUES ('', '$date_instal', '$etat');');
$rqt_panneau->execute();

$rqt_technicien = $bdd->prepare('INSERT INTO technicien (id_tech, nom_tech, adresse) VALUES ('', '$nom_tech', '$adresse');');
$rqt_panneau->execute();

$rqt_panneau_technicien = $bdd->prepare('INSERT INTO panneau_technicien (id_panneau, id_tech) VALUES ( ?,? );');
$rqt_panneau_technicien->execute();

Comment se gère l'écriture des clés étrangères dans la table panneau_technicien ? En effet, j'ai bien paramétré les champs int_id et age_id comme clés primaires dans PostgreSQL de type AUTO-INCREMENT, donc dans mes requêtes d'écriture je  laisse vides ces champs qui seront automatiquement renseignés à la suite par PostgreSQL lors de l'écriture. Mais quelles valeurs dois-je indiquer dans ma requête d'écriture dans la table panneau_technicien (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 !

Ted

Dernière modification par Yves TED (sam. 09 juin 2018 11:14)

Hors ligne

 

#2 lun. 11 juin 2018 00:04

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 juil. 2010
Messages: 682

Re: Ecriture de données avec PHP: gestion des clés étrangères

Le couple clé primaire/étrangère permet de garantir l'intégrité référentielle
de deux tables, c'est à dire qu'une ligne de la table A référencée dans
une table B ne peut être supprimée à moins que les lignes de la table B
la référençant supprime cette référence en modifiant la valeur de leur clé étrangère.
Pour se faire on crée deux colonnes respectivement dans les tables A et B, appelons les
respectivement id_a et fk_b_a, et pour qu'une ligne de B référence une ligne de A,
il faut que ces deux colonnes possèdent la même valeur.

C'est le travail du développeur de gérer ce genre de choses, car le moteur de base de données
n'a aucune idée a priori quelle ligne est censée être référencée dans quelle autre, c'est la logique
de votre code qui le permettra.
Il faut donc trouver un moyen de récupérer les clés primaires des lignes que vous insérez.

Une possibilité est d'utiliser le mot clef RETURNING a la fin de vos instructions insert afin que les requêtes
retourne les valeurs des clés primaires, et les utilisez dans vos commandes ultérieures.

Une autre serait de ne pas utiliser le mécanisme de valeur par défaut
lors d'une insertion mais de récupérer directement des valeurs des différentes séquences
en faisant un appel à la fonction nextval(id_table_sequence), et l'utiliser par la suite dans votre code.

Vous pourriez aussi gérer l'unicité des identifiants de vos tables uniquement par le code
(exemple : algorithme HI/LO https://vladmihalcea.com/the-hilo-algorithm/),
ou utiliser un identifiant naturel et donc vous passez de générer des identifiants artificiels.

Hors ligne

 

#3 lun. 11 juin 2018 08:22

Yves TED
Membre
Lieu: Yaoundé
Date d'inscription: 26 mai 2015
Messages: 12

Re: Ecriture de données avec PHP: gestion des clés étrangères

Mercie tumasgiu!
Je creuse un peu dans votre sens et je vous tiens au courant.
A plus!

Dernière modification par Yves TED (lun. 11 juin 2018 08:23)

Hors ligne

 

#4 lun. 11 juin 2018 12:16

Nicolas Ribot
Moderateur
Lieu: Toulouse
Date d'inscription: 9 sept. 2005
Messages: 1113

Re: Ecriture de données avec PHP: gestion des clés étrangères

Bonjour,

Utiliser RETURNING est le plus simple il me semble pour une petite application: on laisse le type serial se débrouiller.

J'ai souvent vu, dans des articles, les CTE utilisées en update/insert, notamment pour réaliser un "upsert" qui est désormais dispo dans PG.

Jamais testé dans des appli, mais un truc comme ca:

Code:

with insert_panneau as (
  insert into panneau (etat) 
  values ('cassé')
  returning id
), insert_tech as (
  insert into tech(nom) 
  values ('bob') 
  returning id
) insert into panneau_tech (id_panneau, id_tech)
    select p.id, t.id
  from insert_panneau p, insert_tech t;

Permet de faire les trois inserts dans une meme requete, donc une meme transaction, ce qui évite d'avoir à gérer les transactions dans le code (la plupart des drivers PG sont en autocommit).

Si votre appli est publique ou utilisée par beaucoup de personnes, attention dans votre code PHP à protéger les valeurs saisies dans les formulaires, en utilisant peut etre des prepared statements ou les outils PHP pour s'assurer que les valeurs reçues ne sont pas de l'injection SQL.

Nicolas

Hors ligne

 

#5 mar. 12 juin 2018 12:47

Yves TED
Membre
Lieu: Yaoundé
Date d'inscription: 26 mai 2015
Messages: 12

Re: Ecriture de données avec PHP: gestion des clés étrangères

Merci déjà Nicolas!
Je m'y mets et je te reviens.
A plus!

Hors ligne

 

#6 mar. 12 juin 2018 21:55

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 juil. 2010
Messages: 682

Re: Ecriture de données avec PHP: gestion des clés étrangères

On peut aussi utiliser une couche d'abstraction pour l'accès aux bases de données,
ou DBAL, déja écrite comme par exemple les ORM (Object Relational Mapper).

Certaines d'entre elle sont difficiles à appréhender,
mais souvent ça vaut le coup de s'y essayer, car une fois les API
et leur mécanismes appris, on peut écrire des applications
avec beaucoup moins de code rébarbatif.
Ils encapsulent souvent aussi les problèmes complexes,
comme l'injection SQL ou la gestion des identifiants et
clé etrangères.

Malgré tout, il est bon de se confronter a cette complexité
bas-niveau, de manière à comprendre ce qui se passe
sous le capot, et cerner les limites de cette couche

Après tout dépends comme le dit Nicolas, de la taille
et de la destination de votre application.

Une petite recherche sur les DBAL Php donne par exemple :
https://www.doctrine-project.org/

Dernière modification par tumasgiu (mar. 12 juin 2018 21:58)

Hors ligne

 

#7 mer. 13 juin 2018 07:01

Yves TED
Membre
Lieu: Yaoundé
Date d'inscription: 26 mai 2015
Messages: 12

Re: Ecriture de données avec PHP: gestion des clés étrangères

Bjr!tumasgiu
J'ai réussi à bidouiller quelque chose grace au bout de code que m'a proposé Nicolas. Ca  résout super bien le problème de récupération d'insertion des clés étrangères dans la table issue des relations de 1 à n de manière synchrone. Cependant la solution que vous me vous  proposez ici pourra etre une bonne piste. Je vais également m'y pencher.

Hors ligne

 

#8 mer. 13 juin 2018 07:07

Yves TED
Membre
Lieu: Yaoundé
Date d'inscription: 26 mai 2015
Messages: 12

Re: Ecriture de données avec PHP: gestion des clés étrangères

Bjr Nicolas!
J'ai adapté le bout de code que vous m'avez proposé dernièrement, il insère super bien les données dans la table panneau_technicien.
Merci bien!

Hors ligne

 

Pied de page des forums

Powered by FluxBB

Partagez  |