Partage
  • Partager sur Facebook
  • Partager sur Twitter

fputcsv() écrase tout mon fichier csv

Sujet résolu
    15 août 2018 à 23:11:24

    Bonsoir

    J'essaye désespérément de faire en sorte que ce code m'écrive la date (plus un entier 1 qui n'est juste là que pour les test) tout en haut de mon fichier csv mais rien à faire, le fputcsv() m'écrase tout le fichier à chaque fois :( Quelqu'un sait ce qui cloche ? 

    <?php
    
    $date = date('Y-m-d');
    
    $dbFile = fopen("db.csv", "r+");
    
    rewind($dbFile);
    fputcsv($dbFile, array($date, 1), ',');
    
    fclose($dbFile);
    
    ?>



    • Partager sur Facebook
    • Partager sur Twitter
      15 août 2018 à 23:35:32

      Hello,

      Ne serait-ce pas ton utilisation de fopen ? En effet, avec le paramètre 'r+' tu ouvres en lecture et écriture, et place le pointeur de fichier au début du fichier. Or la fonction fputcsv va écrire là où se trouve le pointeur... donc par-dessus ce qui existe déjà ?

      As-tu fais un essai avec fopen ayant le paramètre a+ ?

      • Partager sur Facebook
      • Partager sur Twitter
      Nicolas - Développeur PHP qui bricole pas mal, utilisant Bootstrap, Materialize, MySQL et quelques astuces piochées par ci par là. Codeigniter a changé ma vie de codeur :D
        15 août 2018 à 23:38:59

        Oui le soucis de a+ c'est que malgré mon rewind() la date s'écrit à la fin de mon fichier et non au début :/
        • Partager sur Facebook
        • Partager sur Twitter
          16 août 2018 à 0:05:27

          Alors première chose, regarde la documentation de rewind qui te donne un avertissement important dans ton cas : http://php.net/manual/fr/function.rewind.php

          Note:
          
          Si vous avez ouvert le fichier en mode d'ajout ("a" ou "a+"), toutes les données que vous écrirez dans ce fichier seront toujours ajoutées, sans se soucier de la position du pointeur de fichier.
          

          Est-ce que tu as essayé d'utiliser fopen avec la directive c ou c+ ? (c'est assez "nouveau", depuis PHP 5.3)

          Dans tous les cas écrire au début (sans réécrire pardessus) n'est pas quelque chose de très "courant" et de très "naturel"... ce qui exige l'emploi de quelques astuces. Beaucoup ont eu le même souci avant toi : https://stackoverflow.com/questions/1760525/need-to-write-at-beginning-of-file-with-php et tout le monde n'adopte pas la même solution (la plus crade étant d'ouvrir tout le contenu, d'ajouter l'élément avant ce contenu par concaténation, puis tout réécrire dans le fichier... mais il y en a d'autres plus élégantes en faisant appel aux flux).

          PS : pourquoi tu veux impérativement écrire au début ? ...

          -
          Edité par Nicolas B 16 août 2018 à 0:06:39

          • Partager sur Facebook
          • Partager sur Twitter
          Nicolas - Développeur PHP qui bricole pas mal, utilisant Bootstrap, Materialize, MySQL et quelques astuces piochées par ci par là. Codeigniter a changé ma vie de codeur :D
            16 août 2018 à 0:14:54

            Alors le but était de faire un suivit du nombre de visiteur sur un site par jour en utilisant csv (c'est une solution très crade je sais, mais sans bdd je trouvais que ça restait la moins pire des solutions). Pour un soucis de compréhension je trouvais plus judicieux d'ajouter les nouvelles statistiques en haut du fichier.

            Malheureusement c+ m'écrase la 1ere ligne pour écrire ensuite la nouvelle :( et oui la technique de la concaténation marche mais bon, je n'ai pas les mots pour évoquer ce que je ressens en y pensant XD

            • Partager sur Facebook
            • Partager sur Twitter
              16 août 2018 à 0:25:23

              De mon point de vue ça n'a rien de logique de vouloir ajouter les nouvelles données au dessus, pour au moins 3 raisons :

              • C'est beaucoup plus difficile techniquement (plus compliqué, plus bricolage, ...) donc plus sujet aux problèmes
              • Tout bon fichier CSV de données commence par des entêtes de colonnes... ajouter ligne 1 signifie que tu n'as pas ça
              • Il faut faire une différence entre l'outil (stocker une donnée sous forme fichier texte) et l'usage (afficher les 10 dernières lignes)

              A toi de coder l'accès au fichier correspondant à tes besoins (y compris charger le fichier pour une consultation "à l'envers" en commençant par la fin)... à ne pas confondre avec le contenu lui-même du fichier.

              En programmation on a tendance à toujours donner qu'une seule responsabilité à un élément. Ton fichier texte n'a pas pour responsabilité de "présenter de manière lisible pour un humain". Il a la responsabilité de "stocker du texte de manière durable".

              A toi de construire la fonction qui va bien pour "exploiter" ces données "brutes", que ce soit en générant un affichage particulier ou bien en générant dans le navigateur un fichier "interprétable" et "téléchargeable" propre, qu'Excel saura très bien lire (par exemple).

              Ce n'est que mon point de vue...

              (et j'ajoute que si ton fichier journal est accessible depuis le web, tu ne peux pas le protéger ce qui est un problème s'il contient des données personnelles comme des identifiants de navigateur ou des adresses IP... Si tu le fais lire par PHP et présenter selon tes désirs, tu peux le rendre indisponible aux accès lecture directs, et conditionner la lecture des infos au fait que c'est un admin qui s'est connecté à ton espace membre, ou un truc comme ça)

              -
              Edité par Nicolas B 16 août 2018 à 0:27:35

              • Partager sur Facebook
              • Partager sur Twitter
              Nicolas - Développeur PHP qui bricole pas mal, utilisant Bootstrap, Materialize, MySQL et quelques astuces piochées par ci par là. Codeigniter a changé ma vie de codeur :D

              fputcsv() écrase tout mon fichier csv

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown