Fork me on GitHub

Rapport de message :*
 

Re: Recensement des bugs pour Formulaire 3.33

Titre du sujet : Re: Recensement des bugs pour Formulaire 3.33
par Ghia sur 27/03/2008 18:32:42

Quand je utilise le fonction cloner, ca ne marche plus. je recoit toujours l'erreur decrit dans la poste precedente avec No -4- et d'apres une erreur insert avec la texte SQL.
Il y a deux observations pour ce commande SQL:
- Une insert est faites pour un no de formulaire qui deja existe (5).
- Les valeurs sont de la formulaire qui est dernier dans la liste et ne pas de celui qui etait selectionnee.

Alors j'ai une fois regardee dans le code PHP et j'ai trouvee des choses problematiques (meme si je ne suis pas un specialiste XOOPS, ni PHP). Le fichier est admin/modform.php.

Ligne 66
if(!isset($_POST['id'])){
    
$id = isset ($_GET['id']) ? $_GET['id'] : '0';
}else {
    
$id $_POST['id'];
}

Le valeur $id pour le no de formulaire est trouvee dans la requete html, mais pas verifiee.
Pour eviter des injections SQL, il faut ajouter apres ligne 70:
$id intval($id);


Ligne 96
$sql="SELECT distinct desc_form, id_form FROM ".$xoopsDB->prefix("form_id");
Ca fait la selection des formulaires. Une probleme est que la liste n'est pas sortee. (C'est une cause de l'erreur, mais je revient sur ca plus tard.) Alors moi, j'aime une list alphabetique sur titre.
$sql="SELECT distinct desc_form, id_form FROM ".$xoopsDB->prefix("form_id")." order by desc_form";


