Requête sur deux tables et formulaire avec liste de choix

Eléphant du PHP | 64 Messages

06 avr. 2017, 15:00

Bonjour à tous!

J'essaie d'améliorer une requête de modification d’informations. Elle est reliée à un formulaire de saisie qui comporte une liste de choix issue d'une table.

Ce projet tourne uniquement sur wamp server car il me sers à apprendre le SQL et le PHP pour un projet ultérieur.

Le code ci-dessous sers à corriger / modifier un enregistrement. Il marche à peu près et bien que j'ai corrigé quelques problèmes il y en a d'autres dont je ne connais pas le nom du coup pour trouver la solution c'est pas évident. :lol:

Voila le code du fichier de modification :
<?php
// Connexion à la base de données

include ('cnxBdd.php');



   // On récupère les donnée de l'article séléctioné
    $reponse = $bdd->prepare('
	SELECT 
		personnalite.nom, 
		personnalite.prenom, 
		personnalite.prenom2, 
		personnalite.surnom, 
		personnalite.Vprenom1, 
		personnalite.Vprenom2, 
		personnalite.Vnom, 
		DATE_FORMAT(personnalite.naissance, "%d/%m/%Y") AS naissance, 
		DATE_FORMAT(personnalite.mort, "%d/%m/%Y") AS mort, 
		personnalite.sexe_id AS psexe_id, 
		sexe.snom AS snom,
		sexe.sexe_id AS ssexe_id,
		personnalite.photo, 
		personnalite.PersonnaliteLien, 
		personnalite.PersonnaliteAvatar, 
		personnalite.id  
	FROM personnalite
	LEFT JOIN sexe ON personnalite.sexe_id = sexe.sexe_id

	WHERE id = ?
	');
    $reponse->execute(array($_GET['number']));
		
	while ($donnees = $reponse->fetch())
    {
    ?>

<!--Formulaire avec les champs préremplis-->

<p>	
<form action="modifier_post.php" method="post" id="modif_personnalite">


<label for="id">id </label><input type="text" name="id" value="<?php echo $donnees['id'];?>" tabindex="20"/><br/>
   
        
<label for="nom">Nom </label><input type="text" name="nom" value="<?php echo $donnees['nom'];?>" tabindex="20"/><br/>
     

<label for="prenom">Prénom </label><input type="text" name="prenom" value="<?php echo $donnees['prenom'];?>" tabindex="20"/><br/>
    

<label for="prenom2">Prénom 2 </label><input type="text" name="prenom2" value="<?php echo $donnees['prenom2'];?>" tabindex="20"/><br/>


<label for="surnom">Surnom </label><input type="text" name="surnom" value="<?php echo $donnees['surnom'];?>" tabindex="20"/><br/>


<label for="Vprenom1">Vraie prénom 1 </label><input type="text" name="Vprenom1" value="<?php echo $donnees['Vprenom1'];?>" tabindex="20"/><br/>


<label for="Vprenom2">Vraie prénom 2 </label><input type="text" name="Vprenom2" value="<?php echo $donnees['Vprenom2'];?>" tabindex="20"/><br/>
      

<label for="Vnom">Vraie nom </label><input type="text" name="Vnom" value="<?php echo $donnees['Vnom'];?>" tabindex="20"/><br/>


<label for="naissance">Date de naissance </label><input type="text" name="naissance" value="<?php echo $donnees['naissance'];?>"tabindex="20"/><br/>
  
    
<label for="mort">Date de décès </label><input type="text" name="mort" value="<?php echo $donnees['mort'];?>"tabindex="20"/><br/>  


<label for="psexe_id">Sexe H/F </label><input type="text" name="psexe_id" value="<?php echo $donnees['psexe_id'];?>"tabindex="20"/> 

			 <select name="sexe_id" id="sexe_id">
		
        <?php

include ('cnxBdd.php');


$sexe = $bdd -> query('	SELECT  
							sexe.sexMin, 
							sexe.sexe_id, 
							sexe.snom
						FROM sexe
						ORDER BY snom ASC');

while ($donnees = $sexe->fetch()) {
    echo '<option value="',$donnees['sexe_id'],'"';
    if (!empty($_POST['sexe']) && $_POST['sexe'] == $donnees['sexe_id']) {
        echo ' selected="selected"';
    }
    echo '>', $donnees['snom'],'</option>';
}
		$sexe->closeCursor();
			
			?>
			</select>  <br /> 
      

<label for="photo">Photo </label><input type="text" name="photo" value="<?php echo $donnees['photo'];?>" tabindex="400"/><br/>	
    
    
<label for="PersonnaliteLien">Lien sujet personnalité </label><input type="text" name="PersonnaliteLien" value="<?php echo $donnees['PersonnaliteLien'];?>" tabindex="400"/><br/>	
    
    
<label for="PersonnaliteAvatar">Avatar personnalité </label><input type="text" name="PersonnaliteAvatar" value="<?php echo $donnees['PersonnaliteAvatar'];?>" tabindex="400"/><br/>	   
    
    <br />
    
    <input type="submit" value="Envoyer" />
	  
    <?php
    } 

// Fin de la boucle pour l'affichage des donnée dans la base de donnée
    $reponse->closeCursor();


?>
</form>
</p>
J'ai un problème avec la correction du sexe de la personnalité. Tout d'abord je ne trouve pas comment faire afficher le nom (snom) à la place de l'id de la table (sexe_id). J'ai tenté avec un AS pour que le Snom soit affiché à la place de l'id mais c'est pas ça.

Aussi, quand il n'y a pas besoin de faire cette correction, pour l'information sexe et que la liste déroulante issue de la table sexe n'est pas touchée ça change quand même après validation du formulaire. Par ce que l'information de la liste déroulante est prise en priorité.

Et puis dernier truc assez ennuyeux...
Toutes les informations qui devraient être affichées par le formulaire après le sexe ne s'affichent pas et biensûre quand je valide le formulaire ça enlève tout.
Quand j'enlève la mini requête pour afficher la liste déroulante ça fonctionne. Les informations sont affichées...

Je ne comprend pas ce que je fais mal est-ce que vous pourriez m'orienter?

Merci à vous.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

07 avr. 2017, 08:26

salut,

ta liste déroulante est correct avec l'id en value de l'option et le nom en label, nickel.

Par contre quand tu test pour sélectionner la bonne option tu utilise un champs de formulaire qui n'existe pas $_POST['sexe'] c'est sexe_id le nom du select ;)

tu as un autre problème, la requête sur le sexe écrases la variable $donnees du coup ce qu'il y a en dessous de l'affichage du sexe ne fonctionne pas. (voir remarque ci dessous)

tous ceci m'indique que soit tu n'affiches pas les erreurs soit le niveau de report n'est pas approprié.
En dev il faut impérativement avoir modifie ton php.ini pour y mettre ces valeurs et redémarre apache tu vas voir une tonne d'erreur (dues à ce que j'ai mis avant).

