s'assurer en PHP que le fichier soit bien écrit avant de le reouvrir

imperium33
Invité n'ayant pas de compte PHPfrance

19 mai 2015, 16:55

Bonjour à tous,

je développe un code PHP qui s'exécute sur mon serveur WAMP en local.

Ce code doit écrire dans un fichier bdd.csv les données lues (fopen)

mon PROBLEME c'est que quand j'écris (fputs) mes données dans le fichier et les relis (relecture) ensuite du fichier, j'ai l'impression qu'il n'a pas eu le temps d'écrire la ligne précédente…
Quand je relis le fichier, il ne me retrouve pas la ligne précédente.
Ensuite, quand j'ouvre le fichier bdd.csv sous librecalc (manuellement), toutes mes lignes sont là, dans l'ordre…

Est-ce qu'il est possible de s'assurer en PHP que le fichier soit bien écrit avant que le script ne réouvre en lecture ce même fichier ?

Car c'est comme si il n'avait pas eu le temps d'écrire la ligne avant que je la relise !!!

Est-ce un problème serveur, genre multiprocessus ?

Merci pour vos éclaircissements :-)

Mammouth du PHP | 688 Messages

19 mai 2015, 17:14

si c'est le même script qui écrit puis lit, que le flux est bien fermé après l'écriture, c'est la façon de lire qu'il faut vérifier car le code peut être incorrect.

Invité
Invité n'ayant pas de compte PHPfrance

19 mai 2015, 17:37

Bonjour et merci de votre intéret :)

c'est bien le même script qui lit mais pas les même fonctions.

function ecrire_fichier($nom_fichier, $chaine_a_ecrire, $fin_de_ligne)
{
// Ouverture fichier en lecture et ecriture
$fp = fopen ($nom_fichier, "a+");

// on écrit
if ($fin_de_ligne == true)
{
fputs ($fp, '|'.$chaine_a_ecrire."\n");
}
else
{
fputs ($fp, '|'.$chaine_a_ecrire);
}

// on ferme le fichier
fclose ($fp);
/*$ptr_fich = fopen($nom_fichier, "r");

if (FALSE === $ptr_fich)
{
exit("<br> <br>erreur lors de l'ouverture du fichier !!!!<br>");
}

$contenu = fread($ptr_fich, filesize($nom_fichier));

echo ("<br><br>ecrire_fichier contenu VERIFIE: ").$contenu;
fclose($ptr_fich);*/
}


