function ttChpLink($valb0,$reqsup="",$valc=""){
	//echo $reqsup;
	global $DBHost,$DBUser,$DBName,$DBPass,$carsepldef,$TBDname,$maxrepld;
	$valbrut=explode(';',$valb0);
	/// en cas de modif de la syntaxe, checker aussi PYAObj
	/// methode echoFilt, case LDLLV qui se sert de la chaine valb0 pour une requete imbriquée  
	if (count($valbrut)>1) { // connection �une base diff�ente
		$lntable=$valbrut[1];
		$defdb=explode(',',$valbrut[0]);
		$newbase=true;
		// si user et/ou hote d'acc� �la Bdd est diff�ent, on etablit une nvlle connexion
		// on fait une nouvelle connection syst�atiquement pourt etre compatioble avec pg_sql
		//if (($defdb[1]!="" && $defdb[1]!=$DBHost)||($defdb[2]!="" && $defdb[2]!=$DBUser)) {
		$lnc=db_connect($defdb[1],$defdb[2],$defdb[3],$defdb[0]) or die ("Impossible de se connecter au serveur $defdb[1], user: $defdb[2], passwd: $defdb[3]");
		$newconnect=true;
		//}
	} else { //commme avant
		$lntable=$valbrut[0];
		$newbase=false;
		$newconnect=false;
	}
	// gestion condition AND depuis PYA
	$valb2 = explode("[[",$lntable);
	if (count($valb2)>1) {
		$lntable=$valb2[0];
		if ($reqsup!="") {
			$reqsup= "(".$this->Val2." AND ".$valb2[1].")";
		} else $reqsup = $valb2[1];
	}
	// si une seule valeur a chercher, on ignore $reqsup sinon ça met la merde
	if ($valc != "") $reqsup = "";

	// 0: table, 1: champ lié(clé(s)); 2: ET SUIVANTS champs affiches
	$defl = explode(',',$lntable);
	$nbca = 0; // on regarde les suivants pour construire la requete
	$rcaf = "";
	$tbmultk = explode(":",$defl[1]); // on gère les clé multiples: le nom du champ clé est dans ce cas clé1:clé2:clé3
	// on boucle sur les champs à afficher
	while ($defl[$nbca+2]!="") {
		$nmchp=$defl[$nbca+2];
		$c2aff=true; // champ a afficher effectivement
		if (strstr($nmchp,"!")) { // caractere separateur defini
			$nmchp=explode("!",$nmchp);
			$tbcs[$nbca+1]=$nmchp[0]; // separateur avant le "!"
			$nmchp=$nmchp[1];
		}
		/* si le chp a afficher champ comporte un & au debut, il faut aller cherche les valeurs dans une
		table; les parametres sont  indiques dans les caracteristiques d'édition de CE champ dans la table  de définition*/
       	if (strstr($nmchp,"&")) { // si chainage
			$nmchp=substr ($nmchp,1); // enl�e le &
			if (strstr($nmchp,"~@")) { // si classement inverse en plus sur ce champ
				$nmchp=substr ($nmchp,2); // enl�e le @
				$orderby=" order by $nmchp DESC "; 
			} elseif (strstr($nmchp,"@")) { // si classement en plus sur ce champ
				$nmchp=substr ($nmchp,1); // enl�e le @
				$orderby=" order by $nmchp "; 
			}
     	 	$rqvc=db_query("select VALEURS from $TBDname where NM_CHAMP='$nmchp' AND NM_TABLE='$defl[0]'");
      	 	$resvc=db_fetch_row($rqvc);
     	 	$valbchain[$nbca+1]=$resvc[0]; /// TODO la syntaxe de Valeurs a évolué !!
    	}
       	if (strstr($nmchp,"@@")) { // si ce champ indique un champ de structure hierarchique avec la clé de type pid= parent id
			$cppid = substr ($nmchp,2); // enleve le @@
			$c2aff=false;
	 	} elseif (strstr($nmchp,"~@")) { // si classement inverse sur ce champ
			$nmchp=substr ($nmchp,2); // enleve le ~@
			$orderby=" order by $nmchp DESC";
		} elseif (strstr($nmchp,"@")) { // si classement sur ce champ
			$nmchp=substr ($nmchp,1); // enleve le @
			$orderby=" order by $nmchp ";
		}
		if ($c2aff) { // si champ à afficher
			$rcaf=$rcaf.",".$nmchp;
			$tbc2a[]=$nmchp; // tableau des champs où chercher
		}
		$nbca++;
	} // fin boucle
	if ($cppid) $nbca=$nbca-1; 

	
	if  ($valc!="") { // soit on cherche 1 et 1 seule valeur, ou plusieurs si $valc est un tableau, ou une chaine de caractères
		if (is_array($valc)) { // on a un tableau, donc plusieurs enregistrements recherchés
			if (count($tbmultk) > 1) { // si FK clé multiple
				foreach ($valc as $val1c) {
					$whsmk = "";
					$uval = explode(":",$val1c);
					$ik = 0;
					foreach($tbmultk as $ck) {
						$whsmk.=" $ck='".$uval[$ik]."' AND ";
						$ik++;
					}
					$whsl.="(".vdc($whsmk,5).") OR ";
				}
			} else { // pas clé multiple
				foreach($valc as $uval) {
					$whsl.=" $defl[1]='$uval' OR ";
				}
			} // fin si pas clémltiple
			$whsl=" where ".vdc($whsl,3);
		} elseif (strstr($valc,'__str2f__')) { // on cherche une chaine parmi les champs à afficher (utilisé par la popup de sel générique)
			$val2s=str_replace('__str2f__','',$valc);
			foreach($tbc2a as $chp) {
				$whsl.=" $chp LIKE '%$val2s%' OR ";
			}
			$whsl=" where ".vdc($whsl,3);
		} else { // on cherche une valeur
			if (count($tbmultk) > 1) { // clé multiple
				$whsmk = "";
				$uval = explode(":",$valc);
				$ik = 0;
				foreach($tbmultk as $ck) {
					$whsmk.=" $ck='".$uval[$ik]."' AND ";
					$ik++;
				}
				$whsl.= ' where ('.vdc($whsmk,5).')';
			} else $whsl=" where $defl[1]='$valc'"; // normal
		}
		if ($reqsup!="") { // rajoute req suppl eventuelle
			$whsl="(".$whsl.") AND ".$reqsup;
		}
	} else { 	// soit la liste est simplement limité par une clause where supplémentaire
			$whsl= ($reqsup != "" ? "WHERE ".$reqsup : "");
	}


	if ($cppid && $valc=="") { //on a une structure hierarchique et plus d'une valeur à chercher
		// on cherche les parents initiaux, ie ceux dont le pid est null ou egal a la cle du meme enregistrement
		if ($reqsup!="") $whreqsup=" AND $reqsup ";
		$rql=db_query("SELECT $defl[1], $cppid $rcaf from $defl[0] WHERE ($cppid IS NULL OR $cppid=$defl[1] OR $cppid=0) $whreqsup $orderby");
		while ($rw=db_fetch_row($rql)) {
			if($rw[0] !="") { // si cle valide
				$resaf=tradLib($rw[2]);
				for ($k=2;$k<=$nbca;$k++) {
					$cs=($tbcs[$k]!="" ? $tbcs[$k] : $carsepldef);
					if ($valbchain[$k]!="") {
						$resaf=$resaf.$cs.ttChpLink($valbchain[$k],"",$rw[$k + 1]);
					} else $resaf=$resaf.$cs.tradLib($rw[$k +1]);
				} // boucle sur chps �entuels en plus
				$tabCorlb[$rw[0]]=$resaf;
				rettarbo($tabCorlb,$rw[0],$defl,$cppid,$rcaf,$orderby,$nbca,$tbcs,0,$whreqsup); 
				//print_r($tabCorlb);				
			} // fin si cl�valide
		} // fin boucle reponses
		if (!is_array($tabCorlb)) { // pas de reponses
			$tabCorlb[err]="Error ! impossible construire l'arbre ";
		}
	} else { // pas hierarchique => normal
		$defl[1] = str_replace(":",",",$defl[1]); // au cas ou clé multiple
		$sqln =  addwherefORlimit("SELECT $defl[1] $rcaf from $defl[0] $whsl $orderby",$maxrepld);
		
		$rql=db_query($sqln);
		// constitution du tableau associatif a2 dim de corresp code ->lib
		//echo "<!--debug2 rql=SELECT $defl[1] $rcaf from $defl[0] $whsl $orderby <br/>-->";
		$tabCorlb=array();
		$nbkm = count($tbmultk)>1 ? count($tbmultk) : 1; // nbre clé
		while ($resl=db_fetch_row($rql)) {
			$cle = $resaf = "";
			if ($nbkm > 1) { // clé multiple
				for ($k=0;$k<$nbkm;$k++) $cle .= $resl[$k].":";
				$cle = vdc($cle,1);
			} else { // clé simple
				$nbkm = 1;
				$cle=$resl[0];
			}
			for ($k=$nbkm;$k < ($nbca + $nbkm);$k++) {
				$cs=($tbcs[$k]!="" ? $tbcs[$k] : ($k!=$nbkm ? $carsepldef : ""));
				if ($valbchain[$k]!="") {
					$resaf=$resaf.$cs.ttChpLink($valbchain[$k],"",$resl[$k]);
				} else $resaf = $resaf.$cs.tradLib($resl[$k]);
			}
			$tabCorlb[$cle]=stripslashes($resaf); // tableau associatif de correspondance code -> libell�
			//echo "<!--debug2 cle: $cle; val: $resaf ; valverif:   ".$tabCorlb[$cle]."-->\n";
		}
		// fin boucle sur les r�ultats
	} // fin si pas hierarchique=normal

	// retablit les param�res normaux si n��saire
	if ($newconnect || $newbase) {
		db_close($lnc);
		db_connect($DBHost,$DBUser,$DBPass,$DBName);// r�uvre la session normale
		}
	//if ($newbase) mysql_select_db($DBName) or die ("Impossible d'ouvrir la base de donn�s $DBName.");
	if ($valc!="" && !strstr($valc,'__str2f__')) {
		if ($resaf=="") $resaf="N.C.";
		return ($resaf);
	} else {
		return($tabCorlb); // retourne le tableau associatif
	}
}
function ttChpLink($valb0,$reqsup="",$valc=""){
global $DBHost,$DBUser,$DBName,$carsepldef,$TBDname;
//$valb0=str_replace (' ','',$valb0); // enlève espaces indésirables
$valbrut=explode(';',$valb0);
if (count($valbrut)>1) { // connection à une base différente
  $lntable=$valbrut[1];
  $defdb=explode(',',$valbrut[0]);
  $newbase=true;
 // si user et/ou hote d'accès à mysql est différent, on etablit une nvlle connexion Mysql
   if (($defdb[1]!="" && $defdb[1]!=$DBHost)||($defdb[2]!="" && $defdb[2]!=$DBUser)) {
     $lnc=mysql_connect($defdb[1],$defdb[2],$defdb[3]) or die ("Impossible de se connecter au serveur $defdb[1], user: $defdb[2], passwd: ***** ");
	 $newconnect=true;
     }
   mysql_select_db($defdb[0]) or die ("Impossible d'ouvrir la base de données $defdb[0].");
  }
else { //commme avant
   $lntable=$valbrut[0];
   $newbase=false;
   $newconnect=false;
   }
// 0: table, 1: champ lié (clé); 2: ET SUIVANTS champs affichés
$defl=explode(',',$lntable);
$nbca=0; // on regarde les suivants pour construire la requete
$rcaf="";
/* si le 1er à afficher champ comporte un & au début, il faut aller cherche les valeurs dans une 
table; les paramètres sont  indiqués dans les caractéristiques d'édition de CE champ dans la table  de définition*/
if (strstr($defl[2],"&")) { // si chainage
    $nmchp=substr ($defl[2],1); // enlève le &
       if (strstr($nmchp,"@")) { // si classement sur ce champ
         $nmchp=substr ($nmchp,1); // enlève le @
         $orderby=" order by $nmchp ";
         }
     $rcaf=$nmchp;
     $rqvc=msq("select VALEURS from $TBDname where NM_CHAMP='$nmchp' AND NM_TABLE='$defl[0]'");
     $resvc=mysql_fetch_row($rqvc);
     $valbchain=$resvc[0];
    }
else {
     while ($defl[$nbca+2]!="") {
       $nmchp=$defl[$nbca+2];
       if (strstr($nmchp,"!")) { // caractère spérateur défini
         $nmchp=explode("!",$nmchp);
       $tbcs[$nbca+1]=$nmchp[0]; // séparateur avant le "!"
       $nmchp=$nmchp[1];
         }
       if (strstr($nmchp,"@")) { // si classement sur ce champ
         $nmchp=substr ($nmchp,1); // enlève le @
       $orderby=" order by $nmchp "; 
         }
       $rcaf=$rcaf.",".$nmchp;
       $nbca++;
       }
}
 // soit on cherche 1 et 1 seule valeur
if  ($valc!="") {
    $whsl=" where $defl[1]='$valc'";
    }
// soit la liste est limitée par une clause where supplémentaire
else {
     $whsl=$reqsup;
     }
$rql=msq("SELECT $defl[1] $rcaf from $defl[0] $whsl $orderby");
// constitution du tableau associatif à 2 dim de corresp code ->lib
//echo "<!--debug2 rql=SELECT $defl[1] $rcaf from $defl[0] $whsl $orderby <BR>-->";
$tabCorlb=array();
while ($resl=mysql_fetch_row($rql)) {
  //$cle=strtoupper($resl[0]);
	$cle=$resl[0];
	//echo "<!--debug2: $cle\n-->";
  if (isset($valbchain)) { // champ lié à nouveau
     $resaf=ttChpLink($valbchain,"",$cle); // on réentre dans la fonction et on va chercher dans le champ 
     }
  else { // pas de liaison, on construit
    $resaf=$resl[1];
    for ($k=2;$k<=$nbca;$k++) {
      $cs=($tbcs[$k]!="" ? $tbcs[$k] : $carsepldef);
      $resaf=$resaf.$cs.$resl[$k];
      }
  }
  $tabCorlb[$cle]=$resaf; // tableau associatif de correspondance code -> libellé
  //echo "<!--debug2 cle: $cle; val: $resaf ; valverif:   ".$tabCorlb[$cle]."-->\n";  
  } 
  // fin boucle sur les résultats
// retablit les paramètres normaux si nécéssaire
if ($newconnect) {
	mysql_close($lnc);
	DBconnect(); // réouvre la session normale
	}
if ($newbase) mysql_select_db($DBName) or die ("Impossible d'ouvrir la base de données $DBName.");
if ($valc!="") {
  if ($resaf=="") $resaf="N.C.";
  return ($resaf);
  }
else {
	return($tabCorlb); // retourne le tableau associatif
	}
}
<? // liste déroulane générique
// appellee par les popl en ajax..
require_once("fonctions.php");
$charset=($_SESSION['ss_parenv']['encoding']!="" ? $_SESSION['ss_parenv']['encoding'] : "utf-8");
@ini_set("default_charset", $charset);
header('Content-type: text/html; charset='.$charset); 

