Optimisation

kifouillou Messages postés 170 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 28 janvier 2011 - 25 mars 2008 à 10:13
kifouillou Messages postés 170 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 28 janvier 2011 - 26 mars 2008 à 10:40
Bonjour,

j'ai réalisé une fonction qui permet de valider un drag&drop. Cette fonction enregistre donc l'ordre dans une base de donnée. Cela fonctionne très bien mais j'ai deux update et je voudrais savoir si dans un souci d'optimisation il serait possible d'en faire un seul.
Voici mon code :

// Parcours des champs du formulaire pour enregistrer chaque ligne
 
    $div_ordre = $_POST['div_order'];
   
    $tab_structure = explode(',', $div_ordre);
   
   
   
 
    foreach ($_POST as $k => $v)
    {
       
        
        if (!$v)
            continue;
        if (! ereg("^lst_sturct_id([0-9]+)$",$k,$o)) continue; // On ne recherche que les champs hidden embarquant l'id de la bdd
            $ligne = $o[1];
             // numéro de la ligne en cours de traitement
        $id = $v;
      
               // L'id de l'enregistrement est la valeur de ce champs
        $Data = array(); // Créer un tableau vide pour stoker les valeurs à enregistrer
        $Data['struct_type_stream'] = $_POST['type_'.$ligne];
        $Data['struct_nom'] = $_POST['nom_'.$ligne];
        $Data['struct_libelle'] = $_POST['libelle_'.$ligne];
        $Data['struct_datatype'] = $_POST['datatype_'.$ligne];
       
        //$Data['struct_ordre'] = $ordre;
      
        if ($id)
        { // Si un id est dispo => enregistrement existant à modifier, sinon enregistrement à créer 
            dbiUpdateBDArray('stream_structure_2', 'sturct_id', $id, $Data);
            $ordre++;    
        }
        else
        {
            dbiInsertBDArray('stream_structure_2', $Data);
        }
        foreach ($tab_structure as $k =>$v)
        {
            $id = substr($v, 2);
            $D = array();
            $D['struct_ordre'] = $k + 1;
       
            dbiUpdateBdArray('stream_structure_2', 'sturct_id', $id, $D);
        }
   
    }

Merci d'avance.

olivier

2 réponses

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
25 mars 2008 à 18:55
Salut,

Comme on ne sait pas ce que font les fonctions dbiUpdateDBArray() et dbiInsertDBArray(), il n'est pas aisé de t'aider... On ne sait pas à quoi correspondent les arguments, etc.
On ne sait pas non plus à quoi ressemble ta table. Le principal problème réside dans le fait qu'on ne sait absolument pas, à la lecture de ton code, quelles sont les requêtes qui sont exécutées, donc s'il est possible de les optimiser ou non... Parce qu'en réalité, tes requêtes UPDATE ne sont pas exécutées que 2 fois, mais 2 fois par élément de $_POST

Et la dernière boucle foreach, je ne comprends pas à quoi elle sert ni ce qu'elle fait concrètement.

Par contre, si tu veux des optimisations, y'en a quelques unes de possibles au niveau de PHP...

ereg = > utiliser preg à la place :
if (! ereg("^lst_sturct_id([0-9]+)$",$k,$o))

devient :
if (preg('`^lst_sturct_id([0-9]+)$`',$k,$o) == 0)

Mais sur cette même ligne, on a un continue derrière, ce qui n'est pas très propre... Et juste avant, 2 tests pour savoir si on exécute la suite de la boucle ou non...
if ($v && preg('`^lst_sturct_id([0-9]+)$`',$k,$o) == 0)
{
// Code a exécuter...
}

C'est plus propre à la lecture et certainement aussi performant qu'avec continue

$Data = array(); // Créer un tableau vide pour stoker les valeurs à enregistrer
$Data['struct_type_stream'] = $_POST['type_'.$ligne];
$Data['struct_nom'] = $_POST['nom_'.$ligne];
$Data['struct_libelle'] = $_POST['libelle_'.$ligne];
$Data['struct_datatype'] = $_POST['datatype_'.$ligne];

On peut faire ça en une seule ligne, sans y perdre en lisibilité :
$Data = array(
'struct_type_stream' => $_POST['type_' . $ligne],
'struct_nom' => $_POST['nom_' . $ligne],
'struct_libelle' => $_POST['libelle_' . $ligne],
'struct_datatype'] => $_POST['datatype_' . $ligne]);

C'est aussi lisible et ne nécessite qu'une seule déclaration de variable.

if ($id)
{ // Si un id est dispo => enregistrement existant à modifier, sinon enregistrement à créer 
dbiUpdateBDArray('stream_structure_2', 'sturct_id', $id, $Data);
$ordre++;
}

Tu exécutes une requêtes UPDATE qui semble contenir $id, qui provient directement d'une saisie de l'utilisateur : c'est loin d'être sécurisé. Tu ne fais aucun contrôle sur la validité de cette valeur et tu considères ensuite que la requête a forcément été exécutée...
Deux choses : tu DOIS protéger TOUTES les valeurs que tu insères dans ta base de données qui proviennent d'une saisie utilisateur (ou assimilée). Cela concerne les variables $_POST, $_GET et $_COOKIE (et donc, $_REQUEST).
Maintenant, il se peut que les fonctions que tu utilises s'en chargent de leur côté...
Quoi qu'il en soit, tu ne devrais pas considérer que la requête a nécessairement été exécutée avec succès : si la variable $v en question contenue $_POST (que tu stockes dans $id) n'existe pas dans la table pour une raison X ou Y, la requête aura échoué...

<hr size="2" width="100%" />Neige
0
kifouillou Messages postés 170 Date d'inscription mardi 27 septembre 2005 Statut Membre Dernière intervention 28 janvier 2011
26 mars 2008 à 10:40
salut neige,

Tout d'abord merci beaucoup pour ces précieux conseils.

($table,$nom_cle,$val_cle,$data)

Ce sont les paramètres de de dbiUpdateArray.  Pour Insert bd array les param sont ($table,$data).

$Data est un tableau. Pour la conception de ma table ben les champs sont les 4 que je récupères en POST. Avec le champ ordre que je met toujours à jour.  Sinon j'ai trouvé comment faire pour un seul dbiUpdate.

if ($id)
        { // Si un id est dispo => enregistrement existant à modifier, sinon enregistrement à créer
            foreach ($tab_structure as $k =>$v)
            {
                $id = substr($v, 2);
                $Data = array();
                $Data['struct_ordre'] = $k + 1;
       
               
                 
            dbiUpdateBDArray('stream_structure_2', 'sturct_id', $id, $Data);

Voilà. Maintenant faut finir d'optimiser, et je suis pas sur que mon dbiInsertBdArray fonctionne.

olivier
0
Rejoignez-nous