Subversion Repositories eFlore/Applications.cel

Rev

Rev 620 | Rev 663 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 620 Rev 632
1
<?php
1
<?php
2
/**
2
/**
3
 * Service recherche  et ajout d'image a partir de divers critères
3
 * Service recherche  et ajout d'image a partir de divers critères
4
 * Encodage en entrée : utf8
4
 * Encodage en entrée : utf8
5
 * Encodage en sortie : utf8
5
 * Encodage en sortie : utf8
6
 *
6
 *
7
 * @author Aurélien PERONNET <aurelien@tela-botanica.org>
7
 * @author Aurélien PERONNET <aurelien@tela-botanica.org>
8
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
8
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
9
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
9
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
10
 * @version $Id$
10
 * @version $Id$
11
 */
11
 */
12
Class InventoryImage extends Cel {
12
Class InventoryImage extends Cel {
13
	
13
	
14
	/**
14
	/**
15
	 * Méthode appelée avec une requête de type GET.
15
	 * Méthode appelée avec une requête de type GET.
16
	 * Renvoie les infos sur l'image correspondant à l'id passé en parametre
16
	 * Renvoie les infos sur l'image correspondant à l'id passé en parametre
17
	*/
17
	*/
18
	public function getElement($uid)
18
	public function getElement($uid)
19
	{
19
	{d	
20
		
-
 
21
		// uid[0] : utilisateur obligatoire
20
		// uid[0] : utilisateur obligatoire
22
		// uid[1] : identifiant image obligatoire
21
		// uid[1] : identifiant image obligatoire
23
 
22
 
24
		// Controle detournement utilisateur
23
		// Controle detournement utilisateur
25
	   	session_start();
24
	   	session_start();
26
	   	$this->controleUtilisateur($uid[0]);
25
	   	$this->controleUtilisateur($uid[0]);
27
 
26
 
28
		$id_image_protegee = $this->proteger($uid[1]); 
27
		$id_image_protegee = $this->proteger($uid[1]); 
29
		$requete_selection_image = "SELECT * FROM cel_images WHERE ci_id_image = ".$id_image_protegee;
28
		$requete_selection_image = "SELECT * FROM cel_images WHERE ci_id_image = ".$id_image_protegee;
30
 
29
 
31
		$resultat_selection = $this->executerRequete($requete_selection_image);
30
		$resultat_selection = $this->executerRequete($requete_selection_image);
32
		
31
		
33
		$image = false;
32
		$image = false;
34
		
33
		
35
		if(count($resultat_selection) > 0) {
34
		if(count($resultat_selection) > 0) {
36
			$image = $resultat_selection[0];
35
			$image = $resultat_selection[0];
37
		}
36
		}
38
 
37
 
39
		$this->envoyer($image,'text/html','utf-8',true);
38
		$this->envoyer($image,'text/html','utf-8',true);
40
	}
39
	}
41
 
40
 
42
	/**
41
	/**
43
	 * Méthode appelée avec une requête de type POST avec un identifiant d'image.
42
	 * Méthode appelée avec une requête de type POST avec un identifiant d'image.
44
	 * Met a jour l'image correspondant à l'id passé en paramètre avec les valeurs passées dans le post
43
	 * Met a jour l'image correspondant à l'id passé en paramètre avec les valeurs passées dans le post
45
	*/
44
	*/
46
	public function updateElement($uid,$pairs)
45
	public function updateElement($uid,$pairs)
47
	{
46
	{
48
		// Controle detournement utilisateur
47
		// Controle detournement utilisateur
49
		$this->controleUtilisateur($uid[0]);
48
		$this->controleUtilisateur($uid[0]);
50
		
49
		
51
		$requete_mise_a_jour_image = 'UPDATE cel_images SET ' ;
50
		$requete_mise_a_jour_image = 'UPDATE cel_images SET ' ;
52
		
51
		
53
		$champs_a_mettre_a_jour = $this->construireRequeteMajMetaDonnees($pairs);
52
		$champs_a_mettre_a_jour = $this->construireRequeteMajMetaDonnees($pairs);
54
		$requete_mise_a_jour_image .= $champs_a_mettre_a_jour;
53
		$requete_mise_a_jour_image .= $champs_a_mettre_a_jour;
55
 
54
 
56
		$requete_mise_a_jour_image .= ' WHERE ci_id_image = '.$this->proteger($pairs['ci_id_image']) ;
55
		$requete_mise_a_jour_image .= ' WHERE ci_id_image = '.$this->proteger($pairs['ci_id_image']) ;
57
 
56
 
58
		$resultat_mise_a_jour = $this->executerRequete($requete_mise_a_jour_image);
57
		$resultat_mise_a_jour = $this->executerRequete($requete_mise_a_jour_image);
59
		
58
		
60
		$retour = false;
59
		$retour = false;
61
		
60
		
62
		if($resultat_mise_a_jour) {
61
		if($resultat_mise_a_jour) {
63
			$retour = 'OK';
62
			$retour = 'OK';
64
		}
63
		}
65
		
64
		
66
		$this->envoyer($retour);
65
		$this->envoyer($retour);
67
	}
66
	}
68
	
67
	
69
	/**
68
	/**
70
	 * Assemble la requete de mise à jour des champs de metadonnées
69
	 * Assemble la requete de mise à jour des champs de metadonnées
71
	 * 
70
	 * 
72
	*/
71
	*/
73
	private function construireRequeteMajMetaDonnees($valeurs_metadonnees) {
72
	private function construireRequeteMajMetaDonnees($valeurs_metadonnees) {
74
		
73
		
75
		$requete_maj_champs = '';
74
		$requete_maj_champs = '';
76
		
75
		
77
		$champs_a_ignorer = array('ci_ce_observation');
76
		$champs_a_ignorer = array('ci_ce_observation');
78
		
77
		
79
		foreach($valeurs_metadonnees as $champ  => $valeur)
78
		foreach($valeurs_metadonnees as $champ  => $valeur)
80
		{
79
		{
81
			
80
			
82
			if(!in_array($champ,$champs_a_ignorer)) {
81
			if (!in_array($champ,$champs_a_ignorer)) {
83
				if($champ == 'ci_meta_date') {
82
				if ($champ == 'ci_meta_date') {
84
	
83
	
85
					$date_tab = split('/',$valeur) ;
84
					$date_tab = split('/',$valeur) ;
86
					$date = $date_tab[2].'-'.$date_tab[1].'-'.$date_tab[0] ;
85
					$date = $date_tab[2].'-'.$date_tab[1].'-'.$date_tab[0] ;
87
	
86
	
88
					$requete_maj_champs .= $champ.' = "'.$date.'" , ' ;
87
					$requete_maj_champs .= $champ.' = "'.$date.'" , ' ;
89
	
88
	
90
				}
89
				}
91
				else {
90
				else {
92
					$requete_maj_champs .= $champ.' = '.$this->proteger($valeur).' , ' ;
91
					$requete_maj_champs .= $champ.' = '.$this->proteger($valeur).' , ' ;
93
				}
92
				}
94
			}
93
			}
95
		}
94
		}
96
 
95
 
97
		$requete_maj_champs = rtrim($query," , ") ;
96
		$requete_maj_champs = rtrim($query," , ") ;
98
		
97
		
99
		return $requete_maj_champs;
98
		return $requete_maj_champs;
100
	}
99
	}
101
 
100
 
102
 
101
 
103
	/**
102
	/**
104
	 * Méthode appelée avec une requête de type PUT.
103
	 * Méthode appelée avec une requête de type PUT.
105
	 * Stocke une image, crée ses miniatures et enregistre ses informations
104
	 * Stocke une image, crée ses miniatures et enregistre ses informations
106
	 * Renvoie l'identifiant d'image nouvellement crée en cas de succès
105
	 * Renvoie l'identifiant d'image nouvellement crée en cas de succès
107
	*/
106
	*/
108
	function createElement($pairs)
107
	function createElement($pairs)
109
	{
108
	{
110
		// Controle detournement utilisateur
109
		// Controle detournement utilisateur
111
		session_start();
110
		session_start();
112
		$this->controleUtilisateur($pairs['identifiant']);
111
		$this->controleUtilisateur($pairs['identifiant']);
113
				
112
				
114
		foreach($_FILES as $file) {
113
		foreach ($_FILES as $file) {
115
			$infos_fichier = $file ;
114
			$infos_fichier = $file ;
116
		}
115
		}
117
		
116
		
118
		if($this->ajouterImageSurDdEtBdd($pairs, $infos_fichier)) {
117
		if ($this->ajouterImageSurDdEtBdd($pairs, $infos_fichier)) {
119
			
118
			
120
			// l'upload demande de court-circuiter le fonctionnement normal de JREST
119
			// l'upload demande de court-circuiter le fonctionnement normal de JREST
121
			// en quittant directement après l'envoi
120
			// en quittant directement après l'envoi
122
			$this->envoyerMessageCreationEffectuee();
121
			$this->envoyerMessageCreationEffectuee();
123
			exit;
122
			exit;
124
		}
123
		}
125
 
124
 
126
	}
125
	}
127
	
126
	
128
	/**
127
	/**
129
	 * Ajout une image dans la base de données et stocke le fichier en fabriquant les miniatures,
128
	 * Ajoute une image dans la base de données et stocke le fichier en fabriquant les miniatures,
130
	 * renvoie le nouvel id d'image en cas de succès
129
	 * renvoie le nouvel id d'image en cas de succès
131
	 * 
130
	 * 
132
	 * @param array $pairs le tableau contenant l'identifiant de l'utilisateur
131
	 * @param array $pairs le tableau contenant l'identifiant de l'utilisateur
133
	 * @param array $infos_fichier les infos sur le fichier à traiter, de la même forme que les
132
	 * @param array $infos_fichier les infos sur le fichier à traiter, de la même forme que les
134
	 * élements du tableau $_FILES de php
133
	 * élements du tableau $_FILES de php
135
	*/
134
	*/
136
	public function ajouterImageSurDdEtBdd($pairs, $infos_fichier) {
135
	public function ajouterImageSurDdEtBdd($pairs, $infos_fichier) {
-
 
136
		
137
		
137
		$identifiant_utilisateur = $pairs['identifiant'];
138
		$nouvel_ordre = $this->obtenirNouvelOrdrePourUtilisateur($pairs['identifiant']);
138
		$nouvel_ordre = $this->obtenirNouvelOrdrePourUtilisateur($identifiant_utilisateur);
139
		
139
		
140
		if(!$nouvel_ordre) {
140
		if (!$nouvel_ordre) {
141
			$message = 'Erreur lors du calcul du nouvel ordre de l\'image';
141
			$message = 'Erreur lors du calcul du nouvel ordre de l\'image';
142
			trigger_error($message, E_USER_ERROR);
142
			trigger_error($message, E_USER_ERROR);
143
		}
143
		}
144
		
144
		
145
		$extracteur_metadonnees = new ExtracteurMetadonnees();
145
		$extracteur_metadonnees = new ExtracteurMetadonnees();
146
		$informations_image = $extracteur_metadonnees->extraireMetadonnees($infos_fichier['tmp_name']) ;
146
		$informations_image = $extracteur_metadonnees->extraireMetadonnees($infos_fichier['tmp_name']) ;
147
		
147
		
148
		if(!$informations_image) {
148
		if(!$informations_image) {
149
			$message = 'Erreur lors de l\'extraction des metadonnées';
149
			$message = 'Erreur lors de l\'extraction des metadonnées';
150
			trigger_error($message, E_USER_ERROR);
150
			trigger_error($message, E_USER_ERROR);
151
		}
151
		}
152
		
152
		
153
		// ajout de quelques informations supplémentaire, en sus 
153
		// ajout de quelques informations supplémentaire, en sus 
154
		// des metadonnées dejà extraites
154
		// des metadonnées dejà extraites
155
		$informations_image['ci_ordre'] = $nouvel_ordre ;
155
		$informations_image['ci_ordre'] = $nouvel_ordre ;
156
		$informations_image['ci_publiable_eflore'] = 'false' ;
156
		$informations_image['ci_publiable_eflore'] = 'false' ;
157
		$informations_image['ci_nom_original'] = $infos_fichier['name'] ;
157
		$informations_image['ci_nom_original'] = $infos_fichier['name'] ;
158
		
158
		
159
		// le md5 du fichier sert à repérer les images en doublons
159
		// le md5 du fichier sert à repérer les images en doublons
160
		$informations_image['ci_md5'] = md5_file($infos_fichier['tmp_name']) ;
160
		$informations_image['ci_md5'] = md5_file($infos_fichier['tmp_name']) ;
161
		$informations_image['ci_ce_utilisateur'] = $pairs['identifiant'] ;
161
		$informations_image['ci_ce_utilisateur'] = $identifiant_utilisateur ;
162
		
162
		
163
		$requete_insertion_infos_image = $this->construireRequeteInsertionImage($informations_image);
163
		$requete_insertion_infos_image = $this->construireRequeteInsertionImage($informations_image);
164
		$resultat_insertion_infos_image = $this->executerRequeteSimple($requete_insertion_infos_image);
164
		$resultat_insertion_infos_image = $this->executerRequeteSimple($requete_insertion_infos_image);
165
 
165
 
166
		if(!$resultat_insertion_infos_image) {
166
		if(!$resultat_insertion_infos_image) {
167
			$message = "Echec de l'insertion dans la base de donnees : " ;
167
			$message = "Echec de l'insertion dans la base de donnees : " ;
168
			trigger_error($message, E_USER_ERROR);
168
			trigger_error($message, E_USER_ERROR);
169
        }
169
        }
170
 
170
 
171
		$id_nouvelle_image = $this->obtenirIdImagePourIdentifiantEtOrdre($pairs['identifiant'], $nouvel_ordre);
171
		$id_nouvelle_image = $this->obtenirIdImagePourIdentifiantEtOrdre($identifiant_utilisateur, $nouvel_ordre);
172
		
172
		
173
		if(!$id_nouvelle_image)
173
		if(!$id_nouvelle_image)
174
		{
174
		{
175
			$message =  'Impossible d\'obtenir le nouvel identifiant de l\'image' ;
175
			$message =  'Impossible d\'obtenir le nouvel identifiant de l\'image' ;
176
			trigger_error($message, E_USER_ERROR);
176
			trigger_error($message, E_USER_ERROR);
177
		}
177
		}
178
		
178
		
179
		$manipulateur_image = new ImageRecreation($this->config);
179
		$manipulateur_image = new ImageRecreation($this->config);
180
		$fichier_stocke = $manipulateur_image->stockerFichierEtCreerMiniatures($infos_fichier,$id_nouvelle_image) ;
180
		$fichier_stocke = $manipulateur_image->stockerFichierEtCreerMiniatures($infos_fichier,$id_nouvelle_image);
181
		
181
		
182
		if(!$fichier_stocke) {
182
		if(!$fichier_stocke) {
183
			$message =  'Erreur lors du stockage du fichier' ;
183
			$message =  'Erreur lors du stockage du fichier' ;
184
			trigger_error($message, E_USER_ERROR);
184
			trigger_error($message, E_USER_ERROR);
185
		}
185
		}
186
		
186
		
187
		return $id_nouvelle_image;
187
		return $id_nouvelle_image;
188
	}
188
	}
189
	
189
	
190
	private function obtenirNouvelOrdrePourUtilisateur($id_utilisateur) {
190
	private function obtenirNouvelOrdrePourUtilisateur($id_utilisateur) {
191
 
191
 
192
		$nouvel_ordre = 0 ;
192
		$nouvel_ordre = 0 ;
193
		
193
		
194
		$requete_selection_ordre_max ='SELECT MAX(ci_ordre) as max_ordre FROM cel_images WHERE ci_ce_utilisateur = '.$this->proteger($id_utilisateur) ;
194
		$requete_selection_ordre_max ='SELECT MAX(ci_ordre) as max_ordre FROM cel_images WHERE ci_ce_utilisateur = '.$this->proteger($id_utilisateur) ;
195
		$resultat_requete_ordre_max = $this->executerRequete($requete_selection_ordre_max);
195
		$resultat_requete_ordre_max = $this->executerRequete($requete_selection_ordre_max);
196
		
196
				
197
		if($resultat_requete_ordre_max) {
197
		if($resultat_requete_ordre_max) {
198
			$nouvel_ordre = $resultat_requete_ordre_max[0]['max_ordre'];
198
			$nouvel_ordre = $resultat_requete_ordre_max[0]['max_ordre'];
199
			$nouvel_ordre = $nouvel_ordre++;
199
			$nouvel_ordre++;
200
		}
200
		}
201
		
201
		
202
		return $nouvel_ordre;
202
		return $nouvel_ordre;
203
	}
203
	}
204
	
204
	
205
	private function obtenirIdImagePourIdentifiantEtOrdre($id_utilisateur, $ordre) {
205
	private function obtenirIdImagePourIdentifiantEtOrdre($id_utilisateur, $ordre) {
206
		
206
		
207
		$id_image = false;
207
		$id_image = false;
208
		
208
		
209
		$requete_id_image ='SELECT ci_id_image FROM cel_images WHERE ci_ce_utilisateur = '.$this->proteger($id_utilisateur).' AND ci_ordre = '.$ordre ;
209
		$requete_id_image ='SELECT ci_id_image FROM cel_images WHERE ci_ce_utilisateur = '.$this->proteger($id_utilisateur).' AND ci_ordre = '.$ordre ;
210
		$resultat_id_image = $this->executerRequete($requete_id_image);
210
		$resultat_id_image = $this->executerRequete($requete_id_image);
211
 
211
 
212
        if(count($resultat_id_image) > 0)
212
        if(count($resultat_id_image) > 0)
213
		{
213
		{
214
			$id_image = $resultat_id_image[0]['ci_id_image'];
214
			$id_image = $resultat_id_image[0]['ci_id_image'];
215
        }
215
        }
216
		
216
		
217
        return $id_image;
217
        return $id_image;
218
	}
218
	}
219
	
219
	
220
	private function construireRequeteInsertionImage($informations_image) {
220
	private function construireRequeteInsertionImage($informations_image) {
221
		
221
		
222
		$requete_insertion_image = "INSERT INTO cel_images ";
222
		$requete_insertion_image = "INSERT INTO cel_images ";
223
		
223
		
224
		$champs_a_inserer = '' ;
224
		$champs_a_inserer = '' ;
225
		$valeurs_a_inserer = '' ;
225
		$valeurs_a_inserer = '' ;
226
 
226
 
227
		foreach($informations_image as $champ => $valeur)
227
		foreach($informations_image as $champ => $valeur)
228
		{
228
		{
229
			$champs_a_inserer .= $champ.',' ;
229
			$champs_a_inserer .= $champ.',' ;
230
 
230
 
231
			if(is_null($valeur))
231
			if(is_null($valeur))
232
			{
232
			{
233
				$valeurs_a_inserer .= 'NULL,' ;
233
				$valeurs_a_inserer .= 'NULL,' ;
234
			}
234
			}
235
			else
235
			else
236
			{
236
			{
237
				$valeurs_a_inserer .= $this->proteger($valeur).',' ;
237
				$valeurs_a_inserer .= $this->proteger($valeur).',' ;
238
			}
238
			}
239
		}
239
		}
240
		
240
		
241
		if($fichier_meta['ci_meta_date_time'] != 'NULL') {
241
		if($fichier_meta['ci_meta_date_time'] != 'NULL') {
242
			$champs_a_inserer .= 'ci_meta_date, ';
242
			$champs_a_inserer .= 'ci_meta_date, ';
243
        	$valeurs_a_inserer .= $this->proteger($fichier_meta['ci_meta_date_time']).',';
243
        	$valeurs_a_inserer .= $this->proteger($fichier_meta['ci_meta_date_time']).',';
244
		}
244
		}
245
 
245
 
246
        $champs_a_inserer .= 'ci_meta_date_ajout' ;
246
        $champs_a_inserer .= 'ci_meta_date_ajout' ;
247
        $valeurs_a_inserer .= 'CURRENT_TIMESTAMP()' ;
247
        $valeurs_a_inserer .= 'CURRENT_TIMESTAMP()' ;
248
 
248
 
249
		$requete_insertion_image .= "(".$champs_a_inserer.") VALUES (".$valeurs_a_inserer.")" ;
249
		$requete_insertion_image .= "(".$champs_a_inserer.") VALUES (".$valeurs_a_inserer.")" ;
250
		
250
		
251
		return $requete_insertion_image;
251
		return $requete_insertion_image;
252
	}
252
	}
253
	
253
	
254
	private function envoyerMessageCreationEffectuee() {
254
	private function envoyerMessageCreationEffectuee() {
255
			
255
			
256
		header('HTTP/1.0 200 Created');
256
		header('HTTP/1.0 200 Created');
-
 
257
		echo 'OK';
257
		exit() ;
258
		exit() ;
258
	}
259
	}
259
 
260
 
260
	/**
261
	/**
261
	 * Méthode appelée avec une requête de type DELETE.
262
	 * Méthode appelée avec une requête de type DELETE.
262
	 * Supprime les infos sur l'image et le fichier correspondant à l'id passé en parametre
263
	 * Supprime les infos sur l'image et le fichier correspondant à l'id passé en parametre
263
	*/
264
	*/
264
	function deleteElement($uid){
265
	function deleteElement($uid){
265
 
266
 
266
		// uid[0] : utilisateur obligatoire
267
		// uid[0] : utilisateur obligatoire
267
		// uid[1] : identifiant image(s) obligatoire(s)
268
		// uid[1] : identifiant image(s) obligatoire(s)
268
 
269
 
269
	 	// Controle detournement utilisateur
270
	 	// Controle detournement utilisateur
270
	    session_start();
271
	    session_start();
271
		$this->controleUtilisateur($uid[0]);
272
		$this->controleUtilisateur($uid[0]);
272
 
273
 
273
		if(!isset($uid[1]) || !$this->EstUneSuiteIdentifiantsImage($uid[1])) {
274
		if(!isset($uid[1]) || !$this->EstUneSuiteIdentifiantsImage($uid[1])) {
274
			return;
275
			return;
275
		}
276
		}
276
		
277
		
277
		$ids_images = $uid[1];
278
		$ids_images = $uid[1];
278
 
279
 
279
	    $requete_suppression_images = "DELETE FROM cel_images WHERE ci_id_image in (".$ids_images.")";
280
	    $requete_suppression_images = "DELETE FROM cel_images WHERE ci_id_image in (".$ids_images.")";
280
		$requete_suppression_lien_images_obs = "DELETE FROM cel_obs_images WHERE coi_ce_image in (".$ids_images.")";
281
		$requete_suppression_lien_images_obs = "DELETE FROM cel_obs_images WHERE coi_ce_image in (".$ids_images.")";
281
		
282
		
282
		$resultat_suppression_image = $this->executerRequeteSimple($requete_suppression_images);
283
		$resultat_suppression_image = $this->executerRequeteSimple($requete_suppression_images);
283
		$resultat_suppression_lien_images_obs = $this->executerRequeteSimple($requete_suppression_lien_images_obs);
284
		$resultat_suppression_lien_images_obs = $this->executerRequeteSimple($requete_suppression_lien_images_obs);
284
		
285
		
285
		if(!$resultat_suppression_image) {
286
		if(!$resultat_suppression_image) {
286
			$message =  'Erreur lors de la suppression de l\'image' ;
287
			$message =  'Erreur lors de la suppression de l\'image' ;
287
			trigger_error($message, E_USER_ERROR);
288
			trigger_error($message, E_USER_ERROR);
288
		}
289
		}
289
		
290
		
290
		if(!$resultat_suppression_lien_images_obs) {
291
		if(!$resultat_suppression_lien_images_obs) {
291
			$message =  'Erreur lors de la suppression des observations associées à l\'image' ;
292
			$message =  'Erreur lors de la suppression des observations associées à l\'image' ;
292
			trigger_error($message, E_USER_ERROR);
293
			trigger_error($message, E_USER_ERROR);
293
		}
294
		}
294
 
295
 
295
		$manipulateur_image = new ImageRecreation($this->config);
296
		$manipulateur_image = new ImageRecreation($this->config);
296
        $destruction_fichier_image = $manipulateur_image->detruireImageSurDisque($id);
297
        $destruction_fichier_image = $manipulateur_image->detruireImageSurDisque($id);
297
 
298
 
298
		$this->envoyer('OK');
299
		$this->envoyer('OK');
299
	}
300
	}
300
	
301
	
301
	private function estUneSuiteIdentifiantsImage($chaine) {
302
	private function estUneSuiteIdentifiantsImage($chaine) {
302
		
303
		
303
		// un ensemble d'identifiants est une suite d'identifiants séparés par des virgules
304
		// un ensemble d'identifiants est une suite d'identifiants séparés par des virgules
304
		// sans virgule terminale
305
		// sans virgule terminale
305
		$reg_exp = "/^(([0-9])+,)*([0-9])+$/";
306
		$reg_exp = "/^(([0-9])+,)*([0-9])+$/";
306
		
307
		
307
		return preg_match($reg_exp, $chaine);
308
		return preg_match($reg_exp, $chaine);
308
		
309
		
309
	}
310
	}
310
 
311
 
311
}
312
}
312
?>
313
?>