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 :

explode - problème de Offset [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 52
    Par défaut explode - problème de Offset
    Bonjour à tous,
    j'ai un souci avec la construction d'un tableau.
    Je lis un fichier LOG d'une antenne GPS. Il y a différentes trames NMEA, raison pour laquelle je fais le test (if($NMEA == '$GPGGA')).

    Voici une entrée du fichier que je souhaite lire:
    $GPGGA,141352.940,4613.41744,N,00721.67579,E,0,10,10.3,472.4,M,48.2,M,,*64

    Le code que j'utilise (ci-dessous), fonctionne, il me construit le tableau, MAIS que jusqu'au paramètre [6]. au dela, il me met comme erreur
    Undefined Offset
    Donc mon tableau affiche que 6 colonnes, et pas au dela ... quelqu'un a-t-il une solution?
    d'avance merci.

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    	<?php
    	if(file_exists($fichier))
      {
    	$fp = fopen($fichier, 'r'); // le fichier existe, on l'ouvre
      	while (!feof($fp))            // On parcours le fichier
        {
      	  $ligne = fgets($fp);         // On se déplace d'une ligne 
      	  $liste = explode(',', $ligne, 16);     // Champs séparés par ','
     
      	  $NMEA = htmlentities($liste[0]);   // Pour convertir les caractères en équivalent html
      	  $UTC = htmlentities($liste[1]);
      	  $Latitude = htmlentities($liste[2]);
      	  $XN = htmlentities($liste[3]);
      	  $Longitude = htmlentities($liste[4]);
      	  $XE = htmlentities($liste[5]);
      	  $TypePos = htmlentities($liste[6]);
      	  //$Sat = htmlentities($liste[7]);
      	  //$PH = htmlentities($liste[8]);
      	  //$Altitude = htmlentities($liste[9]);
      	  //$ZE = htmlentities($liste[10]);
      	  //$D01 = htmlentities($liste[11]);
      	  //$D02 = htmlentities($liste[12]);
      	  //$D03 = htmlentities($liste[13]);
      	  //$D04 = htmlentities($liste[14]);
     
    //  	  if(get_magic_quotes_gpc())
    //  	  {
      	    //$NMEA = stripslashes($NMEA);
            //$UTC = stripslashes($UTC);
    		//$Latitude = stripslashes($Latitude);
    		//$XN = stripslashes($XN);
    		//$Longitude = stripslashes($Longitude);
    		//$XE = stripslashes($XE);
    		//$TypePos = stripslashes($TypePos);
    		//$Sat = stripslashes($Sat);
    		//$PH = stripslashes($PH);
    		//$Altitude = stripslashes($Altitude);
    		//$ZE = stripslashes($ZE);
    		//$D01 = stripslashes($D01);
    		//$D02 = stripslashes($D02);
    		//$D03 = stripslashes($D03);
    		//$D04 = stripslashes($D04);
     
     // 	  }
      	  if($NMEA == '$GPGGA')
      	  {
        	  echo '<tr>'; 
        	  echo '<td>' . $NMEA . '</td>';
        	  echo '<td>' . $UTC . '</td>';
        	  echo '<td>' . $Latitude . " N".'</td>';
        	  //echo '<td>' . $XN . '</td>';
        	  echo '<td>' . $Longitude . " E".'</td>';
        	  //echo '<td>' . $XE . '</td>';
        	  echo '<td>' . $TypePos . '</td>';
        	  //echo '<td>' . $Sat . '</td>';
        	  //echo '<td>' . $PH . '</td>';
        	  //echo '<td>' . $Altitude . " m".'</td>';
        	  //echo '<td>' . $ZE . '</td>';
        	  //echo '<td>' . $D01 . '</td>';
        	  //echo '<td>' . $D02 . '</td>';
        	  //echo '<td>' . $D03 . '</td>';
        	  //echo '<td>' . $D04 . '</td>';
        	  echo '</tr>';
      	  }
      	} 
      	fclose($fp);
      }
    	else{ // le fichier n'existe pas
    	  echo '<p>Fichier introuvable ! Lecture stoppée.</p>';
    	}
    	?>

  2. #2
    Membre très actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 248
    Par défaut
    Je viens de faire le test suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $test = '$GPGGA,141352.940,4613.41744,N,00721.67579,E,0,10,10.3,472.4,M,48.2,M,,*64';
    $liste = explode(',', $test, 16); 
    echo '<pre>';
    var_dump($liste);
    et j'obtiens bien :
    array(15) {
    [0]=>
    string(6) "$GPGGA"
    [1]=>
    string(10) "141352.940"
    [2]=>
    string(10) "4613.41744"
    [3]=>
    string(1) "N"
    [4]=>
    string(11) "00721.67579"
    [5]=>
    string(1) "E"
    [6]=>
    string(1) "0"
    [7]=>
    string(2) "10"
    [8]=>
    string(4) "10.3"
    [9]=>
    string(5) "472.4"
    [10]=>
    string(1) "M"
    [11]=>
    string(4) "48.2"
    [12]=>
    string(1) "M"
    [13]=>
    string(0) ""
    [14]=>
    string(3) "*64"
    }

    Il faudrait peut être vérifier que l'entrée soit correcte avant son découpage avec explode

  3. #3
    Membre confirmé Avatar de hiul dragonfel
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 199
    Par défaut
    tu as fait un echo de ta ligne avant l'explode pour voir ?

    des fois que certaines soient corrompus.


    PS: je suis toujours aussi lent

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Par défaut
    Bonjour,

    Plutôt que d'utiliser "fgets()" et "explode()", utilise "fgetcsv()" qui est fait pour ça :
    http://fr.php.net/manual/fr/function.fgetcsv.php

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 52
    Par défaut
    Bonjour,
    merci pour votre aide.
    l'echo donne tous les records du fichier, donc la variable est bien initialisée.

    Au fait, je suis obligé de passer par un tableau pour pouvoir recuperer ces données et les insérer dans un DB SQL, non ?

    merci pour votre aide, suis pommé!

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Par défaut
    Si tu veux importer le contenu du fichier dans une table, va voir là :
    http://dev.mysql.com/doc/refman/5.0/fr/load-data.html

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 45
    Par défaut
    Citation Envoyé par skippy86 Voir le message
    Bonjour,
    merci pour votre aide.
    l'echo donne tous les records du fichier, donc la variable est bien initialisée.

    Au fait, je suis obligé de passer par un tableau pour pouvoir recuperer ces données et les insérer dans un DB SQL, non ?

    merci pour votre aide, suis pommé!
    Salut,

    Si ton but est de mettre le fichier en base de données tu peux sans doute le faire directement dans la requête, sans traitement PHP préalable (dépend du SGDB, pour mysql par exemple : LOAD DATA INFILE)


    Tu en es où au final ? Ca fonctionne ?


    Cordialement,


    Kohntark-

    EDIT : Grilled by Jeca

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 52
    Par défaut
    en fait, c'est compliqué.
    c'est à dire, que je souhaite:
    1) afficher la coordonnée existante dans la DB avec le nom de l'arrêt de bus
    2) afficher la coordonnée lue dans le LOG
    3) si je constate que la coordonnée qui était déjà stockée est complètement fausse, par un bouton, je répertorie le string qui a été lu depuis le fichier LOG

    donc point 1 sans souci, par contre le point 2 j'arrive pas à l'afficher dans un tableau comme il faut, et je sais pas comment faire pour le répertorier par la suite du coup.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 45
    Par défaut
    Je ne vois pas vraiment pourquoi ça planterait ...

    Qu'est ce que ça dit si tu fais ça :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if(file_exists($fichier)) {
        $fp = fopen($fichier, 'r'); // le fichier existe, on l'ouvre
        while (!feof($fp)) {
            $ligne = explode(',', fgets($fp));
            echo '<pre>';
            print_r($ligne);
            echo '</pre>';
        }
    }

    Peux tu copié / collé les premières lignes du fichier ?


    Cordialement,

    Kohntark-

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 52
    Par défaut
    salut Kohntark,

    si j'utilise ton code, j'obtiens le string :
    [0] => $GPGGA
    ....
    [14] => *64


    donc ça fonctionne. comment puisje récupérer que le [1] [2] [4] [9] dans des champs que je pourrais ensuite poster dans une DB ?

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 45
    Par défaut
    Citation Envoyé par skippy86 Voir le message
    comment puisje récupérer que le [1] [2] [4] [9] dans des champs que je pourrais ensuite poster dans une DB ?
    Heu, bah en fait il n'y a rien qui diffère de ton script de départ. Le résultat passe toujours par explode(), donc tu as un tableau.

    INSERT INTO machin VALUES ($ligne[1], $ligne[2], $ligne[4], $ligne[9])

    ... je ne vois pas trop où tu bloques là.

    Par contre vu les problèmes que tu évoquais initialement, et pour lesquels nous ne connaissons toujours pas la cause, tu gagnerai à ajouter des contrôles (est ce que la ligne à le bon format, la longueur du tableau est correcte, ..)



    Cordialement,


    Kohntark-

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 52
    Par défaut
    ok merci beaucoup.

    dernière question, il y a 2 choses que j'aimerais encore intégrer, mais je ne sais pas trop comment dans la boucle que tu as écrite.
    1) trier, comme il y a plusieurs types de couches, ne prendre que celles dont [0] => $GPGGA

    2) Puis n'afficher que le dernier record, soit la dernière trame GPS répertoriée

    tu sais m'indiquer comment m'y prendre ?
    merci

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 45
    Par défaut
    Citation Envoyé par skippy86 Voir le message
    ok merci beaucoup.

    dernière question, il y a 2 choses que j'aimerais encore intégrer, mais je ne sais pas trop comment dans la boucle que tu as écrite.
    1) trier, comme il y a plusieurs types de couches, ne prendre que celles dont [0] => $GPGGA

    2) Puis n'afficher que le dernier record, soit la dernière trame GPS répertoriée

    tu sais m'indiquer comment m'y prendre ?
    merci
    1) Je me répète, il n'y a pas de changement comparé à ce que tu as fait au départ !!
    ... et ton if($NMEA == '$GPGGA') { ... fait ça très bien


    2) $ligne contiendra la ligne en cours pendant le while, et donc la dernière ligne du fichier après la fin du while. Il te suffit donc d'afficher $ligne juste après le while ($ligne est un tableau, il te faudra passer par un foreach, implode(), ...)


    Cordialement,


    Kohntark-

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 52
    Par défaut
    Hep,

    alors j'ai modifié le code et j'obtiens que les couches souhaitées:
    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
     
    <?php
    $fichier = 'Log 2010-05-24 100903.nmea';
      	  if(file_exists($fichier)) 
      	  	{
        		$fp = fopen($fichier, 'r'); // le fichier existe, on l'ouvre
     
        			while (!feof($fp))
        				{
            			$ligne = explode(',', fgets($fp));	
        				foreach ($ligne as $tab)
        						if($tab == '$GPGGA')
        						{
     
            				echo '<pre>';
            				print_r($ligne);
            				echo '</pre>';
        					}	
        				}
    		}
     
    	?>
    Lecture fichier LOG -- GPS
    Array
    (
    [0] => $GPGGA
    [1] => 141352.940
    [2] => 4613.41744
    [3] => N
    [4] => 00721.67579
    [5] => E
    [6] => 0
    [7] => 10
    [8] => 10.3
    [9] => 472.4
    [10] => M
    [11] => 48.2
    [12] => M
    [13] =>
    [14] => *64
    )
    Maintenant, dernière question, comment puis-je n'obtenir que le dernier record?
    je ne vois pas ce que tu entends par afficher en dehors du while ?
    d'avance merci

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 45
    Par défaut
    Ton code est erroné.

    ... et je pense qu'il serait bien que tu précises exactement ce que tu attends; tu parles de n'afficher que le dernier enregistrement hors tu les affiches tous dans le while (??)

    Parce que s'il ne s'agit que d'afficher la dernière trame valide du fichier, tu n'as pas besoin de te prendre la tête à le parcourir.

    Un truc comme ça par exemple :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $sCont = file_get_contents($fichier);
    $iLast = substr($sCont, strrpos($sCont, '$GPGGA'));
    $aLastRecord = explode(',', substr($iLast, 0, strpos($iLast, chr(10))));
     
    /*
    $aLastRecord est un tableau contenant la dernière ligne GPGGA
    */
     
    // pour l'afficher "basiquement"
    echo '<pre>';
    print_r($aLastRecord);
    echo '</pre>';

    N'hésites pas à re préciser car ça ne me semble pas très clair


    Cordialement,


    Kohntark-

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 52
    Par défaut
    Salut Kohntark,

    c'est en effet le dernier record que je souhaite avoir. Par contre je ne comprends pas bien ton substr.

    j'obtiens ceci comme résultat:
    $GPGGA,141352.940,4613.41744,N,00721.67579,E,0,10,10.3,472.4,M,48.2,M,,*64
    donc ça fonctionne, merci

    dernière question:
    comment puis-je afficher différemment que en ligne, genre en colonne, et n'afficher que certains éléments du string? car avec un print_r il sort comme en [ quote ] ci dessus

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 45
    Par défaut
    OK, je tente avec quelques commentaires, pour le reste il y a la doc qui est très bien faites pour ces fonctions.

    Code php : 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
    //récupération du contenu du fichier
    $sCont = file_get_contents($fichier);
     
    /*
    récupération depuis la dernière occurrence de '$GPGGA' jusqu'à la fin du fichier
     
    strrpos($sCont, '$GPGGA') : trouve la position de la dernière occurrence de '$GPGGA' dans le fichier texte
     
    substr : récupère la partie du fichier qui va de la position précédente à la fin du fichier
    */
    $iLast = substr($sCont, strrpos($sCont, '$GPGGA'));
     
    /*
    strpos($iLast, chr(10)) : dans la string récupérée ci-avant, cherche la première position d'un retour à la ligne (LF)
     
    substr : récupère la partie de string qui va du début jusqu'à la position ci-dessus, en l'occurrence la ligne contenant la dernière trame recherchée du fichier
     
    explode : transforme cette chaîne en tableau en utilisant ','
    */
    $aLastRecord = explode(',', substr($iLast, 0, strpos($iLast, chr(10))));



    comment puis-je afficher différemment que en ligne, genre en colonne, et n'afficher que certains éléments du string? car avec un print_r il sort comme en [ quote ] ci dessus
    Je te le redis, $aLastRecord est un simple tableau, je ne vais pas t'expliquer ce qu'est un tableau hein.

    un ex :
    echo '
    <table>
    <tr>
    <td>'.$aLastRecord[0]</td>
    <td>'.$aLastRecord[1]</td>
    <td>'.$aLastRecord[2]</td>
    </tr>
    </table>';


    Cordialement,


    Kohntark-

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2007
    Messages : 52
    Par défaut
    c'est tout bon.
    merci pour votre aide précieuse.
    salutations
    skippy86

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

Discussions similaires

  1. [PHP 4] Problème Undefined offset
    Par TWEESTY dans le forum Langage
    Réponses: 6
    Dernier message: 01/02/2011, 00h09
  2. [Fonction Explode] Problème
    Par Xenon03 dans le forum Langage
    Réponses: 5
    Dernier message: 21/09/2009, 09h29
  3. Petit Problème addition offset
    Par SniP_78 dans le forum VB.NET
    Réponses: 4
    Dernier message: 07/04/2009, 20h46
  4. [MySQL] Problème Undefined Offset liste déroulante
    Par Luisito31 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 31/10/2008, 09h26
  5. [VBA-E] Problème d'offset cellule
    Par GI_GI dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/01/2007, 10h47

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