Bonsoir le Forum,
Je bloque depuis quelques temps sur cette fonction "store()" utilisée dans une boucle. Au lieu de m'enregistrer les éléments de l'objet les uns après les autres, il me les enregistre les uns sur les autres (un INSERT, puis le reste en UPDATE !!!).

Plus précisément : Je travaille sur le relooking d'un site Joomla 1.5, avec une amélioration sur un souhait du webmaster. Des données sont récupérées d'un fichier CSV (ex tableau Excel), et découpées en plusieurs parties pour un enregistrement dans 3 tables différentes. Le but est de faire un enregistrement de masse (une centaine d'enregistrements), afin de pouvoir reproduire le tableau Excel sur le site via Joomla 1.5, et pouvoir le tenir à jour.

Voici le code que j'utilise :
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
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
    /**
     * Enregistrement des games
     * 
     * @param string $fNameFile Nom du fichier téléchargé
     * 
     * @return boolean Enregistrement ou pas ;)
     */
    function storeGame($fNameFile)
    {
        //Declare the global variables:
        global $mainframe;
 
        /* Récupération des données du fichier téléchargé */
        $dataFull = $this->getData($fNameFile); 
        $dateArray = $dataFull['dateCSV']; // Tableau des dates
        $playinfo = array(1=>'',2=>'',3=>'',4=>''); // Nombre de jeu par session
 
        /* Connexion bdd */
        $db =& JFactory::getDBO();
 
        /* Récupérer les données de la table #__bowlingscores_game */
        $db->setQuery('SELECT * FROM #__bowlingscores_game order by gamedate');
        $rangeGame = $db->loadObjectList();
 
        /* Récupérer l'id de game pour l'ajouter aux scores */
        $db->setQuery( 'SELECT id FROM #__bowlingscores_game ORDER BY id DESC LIMIT 1') ; 
        if ($db->loadResult() !== NULL) {
            $lastGame = (int)$db->loadResult() ;
            $firstGame = (int)$lastGame+1;
        } else {
            $lastGame = 0;
            $firstGame = 1;
        }
 
        /* Initialisation des variables */
        $ct1 = 0; // Compteur du tableau $game
        $counter = $firstGame; // 
        $prevDate = NULL; // Date de la dernière session enregistrée
        $games = array(); // Tableau des sessions
 
        $row = $this->getTable('game');
 
        // Vérification de l'existance d'enregistrement dans la table #__bowlingscores_game
        if (!empty($rangeGame)) {
            // Boucle sur le tableau des dates du fichier CSV
            foreach ($dateArray as $date) {
                // Boucle sur le tableau de la table #__bowlingscores_game
                foreach ($rangeGame as $line) {        
                    if ($line->gamedate !== $date->date) {
                        // Si la date n'existe pas,
                        $lastGame++;
                        // trouver le bon $counter pour le "games"
                        $games[$ct1]->name = $this->game_name($date->date, 'Session ', $counter, $prevDate);
                        $games[$ct1]->alias = $this->game_name($date->date, 'Session-', $counter, $prevDate);
 
                        $games[$ct1]->description = '<p>[NAME] du [GAMEDATE]</p>';
                        $games[$ct1]->gamedate = $date->date;
                        $games[$ct1]->plays = '4';
                        $games[$ct1]->frame = '1';
                        $games[$ct1]->playinfo = base64_encode(gzcompress(serialize($playinfo)));
                        $games[$ct1]->moy0 = '0';
                        $games[$ct1]->published = '1';
                        $games[$ct1]->template = '1';
 
                        $ct1++; $counter++;
                        $prevDate = $date->date;
 
                    } else {
                       // Si la date existe déjà,
                        $games[$ct1] = $line;
 
                        $ct1++; 
                    }
                }
            }
        } else {
            // Boucle sur le tableau des dates du fichier CSV
            foreach ($dateArray as $date) {
                $lastGame++;
                // trouver le bon $counter pour le "games"
                $games[$ct1]->name = $this->game_name($date->date, 'Session ', $counter, $prevDate);
                $games[$ct1]->alias = $this->game_name($date->date, 'Session-', $counter, $prevDate);
 
                $games[$ct1]->description = '<p>[NAME] du [GAMEDATE]</p>';
                $games[$ct1]->gamedate = $date->date;
                $games[$ct1]->plays = '4';
                $games[$ct1]->frame = '1';
                $games[$ct1]->playinfo = base64_encode(gzcompress(serialize($playinfo)));
                $games[$ct1]->moy0 = '0';
                $games[$ct1]->published = '1';
                $games[$ct1]->template = '1';
 
                $ct1++; $counter++;
                $prevDate = $date->date;
            }
        }
 
        $tabGame = array(); $ct = 0;
        foreach ($games as $game) {
            // Enregistrement des données
            $return = $this->register($row, $game);
 
            if (!$this->getError()){
                $tabGame[$ct]->id = $firstGame + $ct;
                $tabGame[$ct]->name = $game->name;
                $tabGame[$ct]->register = 1;
            } else {
                $tabGame[$ct]->id = $firstGame + $ct;
                $tabGame[$ct]->name = $game->name;
                $tabGame[$ct]->register = 0;
            }
            $mainframe->tabGame[$ct] = $tabGame[$ct];
            $ct++;
        }
        return $return;
    }
Code de la fonction register()
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
    /**
     * Enregistrement en Base de Données
     * 
     * @param object $row objet table de la base de données
     * @param object $data données à enregistrer
     * 
     * @return mixed tableau d'erreurs, ou boolean 
     */
    function register($row, $data) {
        if (!$row->bind($data)) {
			$this->setError($this->_db->getErrorMsg());
			return false;
		}
		if (!$row->check()) {
			$this->setError($this->_db->getErrorMsg());
			return false;
		}
		if (!$row->store()) {
			$this->setError( $row->getErrorMsg() );
			return false;
		}
 
		return true;
    }
Je suis pratiquement sûr d'avoir une boulette plus grosse que moi, mais à force de plancher dessus, je ne vois plus rien.

J'espère être assez clair, et reste à votre disposition pour des compléments d'informations.

Merci de vos réponses...