IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Optimisation de mon code utilisant simple xml [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    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 ?

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    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 ?

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    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.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    oki, n'oublie pas de faire plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $id_balade = $bdd->quote($_POST['id_balade']);
    pour vérifié c'est simple fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    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).

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    J'ai essayé en local et le problème apparait aussi. C'est donc un problème dans mon code

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    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 ?

  10. #10
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    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)

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    faudrait essaye de faire des bind pour les float

  12. #12
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  13. #13
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    Bonjour,

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

    par avance merci pour votre aide.


  14. #14
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    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 !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/05/2011, 16h23
  2. Optimisation de mon code
    Par ordner dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 06/03/2009, 16h19
  3. Optimisation de mon code ActionScript
    Par amnesias dans le forum Flash
    Réponses: 9
    Dernier message: 01/04/2007, 22h04
  4. Projet VB v6 : utilisation de requête SQL dans mon code
    Par MITCH31 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 27/10/2005, 15h02
  5. Optimiser mon code ASP/HTML
    Par ahage4x4 dans le forum ASP
    Réponses: 7
    Dernier message: 30/05/2005, 10h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo