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

PHP & Base de données Discussion :

[PHP+MYSQL] Modifier toutes les ID d'une table SQL


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Homme Profil pro
    Urbaniste
    Inscrit en
    Décembre 2021
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Décembre 2021
    Messages : 14
    Par défaut [PHP+MYSQL] Modifier toutes les ID d'une table SQL
    Bonjour à tous,

    Je réalise un outil permettant de répondre à des questions et je peux me retrouver avec tes tables de plus de 120 questions.
    Cette table doit pouvoir être modulable, c'est à dire on peut modifier l'ordre d'apparition des questions en changeant le numéro de l'id de la question, ou encore ajouter une question entre-deux questions.

    Je cherche la manière la plus propre de réaliser cette manipulation ... aujourd'hui (voir script ci-dessous) j'arrive bien à récupérer les ID, les incrémenter et ainsi de suite, mais je n'arrive pas à savoir comment suite à cette insertion de question dans la table, je peux incrémenter de +1 tous les ID suivants, sachant qu'à ce moment là j'aurai 2 ID ayant la même valeur ...


    Le code 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
    <?php
    // On vérifie si le formulaire est complet
    if(!empty($_POST['items']) AND is_numeric($_POST['items']) AND !empty($_POST['text_question']) AND !empty($_POST['question_form'])) {
        // On met les données dans des variables et on applique la fonction permettant de controler le contenu
        $items = valid_donnees($_POST['items']);
        $questions = valid_donnees($_POST['questions']);
        //Si l'utilisateur n'a pas selectionné d'emplacement pour sa question dans le <select> du formulaire
        if ($questions == "")) {
            $retour = mysqli_query($conn, 'SELECT MAX(id_question) AS id_max FROM questions WHERE id_link_item = '.$items.'');
            $donnees = mysqli_fetch_array($retour);
            // Si aucune question n'est enregistrée dans la BDD on délivre le 1er ID
            if ($donnees['id_max'] == NULL) {
                $questions = 1;
            // Si des questions sont présentes en BDD, on incrémente de 1 l'ID par rapport à l'ID la plus haute de la BDD
            } else { $questions = ++$donnees['id_max']; }
        // Si $questions n'est pas vide, alors on va récupérer l'id de la question du <select> et l'incrémenter
        } else { ++$questions; }
     
        // On encode en utf8 le textarea + contrôle des données.
        $text_question = utf8_encode(valid_donnees($_POST['text_question']));
        if (empty($_POST['references'])) {
            $references = "";
        } else { $references = $_POST['references']; }
        $question_form = valid_donnees($_POST['question_form']);
     
        // On insert la nouvelle questions dans la table questions
        $query = "INSERT INTO `questions` (id_ai, id_question, id_link_item, text_question, commentaire_question, id_ai_reference, date_add_question, user_add_question, date_update_question, user_update_question, question_form)
        VALUES (NULL, '$questions', '$items', '$text_question', '', '$references', '$date', '$id_utilisateur', '$date', '$id_utilisateur', '$question_form')";
        $result = mysqli_query($conn,$query) or die(mysqli_error());
        echo "ok";
    }
    ?>
    La table "questions"
    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
    CREATE TABLE IF NOT EXISTS `questions` (
      `id_ai` int(11) NOT NULL AUTO_INCREMENT,
      `id_question` int(11) NOT NULL,
      `id_link_item` int(11) NOT NULL,
      `text_question` varchar(255) NOT NULL,
      `commentaire_question` varchar(255) NOT NULL,
      `id_ai_reference` varchar(255) NOT NULL,
      `date_add_question` datetime NOT NULL,
      `user_add_question` int(11) NOT NULL,
      `date_update_question` datetime NOT NULL,
      `user_update_question` int(11) NOT NULL,
      `question_form` varchar(100) NOT NULL,
      PRIMARY KEY (`id_ai`)
    ) ENGINE=InnoDB AUTO_INCREMENT=20012 DEFAULT CHARSET=utf8;

    Je remercie par avance la personne qui pourra m'aiguiller sur un chemin !

    Bonne journée,

  2. #2
    Inactif  
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2021
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juin 2021
    Messages : 645
    Par défaut
    Bonjour,

    1- d'abord, pour éviter toute confusion, je te conseille de changer "id_question" en "num_question" (et "id_max" en "num_max"
    car, si j'ai bien compris, il s'agit de numéroter les questions.

    2- quand et comment définis-tu l'ordre des questions ?

    3- toutes les questions seront affichées ?
    Ou certaines non : auquel cas, num_question = 0 (par exemple)

  3. #3
    Membre averti
    Homme Profil pro
    Urbaniste
    Inscrit en
    Décembre 2021
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Décembre 2021
    Messages : 14
    Par défaut
    Bonjour jreaux62 et merci de ton retour.

    J'ai trouvé une solution de pass pass pour réaliser la manipulation en créant une nouvelle colonne temporaire.

    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
     
    // On vérifie si le formulaire est complet
    if(!empty($_POST['items']) AND is_numeric($_POST['items']) AND !empty($_POST['text_question']) AND !empty($_POST['question_form'])) {
        // On met les données dans des variables et on applique la fonction permettant de controler le contenu
        $items = valid_donnees($_POST['items']);
        $questions = valid_donnees($_POST['questions']);
        //Si l'utilisateur n'a pas selectionné d'emplacement pour sa question dans le <select> du formulaire
        if ($questions == "") {
            $retour = mysqli_query($conn, 'SELECT MAX(id_question) AS id_max FROM questions WHERE id_link_item = '.$items.'');
            $donnees = mysqli_fetch_array($retour);
            // Si aucune question n'est enregistrée dans la BDD on délivre le 1er ID
            if ($donnees['id_max'] == NULL) {
                $questions = 1;
            // Si des questions sont présentes en BDD, on incrémente de 1 l'ID par rapport à l'ID la plus haute de la BDD
            } else { $questions = ++$donnees['id_max']; }
        // Si $questions n'est pas vide, alors on va récupérer l'id de la question du <select> et l'incrémenter
        } else { ++$questions; }
     
        // On encode en utf8 le textarea + contrôle des données.
        $text_question = utf8_encode(valid_donnees($_POST['text_question']));
        if (empty($_POST['references'])) {
            $references = "";
        } else { $references = $_POST['references']; }
        $question_form = valid_donnees($_POST['question_form']);
     
        // On insert la nouvelle questions dans la table questions en enregistrant uniquement l'ID dans la colonne temporaire
        $query = "INSERT INTO `questions` (id_ai, id_question, id_link_item, colonne_temporaire_tri, text_question, id_ai_reference, date_add_question, user_add_question, date_update_question, user_update_question, question_form)
        VALUES (NULL, '$questions', '$items', '$questions', '$text_question', '$references', '$date', '$id_utilisateur', '$date', '$id_utilisateur', '$question_form')";
        $result = mysqli_query($conn,$query) or die(mysqli_error());
        if ($result == 1) {
            // ON réalise une requête pour chercher toutes les lignes pour lesquelles la valeur est supérieur ou égale à l'id souhaitée
            $id_sup = mysqli_query($conn,"SELECT * FROM questions WHERE id_question >= $questions AND colonne_temporaire_tri = '' AND id_link_item = $items");
            while($row_id_sup = mysqli_fetch_array($id_sup)) {
                $new_id_question = ++$row_id_sup['id_question'];
                $query = 'UPDATE `questions` SET `id_question` ="'.$new_id_question.'" WHERE `id_ai` = "'.$row_id_sup['id_ai'].'"';
                $result = mysqli_query($conn,$query);
            }
            // On vide la colonne temporaire
            $query = "UPDATE `questions` SET colonne_temporaire_tri = ''";
            echo $query;
            $result = mysqli_query($conn,$query);
     
     
        echo "ok";
     
    }
    }
    Ca me permet de réaliser dans une boucle toutes les incrémentations. (code à remettre au propre bien sûr)

    Concernant le nom des tables, j'ai déjà une bonne partie de mon outil qui est réalisé avec ce nom là. Je vais voir si j'ai le courage de tout modifier

    Merci en tout cas et n'hésite pas à critiquer ma façon de coder !
    Bonne journée

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 599
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Il faudrait mieux expliquer le contexte.

    Est-ce qu'une même question peut participer à plusieurs questionnaires ?
    ==> si c'est le cas, l'ordre des questions est très probablement lié à la question et au questionnaire
    une même question pouvant apparaître à une position différente selon le questionnaire

    Est-ce que certaines questions dépendent d'autres questions en amont ?
    ==> si c'est le cas, il ne s'agit plus de numéroter simplement les questions, mais de remettre en cause les dépendances éventuelles

    Dans tous les cas, il faut bien distinguer la notion de rang de la question dans un questionnaire et la notion d'identifiant technique de la question.
    Le rang a un sens fonctionnel, l'identifiant technique ne doit en avoir aucun, surtout s'il s'agit d'un identifiant attribué par le SGBD (auto_increment pour MySQL) dont la valeur n'a aucune garantie d'être chronologique.

  5. #5
    Membre averti
    Homme Profil pro
    Urbaniste
    Inscrit en
    Décembre 2021
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Décembre 2021
    Messages : 14
    Par défaut
    En fait mon système de questionnaire fonctionne comme ça :

    J'ai 3 tables : item (5 items); questions (environ 150 questions); réponses (environ 800 réponses)
    Pour chaque table j'ai à chaque fois un id en auto_increment, et un autre id me permettant de réaliser le tri lors de l'affichage. Pour la table questions et reponses, j'ai en plus une colonne qui me permet de lier la réponse avec sa question, sa question avec son item. Je me base à chaque fois par l'id auto_increment pour le réaliser.
    Mon id auto_increment me sert uniquement à avoir un id totalement unique pour chaque entrée de chaque table, ça n'a donc aucun impact de ne pas avoir d'ordre chronologique.

    (bon, ce n'est pas évident à expliquer ... )

  6. #6
    Inactif  
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2021
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juin 2021
    Messages : 645
    Par défaut
    Bonjour,

    Citation Envoyé par Bogibogs Voir le message
    (bon, ce n'est pas évident à expliquer ... )
    D'où l'intérêt d'éviter les confusions.

    • id_xxx est généralement / conventionnellement utilisé pour les index auto_increment.

    Ce n'est pas le cas de "id_question".

    Citation Envoyé par jreaux62 Voir le message
    ...pour éviter toute confusion, je te conseille de changer "id_question" en "num_question" (et "id_max" en "num_max"

  7. #7
    Membre averti
    Homme Profil pro
    Urbaniste
    Inscrit en
    Décembre 2021
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Décembre 2021
    Messages : 14
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Bonjour,



    D'où l'intérêt d'éviter les confusions.

    • id_xxx est généralement / conventionnellement utilisé pour les index auto_increment.

    Ce n'est pas le cas de "id_question".
    Je vais réaliser toutes les modifications, je vais vite voir où sa plante suite au changement de toutes manières

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Modifier touts les enregistrement d'une table esclave
    Par stfanny31 dans le forum Bases de données
    Réponses: 6
    Dernier message: 10/05/2012, 15h27
  2. retourner tout les champs d'une table sql
    Par maroonet dans le forum C#
    Réponses: 1
    Dernier message: 21/04/2010, 13h56
  3. Modifier toutes les valeurs d'une colonne
    Par charlie03 dans le forum Débuter
    Réponses: 5
    Dernier message: 10/04/2009, 08h36
  4. Modifier toutes les URL d'une page apres chargement.
    Par landsteph dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 25/08/2007, 21h11
  5. Modifier tout les fichier comportant une chaine
    Par narmataru dans le forum Linux
    Réponses: 10
    Dernier message: 28/09/2004, 16h58

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