IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Problème d'incrémentation de table croisées dans base de données


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juillet 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2015
    Messages : 59
    Points : 32
    Points
    32
    Par défaut Problème d'incrémentation de table croisées dans base de données
    Bonjour, je suis débutant en PHP et je rencontre un problème sur un blog que j'essaye de développer dans une arborescence mvc.

    J'ai une page sur laquelle je peux publier un article - à laquelle j'accède après m'être identifié qui incrémente une base de données - en croisant les données d'une autre table - à partir d'un formulaire. Elle affiche également les articles déjà stockés dans la table de ma base (que j'ai incrémenté "manuellement").
    Tout semble bien se passer - je n'ai pas de message d'erreur qui s'affiche lorsuqe j'envoi un article - hormis que les données qui sont transmises par le formulaire ne sont pas incrémentées dans ma table 'cible'

    Voici le code de la page qui contient le formulaire d'envoi des données à la base :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    <meta charset="utf-8">
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
        <head>
            <title>Derniers articles du blog</title>
            <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
            <link href="vue/blog/style.css" rel="stylesheet" type="text/css" /> 
        </head>
     
        <body>
    		<fieldset>
    		 <form action="../../modele/blog/traitement.php" method="POST">
    				<p>
    				<?php include_once('../../modele/connexion_sql.php');
     
    				$champcategorie='<select name="id">' ;
    				$champcategorie.='<option value="'.'">'.'< Choisissez votre catégorie >'.'</option>';
    				$reponse = $bdd->query("SELECT id FROM categorie");
    				while ($donnees = $reponse->fetch())
    					{
    						//la concatenation des champs se fait ici
    						 $champcategorie.='<option value="'.$donnees['id'].'">'.$donnees['id'].'</option>'; 
    					}
    					echo 	$champcategorie;	
    			?>
     
    				</select>
    			</p>
                    <p><label> pseudo : </label> <input type="text" name="pseudo" value="<?php if(isset($_COOKIE['pseudo'])) echo $_COOKIE['pseudo']; ?>" placeholder="Votre pseudo ici" /><p>
    				<p><label> Titre de votre article : </label> <input type="text" name="titre_article" id="titre_article"></textarea></p>
    				<p><label> Texte de votre article </label> <textarea name="texte_article" id="texte_article">un texte par defaut ...</textarea></p>
                    <p> <input type="submit"/></p>
             </form>     
    		</fieldset>
                    <p>Derniers articles du blog :</p>
     
    <?php
    include_once('../../controleur/blog/article.php');
     
    foreach($billets as $billet)
    {
    ?>
    <div class="news">
        <h3>
            <?php echo $billet['titre_article']; ?>
            <em>le <?php echo $billet['date_redaction_fr']; ?></em>
        </h3>
     
        <p>
        <?php echo $billet['texte_article']; ?>
        <br />
        </p>
    </div>
    <?php
    }
    ?>
    </body>
    </html>
    et voici le code de la page qui traite les données envoyées par ma page article pour les mettre dans la base de données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    <?php 
     
     
    		include_once('../connexion_sql.php');
     
    		if (isset ($_POST['nom']) AND($_POST['pseudo']) AND ($_POST['titre_article']) AND ($_POST['texte_article']))
    				{
    						$nom = htmlspecialchars(trim($_POST['nom']));
    						$pseudo = htmlspecialchars(trim($_POST['pseudo']));
    						$titre_article = htmlspecialchars(trim($_POST['titre_article']));
    						$texte_article = htmlspecialchars(trim($_POST['texte_article']));
     
    					$requete = $bdd->prepare('INSERT INTO categorie_article(categorie_id, pseudo, titre_article, texte_article, date_creation) VALUES(?, ?, ?, ?, NOW()) INNER JOIN Categorie ON categorie_article.categorie_id = categorie.nom');
    					$requete->execute(array(htmlspecialchars($_POST['nom']),htmlspecialchars($_POST['pseudo']), htmlspecialchars($_POST['titre_article']), htmlspecialchars($_POST['texte_article'])));
    				}
     
    			header('Location: ../../blog.php');
     
     
    ?>
    Comme annoncé plus haut, je n'obtiens pas de message d'erreur mais mes données ne sont pas incrémentées dans ma table ...

    Quelqu'un pourrait-il m'aider en me disant ce qui ne marche pas dans mes scripts ?

    Merci par avance.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    - ta condition isset() est mal écrite
    - tous tes htmlspecialchars sont inutiles ou du moins mal venus
    - tu utilises trim() sur tes données mais tu fais insertion sur les valeurs directes
    - la jointure n'a rien à faire dans l'insertion
    - et surtout il manque le champs "nom" dans ton formulaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (isset($_POST['nom'], $_POST['pseudo'], $_POST['titre_article'], $_POST['texte_article'])
    				{
    						$nom = trim($_POST['nom']);
    						$pseudo = trim($_POST['pseudo']);
    						$titre_article = trim($_POST['titre_article']);
    						$texte_article = trim($_POST['texte_article']);
     
    					$requete = $bdd->prepare('INSERT INTO categorie_article (categorie_id, pseudo, titre_article, texte_article, date_creation) VALUES(?, ?, ?, ?, NOW())');
    					$requete->execute(array($nom, $pseudo, $titre_article, $texte_article));
    }
    Essaye aussi de lire ces cours et tutoriels PHP.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juillet 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2015
    Messages : 59
    Points : 32
    Points
    32
    Par défaut Problème d'incrémentation de table croisées dans base de données
    Merci Sabotage,

    j'ai corrigé le code de ma page traitement comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    <?php 
     
     
    		include_once('../connexion_sql.php');
     
    		if (isset($_POST['nom']) AND (isset($_POST['pseudo'])) AND (isset($_POST['titre_article'])) AND (isset($_POST['texte_article'])))
    				{
    						$nom = $_POST['nom'];
    						$pseudo = $_POST['pseudo'];
    						$titre_article = $_POST['titre_article'];
    						$texte_article = $_POST['texte_article'];
     
    					$requete = $bdd->prepare('INSERT INTO categorie_article(nom, pseudo, titre_article, texte_article, date_creation) VALUES(?, ?, ?, ?, NOW())');
    					$requete->execute(array(htmlspecialchars($_POST['nom']),htmlspecialchars($_POST['pseudo']), htmlspecialchars($_POST['titre_article']), htmlspecialchars($_POST['texte_article'])));
    				}
     
    			header('Location: ../../blog.php');
     
     
    ?>
    mais ça ne fonctionne toujours pas ...


    Aussi et pour information, je tente de croiser mes tables dans ma requête d'insertion parce que je dispose de deux tables dans ma base de données :

    - une table categorie_article - dans laquelle sont incrémentées les données du formulaire (categorie_id, article_id, pseudo, tire_article, texte_article, date_redaction)
    - une table 'categorie' qui donne un 'id' aux catégorie du formulaire de sélection de la page article.php quand j'écris mon article (id, nom, description, date_creation).

    Pour confirmation, sur ma page article.php je sélectionne le champ 'nom' de ma table 'categorie', je souhaiterais que ce soit l''id' de ma table 'categorie' qui soit enregistré dans ma table 'categorie_article' avec les autres données.


    J'espère être clair ... Vois-tu ce qui ne fonctionne pas ? Merci pour ton aide en tout cas

  4. #4
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Cette phrase : "je sélectionne le champ 'nom' de ma table 'categorie'", laisse supposer que tu crées un select avec les valeur de ta table catégorie, donc on imagine que le value correspond aux id en corespondance des noms.
    Donc il suffit de récupérer cela en POST.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par mrc_AO Voir le message
    Merci Sabotage,

    j'ai corrigé le code de ma page traitement comme suit :
    Bravo !
    Quand quelqu'un te donne un code, à priori fonctionnel et optimisé (*), pourquoi le modifies-tu "à ta sauce" ???

    Regarde le code de sabotage et le tien (soit disant "corrigé").


    N.B. Etre "débutant" n'est pas le problème. Par contre, il faut faire preuve de CURIOSITE :
    quand on ne connais pas les fonctions utilisées : on fait une recherche !

    On apprend à quoi ça sert, mais aussi QUAND s'en servir.






    (*) il n'y manque qu'une parenthèse fermante :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if ( isset($_POST['nom'], $_POST['pseudo'], $_POST['titre_article'], $_POST['texte_article']) )
    {

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juillet 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2015
    Messages : 59
    Points : 32
    Points
    32
    Par défaut Problème d'incrémentation de table croisées dans base de données
    Bonjour Jreaux,

    Mes excuses pour ce retour "tardif", j'avais des contraintes hier qui m'ont empêché de te répondre et, merci

    Je dois admettre que j'avais des problèmes de concentration hier, ayant passé une bonne partie de l'après-midi sur ce problème en parallèle de mon boulot.
    Aussi, j'ai bien effectué une recherche documentée sur ces expressions bien que je n'en avais pas l'air ... C'est un début il faut que ça rentre ...

    J'ai corrigé mon code comme tu me le suggères mais cela ne change guère le comportement de mes pages. Les informations ne sont toujours pas incrémentées dans la table 'categorie_article' de ma base de données ...

    Je me demande si le problème ne vient pas de ce menu déroulant sur lequel je choisi un nom de catégorie sur ma page article.php ... Pour confirmation, je n'ai pas de colonne "nom de catégorie" dans la table 'categorie_article' que je souhaite incrémenter.

    En réalité, ce que je voudrais faire, c'est :

    1 - sélectionner un nom de catégorie sur ma page article.php

    2 - renseigner les champs du formulaire (titre_article, texte_article, pseudo, etc.)

    3- une fois que je valide le formulaire renseigné sur ma page article.php, traitement.php incrémente les colonnes de ma table 'categorie_article' et notamment la colonne 'categorie_id' qui reprend les 'id' de ma table 'categorie' (qui elle figure une colonne 'nom' que l'on retrouve dans le menu déroulant de ma page article.php ... d'où l'instruction de jointure de ma première instruction que Sabotage m'a fait corriger ...

    La question que je me pose c'est comment articuler les tables 'categorie_id' et 'categorie' depuis ma page traitement.php - et plus particulièrement à partir du menu déroulant de la page qui permet de choisir une catégorie d'article ...? cette instruction doit-elle passer par le fichier .sql de création des tables ci-dessous ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    CREATE DATABASE p2p_blog CHARACTER SET 'utf8';
     
    USE p2p_blog;
     
    CREATE TABLE Categorie (
    id INT UNSIGNED AUTO_INCREMENT,
    nom VARCHAR(150) NOT NULL,
    description VARCHAR(150),
    date_creation DATE,
    PRIMARY KEY(id)
    );
     
    CREATE TABLE Categorie_article (
    categorie_id INT UNSIGNED,
    article_id INT UNSIGNED,
    pseudo VARCHAR(150) NOT NULL,
    titre_article VARCHAR(150) NOT NULL,
    texte_article TEXT NOT NULL,
    date_redaction DATE,	
    PRIMARY KEY (categorie_id, article_id)
    );
     
    CREATE TABLE Utilisateurs (
    id INT UNSIGNED AUTO_INCREMENT,
    pseudo VARCHAR(150) NOT NULL,
    email VARCHAR(150) NOT NULL,
    password VARCHAR(150) NOT NULL,
    date_inscription DATE,
    Articles_ecrits VARCHAR(150),
    PRIMARY KEY(id)
    );
     
    CREATE TABLE Commentaires_article (
    id INT UNSIGNED AUTO_INCREMENT,
    article_id INT UNSIGNED,
    texte_article TEXT NOT NULL,
    date_creation DATE,
    PRIMARY KEY(id)
    );

  7. #7
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Peux-t-on voir ce fameux menu déroulant de la page article.php ?

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juillet 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2015
    Messages : 59
    Points : 32
    Points
    32
    Par défaut Problème d'incrémentation de table croisées dans base de données
    Bonjour Matire Pylos,

    oui bien sûr ... Ci-dessous. et merci pour ton aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?php include_once('../../modele/connexion_sql.php');
     
    				$champcategorie='<select name="nom">' ;
    				$champcategorie.='<option value="'.'">'.'< Choisissez votre catégorie >'.'</option>';
    				$reponse = $bdd->query("SELECT nom FROM categorie");
    				while ($donnees = $reponse->fetch())
    					{
    						//la concatenation des champs se fait ici
    						 $champcategorie.='<option value="'.$donnees['nom'].'">'.$donnees['nom'].'</option>'; 
    					}
    					echo 	$champcategorie;	
    			?>
    Le script se trouve en dans mapage article.php bien sûr.

  9. #9
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Bonjour,
    Alors dèja si tu remplace comme ceci, tu récupéras directement l'id de article que tu pourras mettre dans la bonne table

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $champcategorie.='<option value="'.$donnees['id'].'">'.$donnees['nom'].'</option>';
    Il ne reste plus qu'a le récupérer via $_POST['nom'].

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    il manque la fermeture de la balise </select> dans le code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    					$champcategorie .= '</select>';
    					echo 	$champcategorie;
    CONSEIL d'ami :

    Pour te faciliter la vie, et éviter les confusions qui peuvent faire perdre des heures (à toi, et/ou aux autres)
    ECRIS DES NOMS DE VARIABLES EXPLICITES et significatifs !!


    <select name="nom"> n'est pas approprié, si ce que tu veux récupérer est l'ID de la catégorie.
    Ecris plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <select name="id_categorie">
    Idem :
    $champcategorie -> $select_categorie est plus clair.

    Idem pour la désignation des colonnes des tables en BdD.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    id INT UNSIGNED AUTO_INCREMENT,
    "id" dans toutes les tables : bravo si tu ne t'emmêles jamais les pinceaux dans les requêtes !
    A privilégier :
    • categorie_id
    • article_id
    • commentaire_id
    • ...

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juillet 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2015
    Messages : 59
    Points : 32
    Points
    32
    Par défaut
    Merci Jreaux pour tes conseils éclairés.

    Toutefois, je n'ai pas entièrement la main sur ce problème, il s'agit ici d'un nommage des id qui m'est donné dans mon tutoriel ... Mais j'ai bien compris le point.

    Juste un point que je n'ai pas saisi dans ta dernière explication :

    $champcategorie -> $select_categorie devrait remplacer $champcategorie='<select name="id_categorie">' ; ?

    c'est bien ce que tu veux dire ?

    J'ai corrigé comme suit mais cela ne fonctionne toujours pas ...

    Mon formulaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
     <form action="../../modele/blog/traitement.php" method="POST">
    				<p>
    				<?php include_once('../../modele/connexion_sql.php');
     
    				$champcategorie='<select name="id_categorie">' ;
    				$champcategorie.='<option value="'.'">'.'< Choisissez votre catégorie >'.'</option>';
    				$reponse = $bdd->query("SELECT * FROM categorie");
    				while ($donnees = $reponse->fetch())
    					{
    						//la concatenation des champs se fait ici
    						 $champcategorie.='<option value="'.$donnees['id_categorie'].'">'.$donnees['id_categorie'].' - '.$donnees['nom'].'</option>'; 
    					}
    					$champcategorie .= '</select>';
    					echo 	$champcategorie;	
    			?>
     
    				</select>
    			</p>
                    <p><label> pseudo : </label> <input type="text" name="pseudo" value="<?php if(isset($_COOKIE['pseudo'])) echo $_COOKIE['pseudo']; ?>" placeholder="Votre pseudo ici" /><p>
    				<p><label> Titre de votre article : </label> <input type="text" name="titre_article" id="titre_article"></textarea></p>
    				<p><label> Texte de votre article </label> <textarea name="texte_article" id="texte_article">un texte par defaut ...</textarea></p>
                    <p> <input type="submit"/></p>
             </form>
    mon fichier traitement.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    <?php 
    		include_once('../connexion_sql.php');
     
    		if (isset($_POST['id_categorie']) AND (isset($_POST['pseudo'])) AND (isset($_POST['titre_article'])) AND (isset($_POST['texte_article'])))
    				{
    						$id_categorie = $_POST['id_categorie'];
    						$pseudo = $_POST['pseudo'];
    						$titre_article = $_POST['titre_article'];
    						$texte_article = $_POST['texte_article'];
     
    					$requete = $bdd->prepare('INSERT INTO categorie_article(id_categorie, pseudo, titre_article, texte_article, date_creation) VALUES(?, ?, ?, ?, NOW())');
    					$requete->execute(array(htmlspecialchars($_POST['id_categorie']),htmlspecialchars($_POST['pseudo']), htmlspecialchars($_POST['titre_article']), htmlspecialchars($_POST['texte_article'])));
    				}
     
    			header('Location: ../../blog.php');
    ?>
    Je n'ai pas de message d'erreur, je suis bien re-routé vers ma page de blog, mais les données ne sont pas incrémentées ...

  12. #12
    Invité
    Invité(e)
    Par défaut
    Le formulaire semble bon.

    Quant au traitement :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    <?php 
    	include_once('../connexion_sql.php');
     
    	$valid_form = 0;
    	$err_msg = '';
    	if ( isset($_POST['id_categorie'], $_POST['pseudo'], $_POST['titre_article'], $_POST['texte_article']) ) // TOUS les champs sont remplis
    	{
    		// -------------------
    		// 1/ récupération des données du formulaire
    		$id_categorie = trim($_POST['id_categorie']);
    		$pseudo = trim($_POST['pseudo']);
    		$titre_article = trim($_POST['titre_article']);
    		$texte_article = trim($_POST['texte_article']);
    		// -------------------
    		// 2/ Gestion des erreurs
    		if(........){
    			$valid_form = 2;
    			$err_msg .= 'erreur :..........<br>';
    		}
    		if($valid_form != 2){
    			$valid_form = 1;
    		}
    		// -------------------
    		// 3/ Si pas d'erreur : insertion en base de données
    		if($valid_form == 1){
    			// ---------------
    			$sql = "INSERT INTO categorie_article(id_categorie, pseudo, titre_article, texte_article, date_creation) VALUES(?, ?, ?, ?, NOW())";
    			$requete = $bdd->prepare($sql);
    			$requete->execute( array($_POST['id_categorie'], $_POST['pseudo'], $_POST['titre_article'], $_POST['texte_article']) );
    			// ---------------
    			// redirection
    			header('Location: ../../blog.php');
    		} else {
    			// on fait quoi, sinon ?
    			// redirection ?
    			// ré-affichage du formulaire ?
    		}	
    	} else {
    		// on fait quoi, sinon ?
    		// redirection ? vers le formulaire ?
    	}
    ?>
    Plusieurs questions restent en suspens.

    C'est pourquoi il est préférable d'avoir le fichier de traitement INCLUS dans le fichier contenant le formulaire :


  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juillet 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2015
    Messages : 59
    Points : 32
    Points
    32
    Par défaut Problème d'incrémentation de table croisées dans base de données
    Ok Merci Jreaux. Je regarde ça ce soir et ne manquerai pas - je l'espère - de te confirmer demain que tout est bon pour moi

    Grand merci pour ton aide précieuse.

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juillet 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2015
    Messages : 59
    Points : 32
    Points
    32
    Par défaut Problème d'incrémentation de table croisées dans base de données
    Re-bonjour Jreaux,

    c'est encore moi

    bon bah désolé ..., j'y arrive toujours pas ...

    J'ai planché dessus ces deux derniers jours - j'ai même tenté des adaptations du script en le simplifiant - le mieux que j'ai pu obtenir pour l'instant est ce message d'erreur (qui me laisse croire intuitivement quand même que je m'approche de la base de données) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 1364 Field 'article_id' doesn't have a default value' in C:\wamp\www\Cours\03_Administrer_Base_donnees_MSQL\02_TP_p2p_blog\blog_mvc\modele\blog\traitement.php on line 32
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PDOException: SQLSTATE[HY000]: General error: 1364 Field 'article_id' doesn't have a default value in C:\wamp\www\Cours\03_Administrer_Base_donnees_MSQL\02_TP_p2p_blog\blog_mvc\modele\blog\traitement.php on line 32
    Voici les pages sur lesquelles j'ai travaillé :

    le formulaire de ma page article.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    <form action="../../modele/blog/traitement.php" method="POST">
     
         <?php include_once('../../modele/connexion_sql.php');
            $champcategorie='<select name="id_categorie">' ;
            $champcategorie.='<option value="'.'">'.'< Choisissez votre catégorie >'.'</option>';
            $reponse = $bdd->query("SELECT * FROM categorie");
            while ($donnees = $reponse->fetch())
              {
               //la concatenation des champs se fait ici
               $champcategorie.='<option value="'.$donnees['id_categorie'].'">'.$donnees['id_categorie'].' - '.$donnees['nom'].'</option>'; 
               }
            $champcategorie .= '</select>';
            echo 	$champcategorie;	
           ?>
           </p>
            <p><label> pseudo : </label> <input type="text" name="pseudo" value="<?php if(isset($_SESSION['pseudo'])) echo $_SESSION['pseudo']; ?>"         placeholder="Votre pseudo ici" /><p>
             <p><label> Titre de votre article : </label> <input type="text" name="titre_article" id="titre_article"></textarea></p>
             <p><label> Texte de votre article </label> <textarea name="texte_article" id="texte_article">un texte par defaut ...</textarea></p>
             <p> <input type="submit"/></p>
             </form>

    la page traitement qui envoie les données de mon formulaire dans la table 'categorie_article' de ma base de données - j'ai simplifié au maximum les redirections, l'essentiel pour moi étant d'avoir un script simple qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    <?php session_start(); ?>
    <meta charset="utf-8">
     
    <?php 
    include_once('../connexion_sql.php');
     
    	$valid_form = 0;
    	$err_msg = '';
    	if ( isset($_POST['id_categorie'], $_POST['pseudo'], $_POST['titre_article'], $_POST['texte_article']) ) // TOUS les champs sont remplis
    	{
    		// -------------------
    		// 1/ récupération des données du formulaire
    		$id_categorie = trim($_POST['id_categorie']);
    		$pseudo = trim($_POST['pseudo']);
    		$titre_article = trim($_POST['titre_article']);
    		$texte_article = trim($_POST['texte_article']);
    		// -------------------
    		// 2/ Gestion des erreurs
    		if(empty($_POST['id_categorie'])){
    			$valid_form = 2;
    			$err_msg .= 'erreur :..........<br>';
    		}
    		if($valid_form != 2){
    			$valid_form = 1;
    		}
    		// -------------------
    		// 3/ Si pas d'erreur : insertion en base de données
    		if($valid_form == 1){
    			// ---------------
    			$sql = "INSERT INTO categorie_article(id_categorie, pseudo, titre_article, texte_article, date_redaction) VALUES(?, ?, ?, ?, NOW())";
    			$requete = $bdd->prepare($sql);
    			$requete->execute( array($_POST['id_categorie'], $_POST['pseudo'], $_POST['titre_article'], $_POST['texte_article']) );
    		}
    		// ---------------
    		// redirection
    			header('Location: ../../vue/blog/article.php');
    	}
    ?>
    Vois-tu ce qui cloche sur mon script ?

    Merci par avance pour ton aide.

  15. #15
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Il manque article_id dans ta requête.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  16. #16
    Nouveau membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juillet 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2015
    Messages : 59
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Il manque article_id dans ta requête.
    Merci Sabotage, tu veux dire dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = "INSERT INTO categorie_article(id_categorie, article_id, pseudo, titre_article, texte_article, date_redaction) VALUES(?, ?, ?, ?, ?, NOW())";
    ??

  17. #17
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    tout a fait.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  18. #18
    Nouveau membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juillet 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2015
    Messages : 59
    Points : 32
    Points
    32
    Par défaut
    Donc voilà qui est ajouté.

    Mais j'obtiens le message d'erreur suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens' in C:\wamp\www\Cours\03_Administrer_Base_donnees_MSQL\02_TP_p2p_blog\blog_mvc\modele\blog\traitement.php on line 32
     
    PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in C:\wamp\www\Cours\03_Administrer_Base_donnees_MSQL\02_TP_p2p_blog\blog_mvc\modele\blog\traitement.php on line 32
    A ce que j'avais compris, il n'est pas nécessaire de donner une valeur à une clé primaire qui s'auto incrémente ...

    Mon code d'envoi des données est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if($valid_form == 1){
    			// ---------------
    			$sql = "INSERT INTO categorie_article(id_categorie, article_id, pseudo, titre_article, texte_article, date_redaction) VALUES(?, ?, ?, ?, ?, NOW())";
    			$requete = $bdd->prepare($sql);
    			$requete->execute(array($_POST['id_categorie'], $_POST['pseudo'], $_POST['titre_article'], $_POST['texte_article']));
    		}
    vois-tu où je me plante ??

  19. #19
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    dans ce cas, on ne la met pas du tout, et surtout pas avec un ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    			$sql = "INSERT INTO categorie_article
    				(id_categorie, pseudo, titre_article, texte_article, date_redaction) 
    				VALUES
    				(?, ?, ?, ?, NOW())";
    			$requete = $bdd->prepare($sql);
    			$requete->execute(array(
    				$_POST['id_categorie'], 
    				$_POST['pseudo'], 
    				$_POST['titre_article'], 
    				$_POST['texte_article']
    				));
    4 ? -> 4 $_POST dans l'array

    N.B. Facilite-toi la vie : ajoute des indentations dans ton code.

  20. #20
    Nouveau membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juillet 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2015
    Messages : 59
    Points : 32
    Points
    32
    Par défaut
    Ok j'étais en train de modifier comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    <?php session_start(); ?>
    <meta charset="utf-8">
     
    <?php 
    include_once('../connexion_sql.php');
     
    	$valid_form = 0;
    	$err_msg = '';
    	if ( isset($_POST['article_id'], $_POST['id_categorie'], $_POST['pseudo'], $_POST['titre_article'], $_POST['texte_article']) ) // TOUS les champs sont remplis
    	{
    		// -------------------
    		// 1/ récupération des données du formulaire
    		$id_categorie = trim($_POST['id_categorie']);
    		$article_id = trim($_POST['article_id']);
    		$pseudo = trim($_POST['pseudo']);
    		$titre_article = trim($_POST['titre_article']);
    		$texte_article = trim($_POST['texte_article']);
    		// -------------------
    		// 2/ Gestion des erreurs
    		if(empty($_POST['id_categorie'])){
    			$valid_form = 2;
    			$err_msg .= 'erreur :..........<br>';
    		}
    		if($valid_form != 2){
    			$valid_form = 1;
    		}
    		// -------------------
    		// 3/ Si pas d'erreur : insertion en base de données
    		if($valid_form == 1){
    			// ---------------
    			$sql = "INSERT INTO categorie_article(id_categorie, article_id, pseudo, titre_article, texte_article, date_redaction) VALUES(:id_categorie, :article_id, :pseudo, :titre_article, :texte_article, NOW())";
    			$requete = $bdd->prepare($sql);
    			$requete->execute(array($_POST['id_categorie'], $_POST['article_id'], $_POST['pseudo'], $_POST['titre_article'], $_POST['texte_article']));
    		}
    		// ---------------
    		// redirection
    			header('Location: ../../vue/blog/article.php');
    	}
    ?>
    Y a du différent maintenant. Je reste bloqué sur ma page traitement .php ... La question que je me pose : faut-il définir $_POST['article_id'] quelque part dans mon formulaire d'envoi ?

    J'imagine que oui ...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/09/2014, 21h41
  2. Réponses: 2
    Dernier message: 18/03/2010, 13h31
  3. [SQL] problème d'insetion dans la table de la base de données
    Par aroua dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 04/07/2007, 16h21
  4. [VB.NET] Comment créer une table dans base de données ?
    Par ptitesouris dans le forum VB.NET
    Réponses: 3
    Dernier message: 03/05/2006, 08h46
  5. Réponses: 4
    Dernier message: 25/01/2006, 11h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo