Changeset 80736 in spip-zone for _plugins_/formidable/trunk


Ignore:
Timestamp:
Feb 15, 2014, 6:02:57 PM (6 years ago)
Author:
cedric@…
Message:

Corriger une erreur de structure SQL : la clé primaire sur id_formulaires_reponse,nom de la table spip_formulaires_reponses_champs empechait l'enregistrement de plusieurs réponses pour un même champ. Corrolaire : seul le premier choix des choix multiples (cases à cocher) étaient donc enregistrés.

On ajoute une clé primaire simple sur la table, ce qui a l'avantage de faire fonctionner la recherche de manière plus robuste, et on migre en renommant la table, la recreant, et transferant les donnees de l'ancienne vers la nouvelle.
Migration et installation validée en MySQL, à valider en SQLite (mais devrait être OK)

Location:
_plugins_/formidable/trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/formidable/trunk/base/formidable_tables.php

    r80541 r80736  
    175175        // Table formulaires_reponses_champs
    176176        $formulaires_reponses_champs = array(
     177                "id_formulaires_reponses_champ" => "bigint(21) NOT NULL",
    177178                "id_formulaires_reponse" => "bigint(21) NOT NULL default 0",
    178179                "nom" => "varchar(255) NOT NULL default ''",
     
    181182        );
    182183        $formulaires_reponses_champs_cles = array(
    183                 "PRIMARY KEY" => "id_formulaires_reponse, nom",
    184                 "KEY id_formulaires_reponse" => "id_formulaires_reponse"
     184                "PRIMARY KEY" => "id_formulaires_reponses_champ",
     185                "KEY id_formulaires_reponse" => "id_formulaires_reponse",
     186                "KEY nom" => "nom",
    185187        );
    186188        $tables_principales['spip_formulaires_reponses_champs'] = array(
  • _plugins_/formidable/trunk/formidable_administrations.php

    r80618 r80736  
    5454        );
    5555
     56        $maj['0.6.0'] = array(
     57                array('sql_alter','TABLE spip_formulaires_reponses_champs RENAME TO spip_formulaires_reponses_champs_bad'),
     58                array('maj_tables',array('spip_formulaires_reponses_champs')),
     59                array('formidable_transferer_reponses_champs'),
     60                array('sql_drop_table','spip_formulaires_reponses_champs_bad'),
     61        );
     62
    5663        include_spip('base/upgrade');
    5764        maj_plugin($nom_meta_base_version, $version_cible, $maj);
    5865}
     66
     67function formidable_transferer_reponses_champs(){
     68
     69        $rows = sql_allfetsel("DISTINCT id_formulaires_reponse","spip_formulaires_reponses_champs_bad",'','id_formulaires_reponse','','0,100');
     70        do {
     71
     72                foreach($rows as $row){
     73
     74                        // pour chaque reponse on recupere tous les champs
     75                        $reponse = sql_allfetsel("*","spip_formulaires_reponses_champs_bad","id_formulaires_reponse=".intval($row['id_formulaires_reponse']));
     76                        // on les reinsere un par un dans la nouvelle table propre
     77                        foreach($reponse as $champ){
     78                                sql_insertq("spip_formulaires_reponses_champs",$champ);
     79                        }
     80                        // et on les vire de la mauvaise
     81                        sql_delete("spip_formulaires_reponses_champs_bad","id_formulaires_reponse=".intval($row['id_formulaires_reponse']));
     82
     83                        if (time()>_TIME_OUT)
     84                                return;
     85                }
     86
     87                if (time()>_TIME_OUT)
     88                        return;
     89
     90        }
     91        while ($rows = sql_allfetsel("DISTINCT id_formulaires_reponse","spip_formulaires_reponses_champs_bad",'','id_formulaires_reponse','','0,100'));
     92
     93}
     94
    5995
    6096/**
     
    194230                                #var_dump($row);
    195231                                $reponse = array(
     232                                        "id_formulaires_reponse"=>$row['id_donnee'], // conserver le meme id par facilite (on est sur une creation de base)
    196233                                        "id_formulaire" => $trans[$row['id_form']],
    197234                                        "date" => $row["date"],
  • _plugins_/formidable/trunk/inc/rechercher_joints_formulaires_reponse_formulaires_reponses_champ.php

    r80539 r80736  
    99        $cle_arrivee =  "id_formulaires_reponse";
    1010
    11         $s = sql_select("$cle_depart, $cle_arrivee", "spip_formulaires_reponses", sql_in($cle_arrivee, $ids_trouves), '','','','',$serveur);
     11        $s = sql_select("DISTINCT R.$cle_depart", "spip_formulaires_reponses AS R JOIN spip_formulaires_reponses_champs AS C ON C.id_formulaires_reponse=R.id_formulaires_reponse", sql_in("C.id_formulaires_reponses_champ", $ids_trouves), '','','','',$serveur);
    1212
    1313        return array($cle_depart, $cle_arrivee, $s);
  • _plugins_/formidable/trunk/paquet.xml

    r80693 r80736  
    22        prefix="formidable"
    33        categorie="communication"
    4         version="2.3.0"
     4        version="2.4.0"
    55        etat="test"
    66        compatibilite="[3.0.0;3.0.*]"
    77        logo="images/formidable-64.png"
    8         schema="0.5.6"
     8        schema="0.6.0"
    99        documentation="http://www.spip-contrib.net/Formidable-le-generateur-de"
    1010>
  • _plugins_/formidable/trunk/public/formidable_criteres.php

    r66722 r80736  
    3535                $boucle->join[$k]= array($t,'id_formulaires_reponse');
    3636                $boucle->from["L$k"]= 'spip_formulaires_reponses_champs';
    37                 $op = array("'='", "'L$k.nom'", "_q(".$_quoi.")");
     37                $op = array("'='", "'L$k.nom'", "sql_quote(".$_quoi.")");
    3838                $boucle->where[]= array("'?'","!in_array($_quoi,array('date','id_formulaires_reponse'))",$op,"''");
    3939                $boucle->order[]= "(in_array($_quoi,array('date','id_formulaires_reponse'))?'$t.'.$_quoi:(strncmp($_quoi,'date_',5)==0?'STR_TO_DATE(L$k.valeur,\'%d/%m/%Y\')':'L$k.valeur'))".($not?".' DESC'":"");
     
    5656                $boucle->join[$k]= array($t,'id_formulaires_reponse');
    5757                $boucle->from["L$k"]= 'spip_formulaires_reponses_champs';
    58                 $op = array("'LIKE'","'L$k.valeur'","_q(strpos($_quoi,'%')===false?'%'.".$_quoi.".'%':$_quoi)");
     58                $op = array("'LIKE'","'L$k.valeur'","sql_quote(strpos($_quoi,'%')===false?'%'.".$_quoi.".'%':$_quoi)");
    5959                $boucle->where[]= array("'?'",$_quoi,$op,"''");
    6060        }
Note: See TracChangeset for help on using the changeset viewer.