Vous n'êtes pas identifié(e).
Pages :: 1
Bonjour,
et d'avance, merci pour votre aide!!!
J'ai parcouru beaucoup de pages forum, sans trouver la réponse...
Ma syntaxe me semble correcte, mais je sèche...
une subtilité qui m'échappe...
Transformer la valeur de l'ID en nom de l'auteur?
Un problème simple je pense....
Mes tables sont créées correctement :
Table : t_ouvrages avec champs ID_ouvrage, Titre, Editeur, Auteur, etc...
Table : t_auteurs avec champs ID_auteurs, Auteur ;
Plus Tables t_editeurs, t_thematiques, le tout avec des liaisons, mais j'ai épuré pour cerner le PB.
La première partie du formulaire se passe bien et me donne la liste de tous les auteurs de la base
sous forme de liste déroulante.
Si j'en sélectionne un, <Rostand, Edmond>, il es t pris en compte.
Mais dans la seconde partie du formulaire,
le <<<< $_POST['Auteur'] ; >>> me renvoie ID_auteur soit n° "7" par exemple,
au lieu de Auteur soit "Rostand, Edmond" et donc inscrit
dans la base le chiffre "7" dans le champ "Auteur", au lieu de "Rostand, Edmond".
Oui, il me reste :
à mettre une condition pour vérifier que le champ est bien renseigné ;
à inclure une fonction "antislashes" je crois (notamment pour les apostrophes dans les titres);
et à revoir le CSS
j'essayerai de trouver cela ensuite...
}
body {
background-color: #000;
}
-->
</style>
<head>
<title>Entrée d'un nouvel ouvrage</title>
</head>
<body>
<?php
//on inclut le fichier connexion.php pour se connecter à la base de données :
include("connexion.php");
?>
<h2 align="center">INSERTION D'UN NOUVEL OUVRAGE DANS LA BASE BDDBOOKS</h2>
<br>
<form name="insertion" action="new_ouvrage2.php" method="POST">
<table border="1" align="center" cellspacing="2" cellpadding="2">
<tr align="center">
<td>Titre ouvrage</td>
<td><input type="text" name="Titre" size="120" maxlength="250"></td>
</tr>
<tr align="center">
<td>Auteur</td>
<td align="left">
<select name="Auteur">
<option value "Sélectionner un auteur">Sélectionner un auteur</option>
<?php
$sql = "SELECT Auteur, ID_auteur FROM t_auteurs ORDER BY Auteur";
$resultat = mysql_query ($sql) or die (mysql_error());
while ($rang = mysql_fetch_array ($resultat)) {
$ID_auteur = $rang['ID_auteur'];
$auteur = $rang['Auteur'];
echo "<option value=\"$ID_auteur\">$auteur</option>";
}
?>
</select>
</td>
</tr>
<tr align="center">
<td colspan="2"><input type="submit" value="Insérer l'ouvrage"></td>
</tr>
</table>
</form>
<?php
?>
<center>
ou <br><br>
<a href="../index.php"><img src="../images/bt_retourmenu.jpg" alt="Bouton retour à l'accueil" width="113" height="23" border="0" /></a>
</center>
</body>
</html>
------------------------------Second fichier du formulaire--------------------------------------
//création de la requête SQL:
$sql = "INSERT INTO t_ouvrages (Titre , Auteur )
VALUES ( '$titre', '$auteur' ) " ;
//exécution de la requête SQL:
$requete = mysql_query($sql, $cnx) or die( mysql_error() ) ;
//affichage des résultats, pour savoir si l'insertion a marchée:
if($requete)
{
//header( 'Location: new_ouvrage_ok.php' );
}
else
{
echo("L'insertion à échouée") ;
}
?>
Edit modération : Merci d'utiliser le bbcode pour mettre en forme les pâtés de code
Hors ligne
salut,
ce que tu fait est une bonne pratique
Pourquoi ?
Par le sieur Rostand n'a p'tet pas écrit qu'un livre et que cela va t'éviter des "doublons" dans la case auteurs.
tu me suis pas ?
imagine que entre Rostand, rostand ou même RoStanD ou pire, c'est des chose différentes pour le sgbd (et php aussi d'ailleur) et donc tu aura 3 auteur, la pas de soucis, c'est un chiffre.
autre chose imagine que dans un moment d'égarement tu écris rostant et que ton code fonctionne correctement et insère nom prénom dans la case. Le jour où tu t'en rend compte, il faut que tu modifie tous les tuples. tu me diras c'est pas grave un simple update suffit c'est pareil partout. Exact, mais corriger une ligne c'est quand plus rapide que 400
Par contre pour récupérer le nom de l'autreur et le titre de l'ouvrage en une seule fois, va falloir utiliser une jointure. Pour cela un peu de doc => http://sqlpro.developpez.com/cours/sqlaz/jointures/ ce n'est pas très compliqué a faire.
Un autre argument, ce que tu a fait s’appel utiliser une clef étrangères. Pourquoi étrangère ? parce qu'elle est étrangère a la table en cours.
ces clefs sont indexées et si tu index aussi celle ci (si tu utilise le moteur innodb et que tu indique explicitement cette dépendance, cela sera fait automatique) tu permettra au sgbd (ici mysql) de te retourner l'info plus vite
il s'agit en fait de la 1ere ou deuxième (je sais plus) forme normale d'une base (unicité de la valeur).
@+
Il en faut peu pour être heureux pompompompompompompompompompompom
Hors ligne
Pardon pour le BBCode...
Merci pour la réponse
Oui, si j'ai créé plusieurs tables c'est que j'ai réfléchi un peu
Je pensais plus à une fonction du genre...
Avant le INSERT TO dans ma base,
puisque je connais le n° ID de mon auteur, j'applique une fonction :
je vais lire dans la table t_auteurs le nom qui correspond à l'ID.
je transmet ce nom à "$auteur" et je l'insère...
Pas possible ?
Cela demande trop de temps ?
Je suis trop simpliste ?
Bonne soirée
Hors ligne
Cela se fait (ou pas !) mais ce n'est pas optimisé et absolument pas en troisième forme normale (voir un cours sur Merise).
On insère dans ce cas là l'id de l'auteur en tant que clé étrangère. Et pour récupérer lors de la lecture le nom de l'auteur il suffit d'une jointure entre les deux tables.
Hors ligne
Cela se fait (ou pas !) mais ce n'est pas optimisé et absolument pas en troisième forme normale (voir un cours sur Merise).
On insère dans ce cas là l'id de l'auteur en tant que clé étrangère. Et pour récupérer lors de la lecture le nom de l'auteur il suffit d'une jointure entre les deux tables.
??????
Jean_mi17 a raison, il faut bien récupérer la clé étrangère par requête à un moment donné pour pouvoir faire l'insertion.
La contrainte foreign key ne fait que vérifier que la clé fournie pré-existe dans la table auteurs au moment de faire l'INSERT dans la table t_ouvrages et rejette l'insertion si la contrainte n'est pas vérifiée.
Ni Merise ni les formes normales ne fourniront ce renseignement, il faut, d'une manière ou d'une autre le requérir auprès du SGBD.
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
xTG a écrit :Cela se fait (ou pas !) mais ce n'est pas optimisé et absolument pas en troisième forme normale (voir un cours sur Merise).
On insère dans ce cas là l'id de l'auteur en tant que clé étrangère. Et pour récupérer lors de la lecture le nom de l'auteur il suffit d'une jointure entre les deux tables.??????
Jean_mi17 a raison, il faut bien récupérer la clé étrangère par requête à un moment donné pour pouvoir faire l'insertion.
La contrainte foreign key ne fait que vérifier que la clé fournie pré-existe dans la table auteurs au moment de faire l'INSERT dans la table t_ouvrages et rejette l'insertion si la contrainte n'est pas vérifiée.
Ni Merise ni les formes normales ne fourniront ce renseignement, il faut, d'une manière ou d'une autre le requérir auprès du SGBD.
Il indiquait l'inverse Kris.
Il possède l'id, donc il récupérait le nom et l'utilisait dans sa requête insert.
Tu as du faire un mélange de nos deux posts.
Hors ligne
Au temps pour moi, c'est tellement évident que je n'imaginais même pas qu'il puisse se proposer de faire l'inverse.
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
Pages :: 1