difficultées avec les array_push ou array[]=

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : difficultées avec les array_push ou array[]=

par vince_weed » 30 mai 2008, 13:23

je suis conscient que le probleme ne vient pas du traitement de champs (j'en parlait juste en réponse au posts précédents pour expiquer les différentes facon dont je pouvait juger de ce que j'avait dans mon tableau), il vient de la création de nouvel element dans le tableau via array_push() (cf premier message) pour ce qui est de la valeur du print_r() attention les yeux (le champs concerné etant l'avant dernier):
Array( [1] => Array ( [date_cree] => Array ( [sql] => date_cree [obligatoire] => [label] => Date de création de la FM [default] => 30-05-2008 [type] => hidden [fonction] => ) [etat_fm] => Array ( [sql] => etat_fm [obligatoire] => [label] => État de la FM [default] => 1 [type] => hidden [fonction] => getHiddenEtat ) [lien] => Array ( [sql] => lien [obligatoire] => [label] => Liée à la fiche [default] => [type] => special [fonction] => getSpecialLien ) [designation_prod] => Array ( [sql] => designation_prod [obligatoire] => 1 [label] => Nom de la solution [default] => [type] => hidden [fonction] => getHiddenSolution [size] => 60 [maxlength] => 54 ) [client] => Array ( [sql] => client [obligatoire] => 1 [label] => Client [default] => [type] => select [def_label] => -- Client -- [fonction] => getSelectClient ) [solution_pour_handicap] => Array ( [sql] => solution_pour_handicap [obligatoire] => 1 [label] => Solution pour handicap [default] => 0 [type] => checkbox [check_value] => Oui [uncheck_value] => Non ) [desc_synt_prod] => Array ( [sql] => desc_synt_prod [obligatoire] => 1 [label] => Description synthétique du produit [default] => [type] => textarea [rows] => 4 [cols] => 40 ) [constructeur] => Array ( [sql] => constructeur [obligatoire] => 1 [label] => Constructeur [default] => [type] => select [def_label] => -- Constructeur -- [fonction] => getSelectConstructeur ) [date_comm] => Array ( [sql] => date_comm [obligatoire] => [label] => Date de commercialisation [default] => 30-05-2008 [type] => text [size] => 12 [maxlength] => 10 ) [duree_garantie] => Array ( [sql] => duree_garantie [obligatoire] => [label] => Durée de garantie [default] => [type] => text [size] => 25 [maxlength] => 20 ) ) [2] => Array ( [code_prod] => Array ( [sql] => designation_prod [obligatoire] => [label] => Code du modèle de produit [default] => [type] => hidden ) [classification] => Array ( [sql] => designation_prod [obligatoire] => [label] => Classification [default] => [type] => special [fonction] => getSpecialClassification ) [mode_gestion] => Array ( [sql] => mode_gestion [obligatoire] => 1 [label] => Mode de gestion [default] => 1 [type] => select [def_label] => -- Modes de gestions -- [fonction] => getSelectModeGestion [onchange] => onChangeModeGestion() ) [code_prod_g] => Array ( [sql] => code_prod_g [obligatoire] => [label] => Code du produit générique [default] => [type] => hidden [size] => 10 [maxlength] => 10 ) [type_de_produit] => Array ( [sql] => type_de_produit [obligatoire] => [label] => type de produit [default] => --type de produit-- [type] => select [def_label] => --type de produit-- [fonction] => getTypeP ) [type_homo] => Array ( [sql] => type_homo [obligatoire] => 1 [label] => Type d’homologation [default] => [type] => select [def_label] => -- Type -- [fonction] => getSelectTypeHomo [onchange] => onChangeTypeHomo() ) [est_demandable] => Array ( [sql] => est_demandable [obligatoire] => [label] => Demandable avec ADELIE [default] => 1 [type] => checkbox [onclick] => onClickEstDemandable() [check_value] => Oui [uncheck_value] => Non ) [valid_adelie] => Array ( [sql] => valid_adelie [obligatoire] => [label] => Validation Adélie [default] => [type] => select [def_label] => [fonction] => getSelectAdelie ) [num_dossier] => Array ( [sql] => num_dossier [obligatoire] => 1 [label] => Numéro du dossier [default] => [type] => text [size] => 5 [maxlength] => 5 [pre_input] => HIS/HLS  ) [mat_rempl] => Array ( [sql] => designation_prod [obligatoire] => [label] => Matériels remplacés par le nouveau matériel [default] => [type] => special [fonction] => getSpecialRemplace ) ) [3] => Array ( [info_client] => Array ( [sql] => client [obligatoire] => [label] => Client [default] => [type] => hidden [fonction] => getHiddenClient [onchange] => initPerimetreCibleEtSocle() ) [perimetre_cible] => Array ( [sql] => perimetre_cible [obligatoire] => 1 [label] => Périmetre cible [default] => [type] => select [def_label] => --- [fonction] => getSelectPerimetreCible [pre_input] => [post_input] => ) [driver_joint] => Array ( [sql] => driver_joint [obligatoire] => 1 [label] => Driver à insaller [default] => 0 [type] => checkbox [onclick] => onClickModifIntegreAuSocle() [check_value] => Oui [uncheck_value] => Non ) [integre_au_socle] => Array ( [sql] => integre_au_socle [obligatoire] => 1 [label] => Driver intégré au socle [default] => 0 [type] => checkbox [check_value] => Oui [uncheck_value] => Non ) [identifiant_easyvista_man] => Array ( [sql] => identifiant_easyvista_man [obligatoire] => 1 [label] => Identifiant EasyVista manuel [default] => [type] => text ) [env_tech_homo] => Array ( [sql] => env_tech_homo [obligatoire] => 1 [label] => Socle technique [default] => [type] => select [def_label] => --- [fonction] => getSelectSocleTechnique [pre_input] => [post_input] => ) [integration_socle] => Array ( [sql] => integration_socle [obligatoire] => 1 [label] => Intégration socle [default] => 2 [type] => select [def_label] => [fonction] => getSelectIntegrationSocle [onchange] => onChangeIntegrationSocle() ) [reference_socle] => Array ( [sql] => reference_socle [obligatoire] => [label] => Référence du socle [default] => [type] => select [def_label] => [fonction] => getSelectSocle ) [image] => Array ( [sql] => image [obligatoire] => [label] => Photo du produit [type] => upload [def_label] => ) [caracter_tech2] => Array ( [sql] => caracter_tech2 [obligatoire] => [label] => Technologie [default] => [type] => text ) [caracter_tech3] => Array ( [sql] => caracter_tech3 [obligatoire] => [label] => Zone d'affichage [default] => [type] => text ) [caracter_tech4] => Array ( [sql] => caracter_tech4 [obligatoire] => [label] => Espacement de pixels [default] => [type] => text ) [caracter_tech5] => Array ( [sql] => caracter_tech5 [obligatoire] => [label] => Temps de réponse [default] => [type] => text ) [caracter_tech6] => Array ( [sql] => caracter_tech6 [obligatoire] => [label] => Angle d'affichage [default] => [type] => text ) [caracter_tech7] => Array ( [sql] => caracter_tech7 [obligatoire] => [label] => Luminosité [default] => [type] => text ) [caracter_tech8] => Array ( [sql] => caracter_tech8 [obligatoire] => [label] => Taux de contraste [default] => [type] => text ) [caracter_tech9] => Array ( [sql] => caracter_tech9 [obligatoire] => [label] => Résolution optimale [default] => [type] => text ) [caracter_tech10] => Array ( [sql] => caracter_tech10 [obligatoire] => [label] => Type de connecteur [default] => [type] => text ) [caracter_tech11] => Array ( [sql] => caracter_tech11 [obligatoire] => [label] => Multimedia [default] => [type] => text ) [caracter_tech12] => Array ( [sql] => caracter_tech12 [obligatoire] => [label] => Autre accessoire [default] => [type] => text ) [caracter_tech13] => Array ( [sql] => caracter_tech13 [obligatoire] => [label] => Alimentation (interne/externe) [default] => [type] => text ) [caracter_tech14] => Array ( [sql] => caracter_tech14 [obligatoire] => [label] => Pieds / fixation [default] => [type] => text ) [caracter_tech15] => Array ( [sql] => caracter_tech15 [obligatoire] => [label] => Dimension et poids [default] => [type] => text ) [caracter_tech16] => Array ( [sql] => caracter_tech16 [obligatoire] => [label] => [default] => [type] => none ) [caracter_tech17] => Array ( [sql] => caracter_tech17 [obligatoire] => [label] => [default] => [type] => none ) [caracter_tech18] => Array ( [sql] => caracter_tech18 [obligatoire] => [label] => [default] => [type] => none ) [caracter_tech19] => Array ( [sql] => caracter_tech19 [obligatoire] => [label] => [default] => [type] => none ) [caracter_tech20] => Array ( [sql] => caracter_tech20 [obligatoire] => [label] => [default] => [type] => none ) [caracter_tech21] => Array ( [sql] => caracter_tech21 [obligatoire] => [label] => [default] => [type] => none ) [pre_requis] => Array ( [sql] => pre_requis [obligatoire] => [label] => Pré-requis à l'intervention ISS [default] => [type] => textarea [cols] => 40 [rows] => 2 ) [pre_requis_install] => Array ( [sql] => pre_requis_install [obligatoire] => [label] => Pré-requis à l'installation ISS [default] => [type] => textarea [cols] => 40 [rows] => 2 ) [commentaires] => Array ( [sql] => commentaires [obligatoire] => [label] => Commentaires [default] => [type] => textarea [cols] => 40 [rows] => 4 ) [0] =>  [4] => Array ( [user_id_cree] => Array ( [sql] => user_id_cree [obligatoire] => 1 [label] => [default] => 493 [type] => none ) ))
Notice: 

je devrai avoir quelquechose du genre:
 [type_de_produit] => Array ( [sql] => type_de_produit [obligatoire] => [label] => type de produit [default] => --type de produit-- [type] => select [def_label] => --type de produit-- [fonction] => getTypeP ) 
et je me retrouve avec :
[0] => 

par Hywan » 30 mai 2008, 12:58

Tu ne prends pas le problème au bon endroit je ne crains.
Si $tab_champs n'est pas renseigné, ce n'est pas dans ta fonction qui reçoit le tableau qu'il faut regarder mais lors de la construction du tableau.

Est-ce que tu pourrais nous donner la valeur de print_r($tab_champs) avant l'appel de ta fonction GetForm ou juste après sa construction (d'ailleurs, y a-t-il manipulation du tableau entre ?) ?

par Rei Itchido » 30 mai 2008, 12:44

suite a son poste j'ai essayé un print_r() qui me confirme que le tableau n'est pas renseigné
(le traitement étant similaire a celui fait pour d'autre champs dans le formulaire il n'y avait que peut de chance d'obtenir un résulata différent si le tableau avait été correctement rempli.
en fait j traite mon tableau avec la fonction suivante (le tableau étant "$tab_champ"):
Eu ben si ton tableau n'est pas rempli il n'y a aucune chance d'obtenir un résultat non? :-k

par vince_weed » 30 mai 2008, 11:58

suite a son poste j'ai essayé un print_r() qui me confirme que le tableau n'est pas renseigné
(le traitement étant similaire a celui fait pour d'autre champs dans le formulaire il n'y avait que peut de chance d'obtenir un résulata différent si le tableau avait été correctement rempli.
en fait j traite mon tableau avec la fonction suivante (le tableau étant "$tab_champ"):
function getForm($tab_champs, $valeurs_champs, $tab_champs_en_rouge){
		// le style à ajouter aux champs en cas d'erreur
		$ecrit_erreur = ' style="color:red; font-weight:bold;"';
		$type_sans_label_ni_fin = array('special', 'none');
		
		$html = '';
		foreach($tab_champs as $champ){
			
			// ajout un peu de fantaisie à l'affichage
			//$tuning = ' onfocus="g(\''.$champ['sql'].'\').style.border=\'solid 1px #BFDDF9\';" onblur="g(\''.$champ['sql'].'\').style.border=\'solid 1px #7F9DB9\';"';
			$tuning = '';
			
			// le libelle (la premiere colonne)
			$label = "\t" .
				'<tr>
			    	<td class="formulaire_libelle">
			    		<label for="'.$champ['sql'].'"'.(in_array($champ['sql'], $tab_champs_en_rouge)?$ecrit_erreur:'').'>
			    			'.$champ['label'].' '.($champ['obligatoire']?__CHAMPS_HTML_OBLIGATOIRE__:'').'
			    		</label>
			    	</td><td class="formulaire_champs">
			    	';
			if(array_key_exists('pre_input', $champ)) $label .= $champ['pre_input'];
			
			// fin de la ligne
			$fin = '';
			if(array_key_exists('post_input', $champ)) $fin .= $champ['post_input'];
			// ajout complementaires pour certains champs (en général c'est de la déco)
			$fin .= ajoutComplementaire($champ, $valeurs_champs);
			$fin .= '
			    	</td>
			    </tr>';
			
			// certains types de champs gèrent eux meme le debut et la fin de leurs lignes
			if(!in_array($champ['type'], $type_sans_label_ni_fin))
				 $html .= $label;
			
			// les inputs
			switch($champ['type']){
				case 'text':
	
					$html .= '<input type="text" id="'.$champ['sql'].'" name="'.$champ['sql'].'" size="'.$champ['size'].'" maxlength="'.$champ['maxlength'].'" value="'.$valeurs_champs[$champ['sql']].'"'.$tuning.((isset($champ['enable']) and $champ['enable']==false)?' disabled':'').'>';
				
					break;
					
					
					
				case 'select':
				
					if($champ['sql'] == 'mode_gestion')
					{
						$html .= '
							<select id="'.$champ['sql'].'" name="'.$champ['sql'].'"'.(array_key_exists('onchange', $champ)?' onchange=onChangeModeGestion(\''.$_POST['code_prod_g'].'\')':'').((isset($champ['enable']) and $champ['enable']==false)?' disabled':'').$tuning.'>
				    	';
					}
					/*elseif($champ['sql'] == 'type_de_produit')
					{
						$html .= '
							<select id="'.$champ['sql'].'" name="'.$champ['sql'].'"'.(array_key_exists('onchange', $champ)?' onchange=MoveCarac(\''.$valeurs_champs[$champ['sql']].'\')':'').((isset($champ['enable']) and $champ['enable']==false)?' disabled':'').$tuning.'>
				    	';
				    	global $db;
				    	$id = 2;
				    	
				    	$res = $db->query('SELECT id_carac,label_carac FROM fiches.carac_tech_produit WHERE id_type_prod ="1"');					
							while(($row=$db->fetch_assoc($res))!=NULL)
							{
								
								echo $row['label_carac'].' ';
								$tab_champs['3']['caracter_tech'.$id]['label'] = $row['label_carac'];
								echo $tab_champs['3']['caracter_tech'.$id]['label'].'</br>';
								$id = $id + 1;
							}	
					}*/
					else
					{
						$html .= '
							<select id="'.$champ['sql'].'" name="'.$champ['sql'].'"'.(array_key_exists('onchange', $champ)?' onchange="'.$champ['onchange'].'"':'').((isset($champ['enable']) and $champ['enable']==false)?' disabled':'').$tuning.'>
				    	';
					}
			    	if(array_key_exists('def_label', $champ))
			    		$html .= '<option value="">'.$champ['def_label'].'&nbsp;</option>';
			    	
			    	
			    	// remplissage du select
	    			if(array_key_exists('fonction', $champ)){
	    				$temp_select_funct = create_function('$selected, $fm_view', 'return '.$champ['fonction'].'($selected,$fm_view);');
	    				$html .= $temp_select_funct($valeurs_champs[$champ['sql']], false);
	    			}
							
			    	$html .= '
			    		</select>
			    	';
					break;
					
				case 'textarea':
					$html .= '
						<textarea id="'.$champ['sql'].'" name="'.$champ['sql'].'" rows="'.$champ['rows'].'" cols="'.$champ['cols'].'"'.((isset($champ['enable']) and $champ['enable']==false)?' disabled':'').$tuning.'>'.$valeurs_champs[$champ['sql']].'</textarea>
					';
					break;
					
				case 'hidden':
					$html .= '<input type="hidden" id="'.$champ['sql'].'" name="'.$champ['sql'].'" value="'.$valeurs_champs[$champ['sql']].'">';
					
					// affiche quelque chose quand meme
					if(!empty($champ['fonction']))
					{
						$temp_select_funct = create_function('$data, $read_only', 'return '.$champ['fonction'].'($data,$read_only);');
	    				$html .= $temp_select_funct($valeurs_champs[$champ['sql']], false);
					}
					elseif(!empty($champ['sql']) && $champ['sql'] == 'code_prod_g')
					{
						$html .= '<span id="code_prod_gene">Ne nécessite pas de code produit générique</span>';				
					}
					else
					{
						$html .= $valeurs_champs[$champ['sql']];
					}
					break;
				case 'checkbox':
[b][...][/b]

par Rei Itchido » 30 mai 2008, 11:22

Comme te le conseille HyWaN, commence par afficher ton tableau avec print_r() ou var_dump() pour voir si le soucis se situe dans le tableau ou dans ce que tu en fais dans ton formulaire ;)

par vince_weed » 30 mai 2008, 10:50

En fait les valeurs dans le tableau sont utilisé pour générer dynamiquement un formulaire en fonction des valeur de certain des champs. lors de l'affichage du formulaire rien n'apparait pour ce champs.j'ai donc essayé d'afficher les valeurs du tableau grace à un alert() dans mon JS (et une fonction déja codé me permettant d'accéder aux élémens du tableau) et pour cette "case" du tableau je n'ai rien d'affiché.

Je vous remerci de votre aide a tout les deux, mais n'ai pas plus de temps a consacré a ce problème, je le contournerai en créant en dur des valeurs en plus dans le tableau, initialisées avec des constantes bidons que j irai les modifier avec le JS plustot que de les créer dynamiquement.

Enfin si quelqu'un a la solution qui lui saute aux yeux j refuse pas d'apprendre non plus ^^.

par Hywan » 30 mai 2008, 07:47

Hey :),

Comment tu sais que ta valeur est vide ? Tu l'affiches avec quoi ?
Essaye print_r($tab_champs) pour dégrossir et var_dump($tab_champs) pour affiner ton affichage. Qu'est-ce qu'il t'affiche avec la méthode qui fonctionne chez Berzemus et le var_dump ?

par vince_weed » 29 mai 2008, 16:41

ah bizard... et bien je te remerci, je vais vais essayer de voir pourquoi cette méthode ne mache pas chez moi et contournerai le problème (de manière peu élégante :? ) si je ne trouve toujour pas.

par Berzemus » 29 mai 2008, 16:35

Difficile à dire, chez moi ce code-ci fonctionne parfaitement:
$tab_champs['3'][]=array('caracter_tech' => array
                                            (
                                                'sql'            => 'caracter_tech',
                                                'obligatoire'    => false,
                                                'label'            => 'test',
                                                'default'        => 'test',
                                                'type'            => 'text'                    
                                            ),
                                          ); 

par vince_weed » 29 mai 2008, 15:58

Pas de message d'erreur mais uniquement un simple champs vide inséré dans le tableau.

par Berzemus » 29 mai 2008, 15:47

qu'est-ce que tu entends par "ne fonctionne pas" ?

Un message d'erreur est associé ?

difficultées avec les array_push ou array[]=

par vince_weed » 29 mai 2008, 15:39

j'essaye vainement d'ajouter un tableau à deux dimensions supplémentaire dans un autre tableau dont la structure est prévu a cet effet (enfin je croit ^^) mais cela ne fonctionne pas ...

structure du tableau:
$tab_champs = array(
			// etape 1
			'1' => array(								// "1" est le numero de l'étape
				'date_cree' => array(
					'sql'			=> 'date_cree',
					'obligatoire'	=> false,
					'label'			=> 'Date de création de la FM',
					'default'		=> date('d-m-Y', time()),
					
					'type'			=> 'hidden',
					'fonction'		=> ''
				),
				'etat_fm' => array(
					'sql'			=> 'etat_fm',
					'obligatoire'	=> false,
					'label'			=> 'État de la FM',
					'default'		=> '1',
					
					'type'			=> 'hidden',
					'fonction'		=> 'getHiddenEtat'
				),



[...]


essai d'insertion avec array push:

array_push(
					$tab_champs['3'],( 
									array('caracter_tech' => array
											(
												'sql'			=> 'caracter_tech',
												'obligatoire'	=> false,
												'label'			=> 'test',
												'default'		=> 'test',
												'type'			=> 'text'					
											),
										  )
									)
				   );


tentative d'insertion avec $array[] = :

$tab_champs['3'][]=array('caracter_tech' => array
											(
												'sql'			=> 'caracter_tech',
												'obligatoire'	=> false,
												'label'			=> 'test',
												'default'		=> 'test',
												'type'			=> 'text'					
											),
										  );

Sachant que juste avant dans le fichier le code j'utilise ce morceau de code "du même genre" (celui inscrit juste en dessous) et cela marche bien....
if(isset($fm_modif))
			{
				global $db;
				
				$type = $db->query(	'SELECT id_carac,label_carac '.
									'FROM fiches.carac_tech_produit '.
									' WHERE id_type_prod IN ( ' .
										'SELECT type_de_produit ' .
										'FROM fiches.fiche_materiel ' .
										'WHERE id = '.$_POST['fm_modif'].')');
				$id = 2;				
				while(($row=$db->fetch_assoc($type))!=NULL)
				{
					$tab_champs['3']['caracter_tech'.$id]['label'] = $row['label_carac'];
					$tab_champs['3']['caracter_tech'.$id]['type'] = 'text';
					$id = $id + 1;
				}
			}