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. #21
    Invité
    Invité(e)
    Par défaut
    Si ça ne sert à rien que j'écrive du code (vu que tu n'en tiens pas compte)... dis-le moi...

  2. #22
    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, toutes mes excuses pour ce retour tardif - j'ai eu un week-end plutôt chargé et je crois que nos messages se sont croisés lorsque j'échangeais avec Sabotage mais grand merci pour ton intérêt à mes problématiques de code.

    J'ai testé ta suggestion de code, merci pour cela, mais malheureusement, je n'obtiens guère mieux que ce que j'avais vendredi ... Je reste sur la page traitement.php après avoir renseigné le formulaire de la page article.php ...

    Je commence à me sentir un peu comme un boulet ...

    Pour rappel en espérant que tu ne sois pas découragé pour m'aider - voici le code de me 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
    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
    60
     
    <?php session_start(); ?>
    <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">
     
    				<?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>     
    		</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 celui de ma page de traitement sensée incrémenter ma 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
    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
     
    <?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, 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');
    	}
    ?>
    Je me posait la question de savoir s'il ne vaudrait mieux pas :

    - ajouter une colonne qui ne soit pas liée comme PRIMARY KEY à la table 'categorie' dans ma table 'categorie_article' et qui fasse le lien avec la table 'categorie'. Quelque chose comme 'nom_categorie' et qui permettrait ce lien entre les deux tables : 'categorie_article.nom_categorie' = 'categorie.nom' ...?

    - modifier le statut de ma colonne id_categorie et lui enlever son statut PRIMARY KEY (ce qui irait à l'encoontre de mon énoncé d'exercice ...)

    Je serai intéressé d'avoir ton avis sur ces points ...

    Encore grand merci pour ton aide

    Erratum : à toutes fins utiles et pour rappel voici mon fichier SOURCE pour la création des tables :

    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
    60
    61
    62
    63
     
     
    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)
    );

  3. #23
    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
    Alors :

    Dans ton fichier SQL dans la table categorie tu as une colonne 'id', est-ce bien cela que tu as mis ou alors c'est 'id_categorie'?

    Je vais partir du principe que c'est 'id' puisque c'est dans ton fichier source.

    En partant de ce constat ton formulaire doit-être ceci :

    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="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'].'">'.$donnees['id'].' - '.$donnees['nom'].'</option>'; 
    							}
    							$champcategorie .= '</select>';
    							echo 	$champcategorie;	
    				?>
    Naturellement tu rectifieras au besoin.

  4. #24
    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
    Bonjour MaitrePylos,

    la confusion vient de moi. Dans un échange précédant avec Jreaux j'ai modifié cette partie de la table dans ma base de données sur php myadmin.
    Elle s'appelle bien id_categorie dans ma table 'categorie'. Je n'avais pas mis à jour mon fichier SOURCE ... que voici donc actualisé

    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
    60
    61
    62
    63
     
     
    CREATE DATABASE p2p_blog CHARACTER SET 'utf8';
     
     
    USE p2p_blog;
     
     
     
    CREATE TABLE Categorie (
     
    id_categorie INT UNSIGNED AUTO_INCREMENT,
     
    nom VARCHAR(150) NOT NULL,
     
    description VARCHAR(150),
    date_creation DATE,
    PRIMARY KEY(id_categorie)
    );
     
     
     
    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)
    );
    Y vois-tu quelque chose qui cloche ? ou alors faut-il modifier quelque chose dans les colonne de la table 'categorie' (ajouter une colonne 'id' ...?).

    PAr avance merci pour ton point de vue.

  5. #25
    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
    Hum ok,

    La table categorie_article est mal construite.
    - il manque un id primaire
    - dans ton formulaire tu inverses les noms.

    Donc pour moi, il faudrait changer ta table comme ceci pour être correcte

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    CREATE TABLE Categorie_article (
    id_categorie_article INT AUTOINCREMENT 
    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 (id_categorie_article)
    );

    dans ton insert:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $sql = "INSERT INTO categorie_article
    				(categorie_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']
    				));
    		}

    Là cela devrais fonctionner

  6. #26
    Invité
    Invité(e)
    Par défaut
    @mrc_AO

    Inutile de citer un message complet pour y répondre !

    Tu m'obliges à modifier tous tes messages !!

  7. #27
    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
    my bad ...

    Ok désolé Jreau, j'apprends également à me servir de cet excellent forum

    Aussi, merci pour tes interventions précédentes qui m'ont particulièrement aidé.

  8. #28
    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
    MaitrePylos,

    ça y est, enfin ça marche !!!

    merci pour ton intervention et encore merci à Jreau qui m'a également bien aidé.

    Voici pour simple feedback et aussi parce que j'ai une question sur la théorie de mon exercice :

    voici les tables que l'on m'a donné dans mon intitulé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE TABLE Categorie (
    id INT UNSIGNED AUTO_INCREMENT,	
    nom VARCHAR(150) NOT NULL,
    PRIMARY KEY(id)
    );
     
    CREATE TABLE Categorie_article (
    categorie_id INT UNSIGNED,
    article_id INT UNSIGNED,	
    PRIMARY KEY (categorie_id, article_id)
    );
    J'ai modifié la table 'Categorie_article' initialement donnée comme suit et ai supprimé un envoi de donnée de mon formulaire - ($_POST['id_categorie']) qui ne renvoyait rien - pour pouvoir l'incrémenter avec ma page article.php via traitement.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE TABLE Categorie_article (
    id_categorie_article INT AUTO_INCREMENT,	
    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 (id_categorie_article)
    );
    Ma question :

    aurait-il été possible de faire fonctionner la même table 'Categorie_article' en ayant les deux PRIMARY KEY (categorie_id, article_id)) que j'avais initialement ?

    Si oui, j'imagine qu'il m'aurait fallu créer une table annexe, dans laquelle j'aurai enregistré mes articles, mes pseudos, mes titres, qui aurait figuré une colonne 'id' auto incrémentée et qui aurait fait appel via un alias et par procédé de jointure aux deux tables de l'énoncé ?

    Non ?

    Merci encore et encore pour vos aides et si vous avez un avis sur cette question il m'intéresse.

  9. #29
    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
    Oui, il aurait simplement fallut gérer une autoincrémentation de la colonne article_id.
    Comme ça la concatenation de categorie_id et article_is seront unique alors pas de soucis.

    Sans incrémentation , il aurait juste fallut une sous requête.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    insert into categorie_article(categorie_id,article_id) SELECT $_POST[categorie_id],MAX(article_id)+1 FROM categorie_article.

    A vérifier

  10. #30
    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
    All good MaitrePylos,

    merci pour tout. Je vais essayer de ce pas et ne manquerait pas de te/vous tenir au courant.

    Bonne journée à la "dream team".

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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