Partage
  • Partager sur Facebook
  • Partager sur Twitter

[PHP/MYSQL] - Données stockées incomplètes

Ou plus concrètement ce qui suit un espace n'est pas pris en compte

Sujet résolu
    18 février 2021 à 14:49:29

    Bonjour les zéros (Le surnom est toujours d'actu ?)

    Je viens vers vous aujourd'hui car je rencontre un problème dans la création d'un site.

    Pour faire simple, il s'agit d'un formulaire à remplir. Une fois complété, les données sont stockées dans une table "Users" de ma BDD et sont affichés sous mon formulaire sous forme de tableau (ce qui donne une liste des membres avec chaque colonne correspondant à un renseignement du formulaire).

    Dans ce formulaire, j'utilise à un moment une balise <select> qui récupère son contenu dans une autre table nommée "Departements" et m'affiche correctement les départements dans la liste de choix.

    C'est là que le problème survient, mes départements sont écrits de la façon suivante : 01 - Ain (pour avoir le n° et le nom du département)

    Comme dit juste avant, dans le formulaire il n'y a pas de soucis, tout est bien écrit de la même manière (01 - Ain). Par contre lors de l'envoi du formulaire, ce champ est stocké de la manière suivante : 01 (donc je perd " - Ain") et du coup est affiché aussi comme ça dans ma liste de membres.

    Ca fait un moment que je cherche où se situe le problème, mais sans succès. J'ai trouvé un ancien poste sur ce forum (https://openclassrooms.com/forum/sujet/probleme-champ-ne-prend-pas-en-compte-les-espaces-56473) assez similaire, quoi que lui semblait tout de même stocker entièrement la valeur.

    Quelques renseignements complémentaires, mes tables sont en UTF8_General_Ci et j'utilise le type VarChar(255) pour ces valeurs.

    Auriez-vous une piste pour résoudre ce problème ? :/

    Merci d'avance !

    -
    Edité par tackechy 3 mars 2021 à 10:58:08

    • Partager sur Facebook
    • Partager sur Twitter
      18 février 2021 à 16:25:05

      Bonjour,

      Peux-tu poster :

      • le code PHP qui récupère la liste des départements et crée le HTML du formulaire
      • le code PHP qui traite le formulaire et l'insère en base
      • le code PHP qui récupère les données et les affiche dans le tableau
      • la structure de ta base (tables, colonnes, types et encodage)

      -
      Edité par Benzouye 18 février 2021 à 16:25:32

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        18 février 2021 à 18:01:56

        Bonjour Benzouye,

        merci pour ta réponse rapide, pour reprendre tes points :

        • le code PHP qui récupère la liste des départements et crée le HTML du formulaire
        <select type="text" name="departement" required>
        			<option value="">Département* ...</option>
        			<?php
        			{
        				$reponse = $conn->query('SELECT nom FROM departements');
        				while ($row = $reponse->fetch())
        				{
        					echo '<option value='.$row['nom'].'>'.$row['nom'].'</option>';
        				}
        			}
        			?>
        Oui oui le nom de ma colonne dans ma table "departements" s'appelle bien "nom".
        • le code PHP qui traite le formulaire et l'insère en base
        	if( // Vérification - Si les champs NE SONT PAS vide
        		!empty($civilite)
        		AND	!empty($nom)
        		AND !empty($prenom)
        		AND !empty($ville)
        		AND !empty($departement)
        		AND !empty($telephone)
        		AND !empty($email)
        		AND !empty($mdp)
        		AND !empty($mdp2)
        	)
        
        	{
        
        		$conn->query('INSERT INTO users (civilite, nom, prenom, adresse, ville, departement, telephone, email, mdp) VALUES ("'.$civilite.'", "'.$nom.'", "'.$prenom.'", "'.$adresse.'", "'.$ville.'", "'.$departement.'", "'.$telephone.'", "'.$email.'", "'.$mdp.'")'); // Alors on se connecte à la BDD et on ajoute les champs dans la BDD
        		echo("Membre ajouté !");
        
        	}
        
        	else $return = "Merci de renseigner les champs obligatoires (*)."; // Sinon on affiche un message d'erreur
        
        }
        • le code PHP qui récupère les données et les affiche dans le tableau
        <!-- TABLEAU D'AFFICHAGE -->
        		<table>
        
        			<thead> <!-- En-tête du tableau -->
        				<tr>
        
        					<th>ID</th>
        					<th>Civilité</th>
        					<th>Nom</th>
        					<th>Prénom</th>
        					<th>Adresse</th>
        					<th>Ville</th>
        					<th>Département</th>
        					<th>Téléphone</th>
        					<th>Email</th>
        					<th>Tarif horaire</th>
        					<th>Disponibilité</th>
        
        
        
        				</tr>
        			</thead>
        
        			<tbody> <!-- Corps du tableau -->
        				
        				<?php
        				{
        				$reponse = $conn->query('SELECT * FROM users'); // Connexion à la BDD et requête de sélection de TOUT le contenu de la table 'user'
        				while ($row = $reponse->fetch()) // Tant qu'il y a une ligne, la stocker dans la variable $row
        				{
        					?>
        
        					<tr>
        
        						<td><?php echo $row['userid']; ?></td>
        						<td><?php echo $row['civilite']; ?></td>
        						<td><?php echo $row['nom']; ?></td>
        						<td><?php echo $row['prenom']; ?></td>
        						<td><?php echo $row['adresse']; ?></td>
        						<td><?php echo $row['ville']; ?></td>
        						<td><?php echo $row['departement']; ?></td>
        						<td><?php echo $row['telephone']; ?></td>
        						<td><?php echo $row['email']; ?></td>
        						<td><?php echo $row['tarification']; ?></td>
        						<td><?php echo $row['disponibilite']; ?></td>
        
        					</tr>
        
        					<?php
        				}
        			}
        			?>
        		</tbody>
        
        	</table>
        • la structure de ta base (tables, colonnes, types et encodage)
        Dans ma base de donnée, j'utilise deux tables :
        
        
        Départements (UTF8_General_Ci):
        
        - Colonne "nom", type VarChar(255), encodage UTF8_General_Ci
        
        
        
        Users (UTF8_General_Ci):
        
        - Colonne "ID", type Int(11), AUTO INCREMENT
        
        - Colonne "civilite", type VarChar(255), encodage UTF8_General_Ci
        
        - Colonne "nom", type VarChar(255), encodage UTF8_General_Ci
        
        - Colonne "prenom", type VarChar(255), encodage UTF8_General_Ci
        
        - Colonne "adresse", type VarChar(255), encodage UTF8_General_Ci, NULL
        
        - Colonne "ville", type VarChar(255), encodage UTF8_General_Ci
        
        - Colonne "departement", type VarChar(255), encodage UTF8_General_Ci
        
        - Colonne "telephone", type VarChar(14), encodage UTF8_General_Ci
        
        - Colonne "email", type VarChar(255), encodage UTF8_General_Ci
        
        - Colonne "mdp", type VarChar(40), encodage UTF8_General_Ci
        
        - Colonne "tarification", type int(3), NULL
        
        - Colonne "disponibilite", type tinyint(1), NULL
        • Partager sur Facebook
        • Partager sur Twitter
          18 février 2021 à 18:32:40

          Alors je ne vais pas te faire plaisir avec ma réponse, mais normalement, en toute rigueur, tu devrais avoir une colonne ID dans la table Departements, clé primaire, auto incrémentée ou non (tu peux utiliser le code département directement) ...

          Et dans la table Users tu devrais avoir une colonne id_departement, clé étrangère vers la table Departements ...

          Ta balise select aurait pour value l'id et pour label le nom ...

          Pour récupérer les Users tu ferais une jointure entre Users et Departements ... c'est le principe même des base de données relationnelles ...

          Je sais que cela ne résous pas ton problème immédiat, mais étant dans le forum base de données je me devais de t'orienter sur une solution plus propre ...

          Bon, sinon, dans ton fichier PHP de traitement du formulaire, on voit une variable $departement (ligne 6 plus haut), comment la définis-tu ?

          Enfin, quels sont les encodages, de tes fichiers PHP, de ta connexion à MySQL (via PDO, variable $conn), de ton <head> HTML ?

          -
          Edité par Benzouye 18 février 2021 à 18:35:28

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            2 mars 2021 à 15:06:47

            Bonjour Benzouye,

            désolé pour le temps de réponse, comme je suis en alternance je n'ai pas eu le temps de revenir sur ce sujet.

            Alors je ne comprend pas tout dans ton dernier message, qu'est-ce qu'une clé étrangère et comment la définit-on depuis PhpMyAdmin ? Je sais qu'il est possible de gérer ça sous forme de "nodes" grâce à un logiciel mais autrement je ne sais pas du tout comment faire, et j'avoue que je n'ai pas tout compris au système de liens entre différentes tables, pour les quelques fois où j'ai essayé :-°

            Pour la variable $departement je l'ai définie de la même façon que les autres variables à savoir :

            if(isset($_POST['inscription'])) // Si le bouton "INSCRIPTION" est pressé
            {
            
            	$civilite = $_POST['civilite'];
            	$nom = $_POST['nom'];
            	$prenom = $_POST['prenom'];
            	$adresse = $_POST['adresse'];
            	$ville = $_POST['ville'];
            	$departement = $_POST['departement'];
            	$telephone = $_POST['telephone'];
            	$email = $_POST['email'];
            	$mdp = $_POST['mdp'];
            	$mdp2 = $_POST['mdp2'];

            Pour ce qui est des encodages, pour PHP je ne sais pas, il faut le définir quelque part ? Pour ma connexion MySQL tout comme pour mon head HTML j'utilise le charset utf-8.

            • Partager sur Facebook
            • Partager sur Twitter
              2 mars 2021 à 15:18:33

              Je te conseille donc de lire le cours MySQL, puis PHP/MySQL (Cf. Ma signature).

              Tout y est expliqué... les clés, les encodages, la base quoi...

              Pour ton problème, commence par vérifier le type de colonne qui stocke la donnée en base ... c'est peut être simplement un CHAR(2) ...

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                2 mars 2021 à 15:27:31

                Merci du conseil mais effectivement j'ai déjà bien commencé à regarder le cours de PHP/MySQL, en revanche c'est vrai que le cours sur MySQL seulement sera peut-être plus détaillé sur cette partie là !

                Sinon j'ai déjà vérifié s'il s'agissait d'un problème de longueur, mais non, ma colonne "departements" est en VARCHAR(255), j'ai aussi fait un test en rajoutant simplement une ligne de texte dans ma table de départements, et après l'avoir sélectionnée et validée dans le formulaire, le texte est bien entier, il n'est pas coupé comme pour les départements juste après le n° de département.

                -
                Edité par tackechy 2 mars 2021 à 15:28:38

                • Partager sur Facebook
                • Partager sur Twitter
                  3 mars 2021 à 10:03:39

                  Bonjour,

                  Déplacement vers un forum plus approprié

                  Le sujet est déplacé de la section Base de données vers la section PHP

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    9 mars 2021 à 11:06:55

                    Petit up pour dire que j'ai trouvé la solution à mon problème : 

                    ça se passe ici, j'avais simplement oublié des apostrophes doubles (dans le résultat renvoyé par l'echo) pour encadrer le résultat, du coup dès qu'il y avait un espace tout le reste sautait, l'espace y compris !

                    <select type="text" name="departement" required>
                                <option value="">Département* ...</option>
                                <?php
                                {
                                    $reponse = $conn->query('SELECT nom FROM departements');
                                    while ($row = $reponse->fetch())
                                    {
                                        echo '<option value="'.$row['nom'].'">'.$row['nom'].'</option>';
                                    }
                                }
                                ?>

                    Du coup je passe le sujet en résolu. Finalement les fautes de syntaxe sont toujours principalement la cause des problèmes :lol:

                    -
                    Edité par tackechy 9 mars 2021 à 11:11:26

                    • Partager sur Facebook
                    • Partager sur Twitter

                    [PHP/MYSQL] - Données stockées incomplètes

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown