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 :

Envoi désordonné en base postgresql


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Femme Profil pro
    Développeuse Web et Mobile
    Inscrit en
    Août 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Développeuse Web et Mobile
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2014
    Messages : 30
    Par défaut Envoi désordonné en base postgresql
    Bonjour,
    Je suis en train de remplir une table legende construite de la sorte :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE legende(
       id_legende serial PRIMARY KEY,
       titre VARCHAR,
       opacity double precision,
       contenu_html VARCHAR,
       id_couche INTEGER REFERENCES couche(id_couche) NOT NULL
    );
     ALTER SEQUENCE geocapa.legende_id_legende_seq RESTART WITH 16 INCREMENT BY 1;

    Cette table est rempli à partir des informations de la table couche que j'affiche dans un tableau html.
    code sql couche:
    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 geocapa.couche(
       id_couche serial PRIMARY KEY,
       titre VARCHAR,
       url VARCHAR,
       layer VARCHAR,
       keyword VARCHAR,
       version VARCHAR,
       filtre VARCHAR,
       authkey VARCHAR,
       servertype VARCHAR,
       crossorigin VARCHAR,
       visibility boolean
    );
    ALTER SEQUENCE geocapa.couche_id_couche_seq RESTART WITH 16 INCREMENT BY 1;

    tableau html:
    Nom : tableaucouche.jpg
Affichages : 127
Taille : 68,1 Ko

    je crée ensuite le tableau contenant chacun des éléments à mettre dans la table legende. Si j'affiche mon tableau créé il n'y a pas de soucis tout est dans le bon ordre comme le montre la capture suivante :
    Nom : tableauAvantEnvoi.jpg
Affichages : 121
Taille : 100,5 Ko
    En revanche si j'affiche le contenu de la base après l'insertion on peut voir qu'il y a eu un décalage entre l'id_couche et l'id_legende:
    Nom : importbase.jpg
Affichages : 122
Taille : 121,9 Ko

    Je ne comprends pas pourquoi il y a ce décalage au moment de l'envoi, si quelqu'un aurait une explication je suis toute ouïe parce que j'ai besoin que ça soit dans le bon ordre pour le reste de mes tables.
    Merci d'avance.

  2. #2
    Membre extrêmement actif
    Avatar de Sodium
    Femme Profil pro
    Développeuse web
    Inscrit en
    Avril 2014
    Messages
    2 324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeuse web

    Informations forums :
    Inscription : Avril 2014
    Messages : 2 324
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Il faut spécifier à Postgres que tu souhaites entrer la clé primaire manuellement, par défaut il utilisera toujours l'autoincrement et même en vidant la table (voir même en la supprimant, je ne suis plus sûr) il garde une trace du dernier id utilisé dans des tables système, on appelle ça les sequences.

    Plus d'infos ici : https://www.2ndquadrant.com/en/blog/...ntity-columns/

    J'avais posté une solution pour le faire sous Symfony, si jamais tu utilises ce framework tu peux regarder ici : https://stackoverflow.com/questions/...tgres-database

  3. #3
    Membre averti
    Femme Profil pro
    Développeuse Web et Mobile
    Inscrit en
    Août 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Développeuse Web et Mobile
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2014
    Messages : 30
    Par défaut
    Citation Envoyé par Sodium Voir le message
    Bonjour,

    Il faut spécifier à Postgres que tu souhaites entrer la clé primaire manuellement, par défaut il utilisera toujours l'autoincrement et même en vidant la table (voir même en la supprimant, je ne suis plus sûr) il garde une trace du dernier id utilisé dans des tables système, on appelle ça les sequences.

    Plus d'infos ici : https://www.2ndquadrant.com/en/blog/...ntity-columns/

    J'avais posté une solution pour le faire sous Symfony, si jamais tu utilises ce framework tu peux regarder ici : https://stackoverflow.com/questions/...tgres-database
    En fait non l'id_couche que je récupère me sert à remplir la clé étrangère la clé primaire j'ai fait en sorte qu'elle démarre au même numéro que celle de la table couche.

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    On pourrait voir un chouia de code ? Parce que là, je ne suis pas sure de comprendre ce que tu récupères où et comment.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  5. #5
    Membre averti
    Femme Profil pro
    Développeuse Web et Mobile
    Inscrit en
    Août 2014
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Développeuse Web et Mobile
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Août 2014
    Messages : 30
    Par défaut
    Citation Envoyé par Celira Voir le message
    On pourrait voir un chouia de code ? Parce que là, je ne suis pas sure de comprendre ce que tu récupères où et comment.
    alors tout d'abord j'ai une fonction php qui récupère ce qu'il y a dans ma table couche :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public function getCouches() {
                        $sql = "SELECT * FROM geocapa.couche";
                        $queryRecords = pg_query($this->conn, $sql) or die("error to fetch couche data");
                        $data = pg_fetch_all($queryRecords);
     
                        $monJson =  json_encode($data);
                        echo $monJson;                           
        }

    Ensuite j'ai une fonction javascript qui permet d'afficher le retour de cette requête dans le html :
    Code javascript : 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
     
    function get_couche() {
            $.ajax({
                type: 'POST',
                url: 'response2.php?action=list',
                success: function(response) {
     
                    response = JSON.parse(response);
                    //console.log(response);
                    var tr;
                    $('#emp_body').html('');
                    $.each(response, function(index, emp) {
     
                        tr = $('<tr/>');
                        tr.append("<td>" + emp.titre + "</td>");
                        tr.append("<td>" + emp.keyword + "</td>");
                        tr.append("<td>" + emp.version + "</td>");
                        tr.append("<td>" + emp.filtre + "</td>");
                        tr.append("<td>" + emp.id_couche + "</td>");
                        $('#emp_body').append(tr);
                    });
     
                }
            });
        }

    Dans mon html j'ai un bouton "Add" qui lorsque je clique dessus récupère les informations de chaque colonne puis appelle la fonction permettant de créer la légende avec les paramètres récupérer:
    Code javascript : 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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
     
    //création de la légende
    $("#btn_add").click(function() {
            var legendes = new Array();
            var titres = new Array();
            var couches = new Array();
            var keywords = new Array();
            var versions = new Array();
            var filtres = new Array();
     
            var legende;
     
     
     
            var lignes = document.getElementById('emp_body').getElementsByTagName('tr');
            var j = 0;
            while (lignes[j]) {
                var cells = lignes[j].getElementsByTagName('td');
                titres.push(cells[0].innerHTML);
                keywords.push(cells[1].innerHTML);
                versions.push(cells[2].innerHTML);
                filtres.push(cells[3].innerHTML);
                couches.push(cells[4].innerHTML);
                j++;
            }
     
            for (var k = 0; k < titres.length; k++) {
                legende = createLegend(couches[k], titres[k], keywords[k], versions[k], 1, filtres[k]);
                legendes.push(legende);
            }
            for (i = 0; i < legendes.length; i++) {
                console.log(legendes[i]);
                ajaxAction(legendes[i]);//fonction permettant l'ajout en base 
            }
     
        });
     
    //fonction permettant de créer la légende 
    function createLegend(idCategorie, titre, keyword, version, opacity, filtre) {
        var fieldset = document.createElement('fieldset');
     
        fieldset.id = "layer" + idCategorie;
     
        var label = document.createElement("label");
        label.setAttribute("for", "visible" + idCategorie);
     
        var input = document.createElement("input");
        input.id = "visible" + idCategorie;
        input.className = "visible";
        input.type = "checkbox";
        input.checked = true;
     
        var img = document.createElement('img');
        var source = "https:/URLDEMONSERVEUR/wms?REQUEST=GetLegendGraphic&VERSION=" + version + "&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=capa_sig:";
        var pImg = document.createElement('p');
        var iImg = document.createElement('i');
     
        var span = document.createElement('span');
        span.appendChild(document.createTextNode(titre));
     
        label.appendChild(input);
     
        if ((keyword === "suivi_pc_visualisation") && (filtre !== null)) {
            console.log("coucou");
            img.src = source + keyword + "&RULE=";
            label.appendChild(img);
            label.appendChild(span);
        } else if (keyword === "suivi_pc_visualisation") {
            img.src = source + keyword; //+ "&authkey=" + key;
     
            pImg.type = "button";
            pImg.className = "btn btn-info";
            pImg.onclick = "QuerySuiviPC()";
     
            iImg.className = "a fa-bars fa-lg";
            label.appendChild(img);
            label.appendChild(span);
            pImg.appendChild(iImg);
            label.appendChild(pImg);
     
        } else {
            img.src = source + keyword;
            label.appendChild(img);
            label.appendChild(span);
        }
     
        var input2 = document.createElement('input');
        input2.className = "opacity";
        input2.type = "range";
        input2.setAttribute("min", "0");
        input2.setAttribute("max", opacity);
        input2.setAttribute("step", "0.01");
     
        fieldset.appendChild(label);
        fieldset.appendChild(input2);
     
        var idObj = new Object;
        idObj["name"] = "id_couche";
        idObj["value"] = idCategorie;
     
        var titreObj = new Object;
        titreObj["name"] = "titre";
        titreObj["value"] = titre;
     
        var versionObj = new Object;
        versionObj["name"] = "version";
        versionObj["value"] = version;
     
        var opaciteObj = new Object;
        opaciteObj["name"] = "opacity";
        opaciteObj["value"] = opacity;
     
        var htmlObj = new Object;
        htmlObj["name"] = "contenu_html";
        htmlObj["value"] = fieldset.outerHTML;
     
     
     
        var legende = new Array;
        legende.push(idObj);
        legende.push(titreObj);
        legende.push(opaciteObj);
        legende.push(htmlObj);
     
        return legende;
    }

    Enfin lors du clic sur le bouton cela appelle la fonction ajaxAction() qui envoi dans la base de données le tableau json qui contient toutes les informations nécessaires:
    Code javascript : 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
     
    function ajaxAction(data) {
            //console.log(data);
            $.ajax({
                type: "POST",
                url: 'response2.php?action=add',
                data: data,
                dataType: "json",
                success: function(response) {
     
                    console.log(response);
                    if (response.status) {
                        console.log("success");
     
                    } else {
                        console.log("error");
                    }
                },
                error: function(jqXHR, textStatus, errorThrown) {
                    for (var element in jqXHR) {
                        console.log(jqXHR[element]);
                    }
                    $('#leg_body').html('<div class="alert alert-danger ">Error' + textStatus + ' !\n\n' + errorThrown);
                    console.log("Error" + textStatus + ' !\n\n' + errorThrown);
                }
            });
        }

    Et voici le code php de la fonction permettant l'ajout en base:
    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
     
    public function insertLegende() {
            $data = $resp = array();
            $resp['status'] = false;
            $data['titre'] = $_POST["titre"];
            $data['opacity'] = $_POST["opacity"];
            $data['contenu_html'] = $_POST["contenu_html"];
            $data['id_couche'] = $_POST["id_couche"];
     
            $sql = "INSERT INTO geocapa.legende (titre, opacity, contenu_html, id_couche) VALUES ('". $data['titre']."', ". $data['opacity'].", '". $data['contenu_html']."', ". $data['id_couche'].")";
            $result = pg_query($this->conn, $sql) or die($sql);
     
            if ($result){
                $resp['status'] = true;
                $resp['Record'] = $data;
                echo json_encode($resp);  // send data as json format
            }
        }

    Et pour je ne sais quelle raison l'ajout en base n'est pas dans le même ordre que celui de la table couche.

    PS: j'ai essayé en appelant la fonction createLegende directement dans get_couche() lors de la récupération des champs mais ça ne change rien et mettre un timer non plus.

    Si quelqu'un a une explication

Discussions similaires

  1. envoi automatisé de mails à partir d'une base postgresql
    Par youn608 dans le forum PostgreSQL
    Réponses: 11
    Dernier message: 15/02/2005, 09h06
  2. Migration d'une base Access vers une base PostgreSQL
    Par ttalourd dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 22/11/2004, 16h59
  3. Récupérer une base postgresql au format .SQL ?
    Par hesky dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 26/08/2004, 10h14
  4. [amc designer] création d'une base postgresql
    Par david42 dans le forum PostgreSQL
    Réponses: 9
    Dernier message: 12/03/2004, 11h08
  5. Localisation d'une base Postgresql sur mdk 9.1
    Par Gregco dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 10/06/2003, 18h46

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