Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/07/2011, 16h57   #1
Membre actif
 
Homme
Inscription : avril 2011
Messages : 426
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 426
Points : 171
Points : 171
Par défaut Optimisation de mon code utilisant simple xml

Bonjour,

Dans un de mes scripts, j'utilise simple XML afin de parser un fichier xml qui n'est autre qu'un fichier GPX (fichier d'un gps).

Dans cet xml, plusieurs données sont accessibles comme la longitude, la latitude, l'altitude, la date et l'heure du point gps)

Voilà comment je procède :

Code :
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
	// fonction qui convertit un objet php en tableau associatif
	function ToArray($data)
	{
	  if (is_object($data)) $data = get_object_vars($data);
	  return (is_array($data)) ? array_map(__FUNCTION__,$data) : $data;
	}
	$racine=$_SERVER['DOCUMENT_ROOT'];
 
	$xml = $racine.'/php/gpx/fichiers/'.$nom_gpx;
	$i = 0;
 
	// je convertis le GPX, format dérivé du XML, en objet php
	$obj = simplexml_load_file($xml);
	// je convertis l'objet php en tableau
	$array = ToArray($obj);
	// je crée un tableau vide qui contiendra tous mes points avec les attributs lat, lon, ele, time
	$my_pts = array();;
	//je démarre du noeud trkpt
	$array_pts = $array['trk']['trkseg']['trkpt'];
	//je parcours chaque élément du tableau array_pts
	foreach($array_pts as $keys => $values){
		/*
		$my_pt : tableau associatif provisoire	
		*/
		unset($my_pt);
		$my_pt['lon'] = $values['@attributes']['lon'];
		$my_pt['lat'] = $values['@attributes']['lat'];
		$my_pt['ele'] = $values['ele'];
		$my_pt['time'] = $values['time'];
		$my_pts[] = $my_pt;
		$i++;
	}
	echo'<pre>';
	print_r($my_pts);
	echo'</pre>'; 
 
 
	foreach($my_pts as $keys => $pt)
	{
		//retour de la date
		$date = strftime("%Y-%m-%d %H:%M:%S",strtotime($pt['time']));	
		$sql_insertion = $bdd->prepare('INSERT INTO pts_gpx (lon,lat,ele,date,id_balade)VALUES(:lon,:lat,:elevation,:date,:id_balade)');	
		$sql_insertion->execute(array(
						':lon' => $pt['lon'],
						':lat' => $pt['lat'],
						':elevation' => $pt['ele'],
						':date' => $date,
						':id_balade' => $id_balade
		));
	}
Exemple de fichier gpx :

Code :
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
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<gpx xmlns="http://www.topografix.com/GPX/1/1" creator="MapSource 6.15.4" version="1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
 
  <metadata>
    <link href="http://www.garmin.com">
      <text>Garmin International</text>
    </link>
    <time>2011-07-26T19:19:10Z</time>
    <bounds maxlat="47.0313850" maxlon="6.0319950" minlat="46.9651310" minlon="5.9490590"/>
  </metadata>
 
  <trk>
    <name>2011-07-24 51000</name>
    <extensions>
      <gpxx:TrackExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
        <gpxx:DisplayColor>White</gpxx:DisplayColor>
      </gpxx:TrackExtension>
    </extensions>
    <trkseg>
      <trkpt lat="47.0076490" lon="6.0294400">
        <ele>404.3700000</ele>
        <time>2011-07-24T08:24:35Z</time>
      </trkpt>
      <trkpt lat="47.0076670" lon="6.0294410">
        <ele>408.2200000</ele>
        <time>2011-07-24T08:25:02Z</time>
      </trkpt>
      <trkpt lat="47.0076640" lon="6.0294410">
        <ele>412.5400000</ele>
        <time>2011-07-24T08:25:03Z</time>
      </trkpt>
      <trkpt lat="47.0076630" lon="6.0294410">
        <ele>416.3900000</ele>
        <time>2011-07-24T08:25:04Z</time>
      </trkpt>

malheureusement ce process fait méchament ramer mon hébergeur et parfois le "parsage" n'est pas bon et ne semble pas récupérer les bonnes valeurs.

par avance merci pour votre aide.
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 17h09   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 119
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 119
Points : 8 468
Points : 8 468
ton toArray est inutile tu peux parcourir un object simplxml puisque c'est un Traversable, et tu accèdes au noeuds comme un objects, la première boucle est inutile aussi

en top optimisé ça donne juste :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$obj = simplexml_load_file($xml, 'SimpleXMLIterator');
 
