PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 05-05-2011 13:38:37

jean_mi17
Membre
Inscription : 05-05-2011
Messages : 2

Le $_POST me retourne l'ID et pas le nom ???

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...


------------------------------Premier fichier du formulaire--------------------------------------
<html>
<html><style type="text/css">
<!--
body,td,th {
  font-family: Verdana, Geneva, sans-serif;
  font-size: 14px;
  color: #FFFFFF;
  color:white;
  a:link {
          color: #FFFFFF;
          text-decoration: none;
  }
  a:visited {
          text-decoration: none;
         color: #FFFFFF;
      }

}
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--------------------------------------


<?php
  //connection au serveur
  $cnx = mysql_connect( "localhost", "root", "" ) ;
 
  //sélection de la base de données:
  $db  = mysql_select_db( "bddbooks" ) ;
 
  //récupération des valeurs des champs:
  //Titre:
  $titre = $_POST['Titre'] ;
  //Auteur:
  $auteur = $_POST['Auteur'] ;
echo "$auteur"
// ici le echo me renvoie le ID et pas le nom sélectionné !!! ; //

  //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 wink

Hors ligne

#2 05-05-2011 16:25:45

moogli
Modérateur
Inscription : 08-05-2009
Messages : 336
Site Web

Re : Le $_POST me retourne l'ID et pas le nom ???

salut,


ce que tu fait est une bonne pratique wink

Pourquoi ?

Par le sieur Rostand n'a p'tet pas écrit qu'un livre wink 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 wink

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 smile

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

#3 06-05-2011 16:57:02

jean_mi17
Membre
Inscription : 05-05-2011
Messages : 2

Re : Le $_POST me retourne l'ID et pas le nom ???

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 tongue

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

#4 07-05-2011 08:32:28

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : Le $_POST me retourne l'ID et pas le nom ???

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

#5 07-05-2011 18:17:01

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Le $_POST me retourne l'ID et pas le nom ???

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.


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

#6 08-05-2011 13:11:41

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : Le $_POST me retourne l'ID et pas le nom ???

Maljuna Kris a écrit :
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. smile
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. tongue

Hors ligne

#7 08-05-2011 16:42:48

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Le $_POST me retourne l'ID et pas le nom ???

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

Pied de page des forums