boucle dans une requete insert

Eléphant du PHP | 107 Messages

27 janv. 2010, 12:23

Bonjour

je suis bloqué face à cette boucle permettant d'inserer des données via un fichier xml selon leur type

le fichier xml est comme ça :

Code : Tout sélectionner

<?xml version="1.0" encoding="ISO-8859-1" ?> <MAP name="" isArray="true"> <MAP name="__index__value__0" isArray="false"> <TIMESTAMP name="dateupload">2010-01-00T00:00:00.000</TIMESTAMP> <STR name="encoding">flv</STR> <STR name="filename">file_0.flv</STR> <STR name="lastseen">USA</STR> <UINT32 name="mediaId">0</UINT32> <STR name="owner">JOHN</STR> <UINT32 name="size">0</UINT32> </MAP> <MAP name="__index__value__1" isArray="false"> <TIMESTAMP name="dateupload">2010-01-01T00:00:01.000</TIMESTAMP> <STR name="encoding">mp4</STR> <STR name="filename">file_1.flv</STR> <STR name="lastseen">USA</STR> <UINT32 name="mediaId">1</UINT32> <STR name="owner">PIERRE</STR> <UINT32 name="size">11</UINT32> </MAP> </MAP>
ma table est comme ça

Code : Tout sélectionner

create table donnees ( id bigserial not null primary key, event_id bigint not null references events(id), attribute_id integer not null references event_attribute_types(id), bool_value boolean null, integer_value integer null, double_value real null, timestamp_value timestamp without time zone null, text_value text null );
je voudrrais pouvoir inserer les données dans la table selon leur type c'est a dire le type timestamp du fichier xml dans timestamp_value etc etc

j'ai fait comme ça mais sans succès
public function SaveAttributeValue($eventId,$attributid)
   {
   		$connect = $this->OpenPgsqlConnect();
		$xmlParsed = $this->LoadXml("file.xml");
		foreach($xmlParsed as $val)
		{
			$tabSTR = array(); 
			$tabTIMESTP = array();
			$tabINT = array();
			foreach($val->STR as $valeur)
			{
				$tabSTR[] = strval($valeur);
			}
			foreach($val->TIMESTAMP as $valeur)
			{
				$tabTIMESTP[] = strval($valeur);
			}
			foreach($val->UINT32 as $valeur)
			{
				$tabINT[] = strval($valeur);
			}
		}
		
	    $sql = "INSERT INTO event_attributes (event_id,attribute_id,bool_value,integer_value,double_value,timestamp_value,text_value) VALUES(?,?,?,?,?,?,?)";
		$stmt = $connect->prepared($sql);
		for($i=0;$i<count($tabINT);$i++) 
		{
             for($j=0;$j<count($tabTIMESTP);$j++)
             {
				for ($k=0;$k<count($tabSTR);$k++)
				{
	             	try 
					{
						$connect->beginTransaction();
						//Insert the data in the strings table
						$stmt->execute(array($eventId,$attributid,NULL,$tabINT[$i],NULL,$tabTIMESTP[$j],$tabSTR[$k]));
						$connect->commit();
							      	
						//return the last insert id for each insertion
						$last = $connect->pgsqlLastInsertId($sql,$test);
				        $LastInsertIdEventType[]=$last;	
					} catch(PDOException $e) {
						$connect->rollback();
				        echo 'Erreur : '.$e->getMessage().'<br />';
				   		echo 'N° : '.$e->getCode();
					} 
				}	
             }	
	}	   
}
les paramètres seront renseignée lors de l'appel de cette methode dans une autre méthode de la classe
public function SaveXml()
	{
		$idEvent = $this->insertIntoEvent();
		$eventAttrExist = $this->EventAttributeTypeExists();
		if($eventAttrExist)
		{
			$idOfEventsAttributeType = $this->GetEventAttributeType();
			print "<pre>";
			print_r($idOfEventsAttributeType);
			print "</pre>";
		
		}else{
 
			$idOfEventAttributeTypeCreate = $this->CreateEventAttributeType();
			print "<pre>";
			print_r($idOfEventAttributeTypeCreate);
			print "</pre>";
		}
 
		for($i=0;$i<count($idEvent);$i++)
	    {
	   		for($j=0;$j<count($idOfEventAttributeTypeCreate);$j++)
	   		{
	   			$this->SaveAttributeValue($idEvent[$i],$idOfEventAttributeTypeCreate[$j]);
	   		}
	    }
} 
 
Donc pour chaque insertion les autres champs pourront avoir un valeur NULL
par exemple pour le timestamp value si j'insère la date_upload du fichier xml
les autres champs seront null sauf les deux clé étrangère.

Pour la clé étrangère attribute_id j'ai du mal à faire correspondre à chaque ligne car $idOfEventAttributeTypeCreate me retourne l'id correspondant à chaque donnée du fichier xml enregistré dans une autre table : par exemple ces données sont dateupload, filename , etc du fichier xml

si vous pouvez m' eclaircire un peu sur ce probleme, je galère pendant pas mal de jour
merci