$sql = $bdd->prepare("INSERT INTO pts_gpx (lon, lat, ele, date, id_balade) 
                     VALUES (:lon, :lat, :elevation, :date, $id_balade)");
 
foreach($obj->trk->trkseg->trkpt as $trkpt)
{        
    $data = array(
        'lon' => $trkpt['lon'],
        'lat' => $trkpt['lat'],
        'elevation' => $trkpt->ele,
        'date' => strftime("%Y-%m-%d %H:%M:%S", strtotime($trkpt->time))
    );
 
    $sql->execute($data);
}
n'oublie pas que les requêtes préparées se font hors boucle
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 18h12   #3
Membre actif
 
Homme
Inscription : avril 2011
Messages : 426
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 426
Points : 171
Points : 171
Bonjour,

Un grand merci pour cet enseignement

J'ai encore beaucoup à apprendre !

Pour autant, je ne comprend pas pourquoi mais parfois, le parsage se passe très bien et souvent, il y a des soucis.

Est-ce que cela peut venir des ressources serveurs ?
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 18h14   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 119
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 119
Points : 8 468
Points : 8 468
Citation:
Envoyé par heretik25 Voir le message
Pour autant, je ne comprend pas pourquoi mais parfois, le parsage se passe très bien et souvent, il y a des soucis.

Est-ce que cela peut venir des ressources serveurs ?
c'est possible, après ça dépend de beaucoup de chose,
le script est plus rapide ?

petite question $id_balade est bien global ?
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 18h18   #5
Membre actif
 
Homme
Inscription : avril 2011
Messages : 426
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 426
Points : 171
Points : 171
Le script est en effet bien plus rapide mais l'erreur persiste.

J'utilisais ce script depuis pas mal de temps sans souci c'est pour cela que je ne comprend pas d'où vient le problème.

Pour $id_balade, il s'agit d'une variable $_POST[''] lorsque c'est une mise à jour et d'une requête à la première insertion.
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 18h23   #6
Modérateur
 
Inscription : septembre 2010
Messages : 7 119
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 119
Points : 8 468
Points : 8 468
oki, n'oublie pas de faire plutôt
Code :
$id_balade = $bdd->quote($_POST['id_balade']);
pour vérifié c'est simple fait :
Code :
1
2
print_r($data);
//$sql->execute($data);
d'ailleurs quelle est l'erreur ?

j'espere que t'as bien activé la gestion des erreurs pour PDO aussi
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 18h27   #7
Membre actif
 
Homme
Inscription : avril 2011
Messages : 426
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 426
Points : 171
Points : 171
J'ai un peu de mal à comprendre d'où vient l'erreur mais ce qui est sûr c'est que par moment, le parsage se passe mal et échange ?, modifie ? les coordonnées latitude et longitude.

Ceci à pour effet par la suite de perturber mes calculs de la distance en 3D ou encore un export KML (google earth) à partir des données de MySQL.

Ce qui perturbe donc cette page :
http://partir-en-vtt.com/php/gpx/ope...=424&numdep=25

Lorsque je lance le traitement, je dirai qu'une fois sur quatre, le parsage se passe bien.

Pour les erreurs PDO, je gère bien les erreurs (j'ai suivi le tuto du zéro).
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 20h26   #8
Membre actif
 
Homme
Inscription : avril 2011
Messages : 426
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 426
Points : 171
Points : 171
J'ai essayé en local et le problème apparait aussi. C'est donc un problème dans mon code
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 20h34   #9
Modérateur
 
Inscription : septembre 2010
Messages : 7 119
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 119
Points : 8 468
Points : 8 468
Citation:
Envoyé par heretik25 Voir le message
J'ai essayé en local et le problème apparait aussi. C'est donc un problème dans mon code
t'as essaye comme j'ai dit avec les print_r ?
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 20h38   #10
Membre actif
 
Homme
Inscription : avril 2011
Messages : 426
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 426
Points : 171
Points : 171
afin de voir ce qu'il y à dans l'array ?

Le truc c'est qu'il y a des centaines de points alors pour savoir d'où le problème vient, c'est pas gagné.

Ce qui est étrange c'est que parfois ça marche et parfois ça marche pas.

Je viens de remarquer que dans la base MySQL, les données latitude et longitude n'ont pas autant de chiffre que dans le fichier GPX.

Exemple :

Base : 6.02944
Fichier GPX :6.0294400

DE plus, les données sont toujours tronquées 5 chiffres après la virgule

Exemple :

Base : 6.02944
Fichier GPX : 6.0294420

Les champs sont en float.
Est-ce que cela peut jouer ?


Le système, outre d'ajouter les données du GPX dans la base permet de géolocaliser des photographies grâce aux données EXIF et voici comment le système fonctionne (cf PJ)
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 21h47   #11
Modérateur
 
Inscription : septembre 2010
Messages : 7 119
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 119
Points : 8 468
Points : 8 468
faudrait essaye de faire des bind pour les float
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 08h28   #12
Membre actif
 
Homme
Inscription : avril 2011
Messages : 426
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 426
Points : 171
Points : 171
Bonjour,

Mais il n'existe pas de paramétre spécifique pour les float. j'ai lu que le PDO:ARAM_STR ferai l'affaire.
Est-ce vrai ?

Edit :

En faisant comme ça :

Code :
1
2
  'lon' => $sql->bindValue(':lon', $trkpt['lon'],PDO::PARAM_STR),
        'lat' => $sql->bindValue(':lat', $trkpt['lat'],PDO::PARAM_STR),
Toutes les valeurs passent à 1, une idée ?

merci
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2011, 09h02   #13
Membre actif
 
Homme
Inscription : avril 2011
Messages : 426
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 426
Points : 171
Points : 171
Bonjour,

Je me permet de faire remonter mon souci car j'ai besoin que cela fonctionne cette semaine.

par avance merci pour votre aide.

heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 20h13   #14
Membre actif
 
Homme
Inscription : avril 2011
Messages : 426
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 426
Points : 171
Points : 171
Bonsoir,

Je viens de me rendre compte que cela fonctionnait très bien lors de la mise à jour d'une balade mais pas dans le cas d'une création.

Est-ce que quelqu'un est près à analyser les pages en question ?

EDIT : Je pense avoir réussi.

Merci quand même !
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h24.


 
 
 
 
Partenaires

Hébergement Web