Ligne 136
if( $op != 'addform' && $op != 'modform' && $op != 'renform' && $op != 'delform' && $op != 'showform' && $op != 'permform') {

Ici il y a la cause pourqoi les donnees clonee ne sont pas du formulaire selectionnee. $id est utilisee dans la loop et pointe a la fin sur le formulaire dernier. Comme ca seulement le formulaire dernier peut etre cloner.
Il faut ajouter l'operation cloner dans la liste.
if( $op != 'addform' && $op != 'modform' && $op != 'renform' && $op != 'delform' && $op != 'showform' && $op != 'permform' && $op != 'cloneform') {


ligne 202
redirect_header("modform.php"2_MD_ERRORTITLE);
Une petite remarque: je trouve ce temps de 2 secondes trop court pour lire et comprendre les messages. Alors j'ai mis partout 5 (redirect_header dans tous les fichiers).

Maitenant on arrive au fonction cloneform() au ligne 226
Ligne 246
$title $myts->makeTboxData4Save($row['desc_form']);
  
$admin $myts->makeTboxData4Save($row['admin']);
  
$groupe $myts->makeTboxData4Save($row['groupe']);
  
$email $myts->makeTboxData4Save($row['email']);
  
$expe $myts->makeTboxData4Save($row['expe']);
    
$url $myts->makeTboxData4Save($row['url']);
    
$help $myts->makeTboxData4Save($row['help']);
    
$send $myts->makeTboxData4Save($row['send']);
    
$msend $myts->makeTboxData4Save($row['msend']);
    
$msub $myts->makeTboxData4Save($row['msub']);
    
$mip $myts->makeTboxData4Save($row['mip']);
    
$mnav $myts->makeTboxData4Save($row['mnav']);
    
$cod $myts->makeTboxData4Save($row['cod']);
    
$save $myts->makeTboxData4Save($row['save']);
    
$onlyone $myts->makeTboxData4Save($row['onlyone']);
    
$image $myts->makeTboxData4Save($row['image']);
    
$nbjours $row['nbjours'];
    
$afftit $myts->makeTboxData4Save($row['afftit']);
    
$affimg $myts->makeTboxData4Save($row['affimg']);
    
$ordre $row['ordre'];
    
$qcm $myts->makeTboxData4Save($row['qcm']);
    
$affres $myts->makeTboxData4Save($row['affres']);
    
$affrep $myts->makeTboxData4Save($row['affrep']);
Je ne comprends pas pourqoi tous ce formatage est necessaire. Les donnees vient du database et sont deja formatee, non?

ligne 269
$idd $id 1;

Ici il y a une autre cause de l'erreur. L'assumption que la no pour la formulaire nouveau suivent la dernier de la liste non sortee (voir haut). Chez moi, la liste etait 1,5,4. Le dernier est 4, alors le nouveau est 5, qui existe deja et c'est pour ca que l'erreur vienne.

ligne 275
}

Ceci est la termination du condition au ligne 280:
if ($res)

Le resultat du recherce pour le formulaire a cloner. A mon avis la termination est trop tot. Si le formulaire demandee n'existe pas, il n'y pas de sens pour cloner les elements, ni le menu.
Il faut que la termination ce deplace vers ligne 327.

ligne 322
$sql2 sprintf("INSERT INTO %s (menuid, position, indent, itemname, margintop, marginbottom, itemurl, bold, status) VALUES (%u, %u, %u, '%s', '%s', '%s', '%s', %u, %u)"$xoopsDB->prefix("form_menu"), $idd$position$indent$itemname$margintop$marginbottom$itemurl$bold$status);

Il me semble que les tableaux form et form_menu sont ligne par ligne (pour chaque form_id, il existe une menu_id avec la meme valeur). Dans ce cas la, c'etait plus simple d'ajouter tous les champs form_menu en form et de suprimer ce tableau.

Alors j'ai un peu recrit la fonction cloneform. C'est plutot du SQL que du PHP.
function cloneform()
{
    global 
$xoopsDB$_POST$myts$eh$id$xoopsmodule;
    if (empty(
$id)) 
    {
        
redirect_header("modform.php"5"ID VIDE");
    }

// add the head original value in the table form_id
    
$sql=sprintf("SELECT * FROM ".$xoopsDB->prefix("form_id")." WHERE id_form=%u",$id);
    
$res $xoopsDB->query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.$xoopsDB->error().' <br /> cannot read the original form in the form_id table (modform.php / cloneform())');
    if (
$res)
    {
        
$sql sprintf("INSERT INTO %s (desc_form, admin, groupe, email, expe, url, help, send, msend, msub, mip, mnav, cod, save, onlyone, image, nbjours, afftit, affimg, ordre, qcm, affres, affrep) SELECT desc_form, admin, groupe, email, expe, url, help, send, msend, msub, mip, mnav, cod, save, onlyone, image, nbjours, afftit, affimg, ordre, qcm, affres, affrep FROM %s WHERE id_form=%u"$xoopsDB->prefix("form_id"), $xoopsDB->prefix("form_id"), $id);
        
$xoopsDB->queryF($sql) or die('Erreur insertion : <br />' $sql '<br />'); 
        
$idd mysql_insert_id();
// }

// add the body original values in the table form
        
$sql"SELECT * FROM ".$xoopsDB->prefix("form")." WHERE id_form=$id";
        
$res $xoopsDB->query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.$xoopsDB->error().' <br /> cannot read the original form in the form_id table (modform.php / cloneform())');
        if (
$res)
        {
            
$sql sprintf("INSERT INTO ".$xoopsDB->prefix('form')." (id_form, ele_type, ele_caption, ele_order, ele_req, ele_value, ele_display) SELECT %u as `id_form`, `ele_type`, `ele_caption`, `ele_order`, `ele_req`, `ele_value`, `ele_display` FROM ".$xoopsDB->prefix('form')." WHERE `id_form` = %u"$idd$id );
            
$xoopsDB->queryF($sql) or die('Erreur insertion : <br />' $sql '<br />'); 
        }

// add the original value in the table form_menu

        
$sql=sprintf("SELECT * FROM ".$xoopsDB->prefix("form_menu")." WHERE menuid=%u",$id);
        
$res $xoopsDB->query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.$xoopsDB->error().' <br /> cannot read the original formmenu in the form_menu table (modform.php / cloneform())');
        if (
$res)
        {
            
$itemurl XOOPS_URL.'/modules/formulaire/formulaire.php?title='.$idd.'';

            
$sql2 sprintf("INSERT INTO %s (menuid, position, indent, itemname, margintop, marginbottom, itemurl, bold, status) SELECT %u as menuid, position, indent, itemname, margintop, marginbottom, '%s' as itemurl, bold, status FROM %s WHERE menuid=%u"$xoopsDB->prefix("form_menu"), $idd$itemurl$xoopsDB->prefix("form_menu"), $id);
// echo $sql2;
            
$xoopsDB->queryF($sql2) or $eh->show("error : cannot insert values in the form_menu table (modform.php / cloneform())");
        }
    }
    
$url "modform.php";
    
Header("Location: $url");
}

Et ca a meme l'aire de marcher.

Encore une remarque: avec le 'die', quand le SQL donne une erreur, il y a toujours d'abord l'erreur popup DHTML (voir -4- dans ma poste precedente)

Pour etre bien tous les textes d'erreur doivent etre localiser (mis en fichier language).

Une autre chose est quand on specifie une element radio et dans l'edit de l'element en admin, on selectionne une de par exemple deux circles, ce n'est pas possible de deselectionnee ce choix.
Workaround: ajoute une troisieme, selectionne celui et efface le. Comme ca les deux choix sont de nouveau deselectionnee.
Propulsé avec XOOPS | Graphisme adapté par Tatane, Grosdunord, Montuy337513

12 Personne(s) en ligne (8 Personne(s) connectée(s) sur Forum) | Utilisateur(s): 0 | Invité(s): 12 | Plus ...