Remarque plus globale :
  • Je ne pense pas que les sexe change entre deux personnes c'est un domaine assez limité
  • Pourquoi une table et pas un varchar(1) avec une contrainte check (sexe in( h,f,u)) ( homme, femme, inconnu)
  • En gardant la table il faut impérativement que cette requête soit faire avant le select des données tu met le résultat dans un tableau. Avec PDO c'est simple il y a la méthode fetchAll() !
  • a quoi peux bien servir cet input : <input type="text" name="psexe_id" value="<?php echo $donnees['psexe_id'];?>"tabindex="20"/> ? (il me semble que la liste déroulante est suffisante.
@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 64 Messages

07 avr. 2017, 20:31

Bonjour moogli

En effet dans la mini requête les éléments liés au POST étaient faux c'est que j'avais oublié de remettre comme avant. J'ai fait pas mal d'essais pour trouver d'où l'erreur provenait.

Concernant l'affichage des erreurs j'ai vérifié ce que tu conseil et tout était déjà su ON. D'ailleurs c'est bien pratique car ça donne la ligne où il y a un problème avec quelques infos intéressantes.

Alors pour la modification de l'information sexe c'est car c'est un élément avec peu de variable et donc simple à manipuler. Il me sers à apprendre à manipuler le code de ce type avant de le faire avec quel que chose de plus complexe comme les liste déroulantes imbriquées (pour les villes et pays)... Aussi ça ne servira pas qu'au personnalités mais surtout aux personnages et j'en passe. Comme je le disais c'est pour apprendre pour un projet ultérieur. Je test toutes les possibilités avant de vraiment me lancer.


Concernant la questions que tu poses pour l'utilité de "<input type="text" name="psexe_id" value="<?php echo $donnees['psexe_id'];?>"tabindex="20"/>", Ca affiche ce qui a été saisi dans la table pour la personne choisie. J'ai que le chiffre car c'est la clé étrangère de la table sexe. La liste déroulante affichée à côté permet de faire l'éventuelle correction en sélectionnant la bonne valeur. Ca évite une éventuelle saisie erronée.
Du coup, comme il y a deux éléments je pense que c'est à cause de ça que ça va pas.
J'ai fait comme ça car j'arrivais pas à afficher le bon résultat dans la liste déroulante ou je sais pas comme on doit faire normalement dans ces cas là.

Et pour ce que est "il faut impérativement que cette requête soit faire avant le select des données tu met le résultat dans un tableau" tu veux dire que je dois faire ma mini requête avant le "<input type="text" name="psexe_id" value="<?php echo $donnees['psexe_id'];?>"tabindex="20"/> "? Je ne comprend pas trop.

Je suis entrain de lire la page liée à fetchAll()
Merci

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

10 avr. 2017, 09:59

pour la sortie de la requête sur le sexe, tu fais ce que l'on appelle n+1 requêtes. imagine que tu affiches 1000 personnes tu vas faire 1001 requêtes (pas nuits ;) ).
c'est totalement inutile et anti-performant tu peux n'en faire que deux.

-select des sexes => résultat dans un tableau
- select des gens
- while de "traitement"
-- utilisation du tableau quand il y a besoin
- fin while
- closeCurosor() de la requête "gens"
- closeCurosor() de la requête "sexe"


supprime le champs texte du sexe et utilise que le select ;)


@+
Il en faut peu pour être heureux ......