$tbres=ttChpLink($_REQUEST['chp_lnk'],"",'__str2f__'.$_REQUEST['txt2srch']);
if (is_array($tbres)) {
//print_r($tbres);
echo '<select size="'.$ldajaxdynsize.'" name="srcList" multiple="multiple" id="srcList" style="width:'.$ldajaxdynwidth.'">';
foreach ($tbres as $k=>$v) {
	echo '<OPTION value="'.$k.'">'.$v.'</OPTION>';
	}
echo "</select>";
} else echo "Aucun enregistrement correspondant aux criteres..";

?>
echo date("dmy");
?>
"></b>

<h3>Actions disponibles:</h3>

<h4>Import de fichiers trk ou wpt (CartoExplorer)</h4>
Sélectionner une discpline dans la liste :<br/>
<?php 
// nouvel objet pour sélection liste déroulante disciplines
$ObjSeLD = new PYAobj();
$ObjSeLD->NmBase = $dbname;
$ObjSeLD->NmTable = "parcours";
$ObjSeLD->NmChamp = "parcours_discp";
$ObjSeLD->InitPO();
$tabLD = ttChpLink($ObjSeLD->Valeurs);
$tabLD = array(0 => "Aucun") + $tabLD;
DispLD($tabLD, "LDCats", "no", "");
?>
Sélectionner le fichier à importer : <input type="file" name="ce3file"><BR/>
<input type="radio" name="actionname" value="impce3file">Import Fichier CE3<BR/>
<hr/>

<h4>Import du SIG Régional en shp</h4>
Opérations à réaliser pour un import Kayak du SIG Regional:<br><pre>
- Supprimer la table temporaire zimptmp_parc_kk (plus obligé si option -d passé à shp2pgsql)
- exécuter les commandes
/usr/local/pgsql/bin/shp2pgsql -d Parcours.shp zimptmp_parc_kk > /tmp/zimptmp_parc_kk.sql
- puis (en user pguser)
psql etoil < /tmp/zimptmp_parc_kk.sql
</pre>