//ecrire chaine_a_ecrire dans une colonne du fichier bdd.csv
function ecrire_fichier_colonne($nom_fichier, $chaine_a_ecrire, $NoColonne, $fin_de_ligne)
{
//lire la dernière ligne
$ptr_new = fopen($nom_fichier, "r");

if (FALSE === $ptr_new)
{
exit("<br> <br>erreur lors de l'ouverture du fichier !!!!<br>");
}

$contenu = fread($ptr_new, filesize($nom_fichier));

echo ("<br><br>ecrire_fichier_colonne contenu: ").$contenu;

$nb_ligne_fichier = substr_count($contenu, "\n");
//echo ("<br><br><br>ecrire_fichier_colonne nb_ligne_fichier: ").$nb_ligne_fichier;
/* On a plus besoin du pointeur */
fclose($ptr_new);

$contenu = explode("\n", $contenu); /* PHP_EOL contient le saut à la ligne utilisé sur le serveur (\n linux, \r\n windows ou \r Macintosh */

echo ("<br><br>ecrire_fichier_colonne AVANT contenu[0]: ").$contenu[0];
//echo ("<br><br>ecrire_fichier_colonne AVANT contenu[1]: ").$contenu[1];
//echo ("<br><br>ecrire_fichier_colonne AVANT contenu[2]: ").$contenu[2];

//*********affecter à contenu la ligne i séparée par le caractère '\n'
$chaine_etudiee = $contenu[0];

$position_slash_n = false;
$position_slash_n = strpos($chaine_etudiee,"\n");
$j=0;
$der_ligne = $contenu[0];
while($position_slash_n != false)
{
$contenu[$j] = substr($chaine_etudiee,0,$position_slash_n);

if($contenu[$j] != "")
{
$der_ligne = $contenu[$j];
echo "der_ligne: $j ".$der_ligne;
}

//str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )
//suppression '\n'
$chaine_etudiee = substr($chaine_etudiee,$position_slash_n+2);
//echo "<br><br><br>contenu[".$j."] ".$contenu[$j];
//echo "<br><br>j: chaine etudiee: ".$j.$chaine_etudiee;

$position_slash_n = strpos($chaine_etudiee,"\n");
echo "<br>position slash n: ".$position_slash_n;
if ($position_slash_n == false)
{ echo "<br>dedans !!";
$contenu[$j+1] = substr($chaine_etudiee,0,strlen($chaine_etudiee));

if($contenu[$j+1] != "")
{echo "<br>dedans ENCORE !!";
$der_ligne = $contenu[$j+1];
}
break;
}

$j++;
}
//***********

echo "<br><br> ecrire_fichier_colonne derniere ligne du fichier lue: ".$der_ligne."<br>j: ".$j;

//supprimer la dernière ligne
//unset($tab[count($tab)-1]);
//supprimer_ligne_fichier($nom_fichier);

if (strpos($der_ligne, "\n") != false)
$der_ligne = substr($der_ligne, 0, strpos($der_ligne, "\n"));

//echo "<br>ecrire_fichier_colonne der_ligne retour chariot supprimee en fin de ligne: ".$der_ligne;

//recréer la ligne à partir de la lecture de l'ancienne
//1) on complète la ligne de "|x"
for ($i = 0; $i <= 20; $i++)
{
$der_ligne = $der_ligne."|x";
}
//$der_ligne = $der_ligne."\n";
//2) on se positionne à la bonne colonne
$der_ligne_copy = $der_ligne;
echo "<br> ecrire_fichier_colonne der ligne copy: ".$der_ligne_copy;

$nb_pipe = 0;
if(substr($der_ligne_copy, 0, 1) != chr(124))
$NoColonne = $NoColonne - 1;

$position_pipe = false;
$position_pipe_precedent = 0;
$taille_du_mot = 0;
while($nb_pipe < $NoColonne)
{
$position_pipe = strpos ( $der_ligne_copy , chr(124));

//echo "<br> ecrire_fichier_colonne position pipe: ".$position_pipe."<br>";



if(($position_pipe != false) OR (substr($der_ligne_copy, 0, 1) == chr(124)))
{
//on retire la pipe de $der_ligne_copy
$debut_chaine_retour = substr($der_ligne_copy, 0, $position_pipe);
//echo "<br> ecrire_fichier_colonne debut_chaine_retour pipe: ".$debut_chaine_retour."<br>";

$taille_chaine = strlen($der_ligne_copy);
$fin_chaine_retour = substr($der_ligne_copy, $position_pipe +1, $taille_chaine);
//echo "<br>ecrire_fichier_colonne fin_chaine_retour pipe: ".$fin_chaine_retour."<br><br>nb_pipe: ".$nb_pipe."<br>";

$der_ligne_copy = $debut_chaine_retour.$fin_chaine_retour;
//echo "<br>ecrire_fichier_colonne der ligne copy: ".$der_ligne_copy;

$taille_du_mot = strpos ( $der_ligne_copy , chr(124)) - $position_pipe;

$position_pipe_precedent = $position_pipe;
//echo "<br>ecrire_fichier_colonne taille_du_mot ".$taille_du_mot;

$nb_pipe++;
}
if(($position_pipe == false) AND ($nb_pipe >= 2))
break;
}
//echo "<br>*************<br><br>ecrire_fichier_colonne der_ligne: ".$der_ligne."<br>";
//echo "<br>ecrire_fichier_colonne taille du mot ".$taille_du_mot."<br>";
//echo "<br>ecrire_fichier_colonne nb_pipe ".$nb_pipe."<br>";

//inserer $chaine_a_ecrire dans la colonne
$debut_chaine_retour = substr($der_ligne, 0, $position_pipe+$nb_pipe);
//echo "<br>ecrire_fichier_colonne debut_chaine_retour pipe FINAL: ".$debut_chaine_retour."<br>";

$taille_chaine = strlen($der_ligne_copy);
$fin_chaine_retour = substr($der_ligne, $position_pipe +$nb_pipe+$taille_du_mot, $taille_chaine);
//echo "<br>ecrire_fichier_colonne fin_chaine_retour pipe FINAL: ".$fin_chaine_retour;

$der_ligne = $debut_chaine_retour.$chaine_a_ecrire.$fin_chaine_retour;
echo "<br><br>*******ecrire_fichier_colonne der ligne copy: ".$der_ligne."<BR>*********************<BR><BR><BR>";
if (substr($der_ligne, 0, 1) == chr(124))
{

$der_ligne = substr($der_ligne, 1, strlen($der_ligne));
}

// on écrit
ecrire_fichier($nom_fichier, $der_ligne, true);
}

Merci de vous occuper de moi

immperium33
Invité n'ayant pas de compte PHPfrance

19 mai 2015, 18:59

j'ai remplacer

$contenu = fread($ptr_new, filesize($nom_fichier));
par
$contenu = file_get_contents($nom_fichier); // on récupère le contenu du fichier

et ça fonctionne !

il me lit le fichier entier et pas seulement la première ligne jusqu'à "\n"

merci

Sujet RESOLU !!!!