Page 1 sur 1

Interprétation des retour à la ligne

Posté : 26 févr. 2024, 15:01
par matthieudu57
Bonjour,

J'ai un soucis avec un script php que je n'ai pas développé et que je dois modifier. Le fichier généré est un fichier txt dans lequel il devrait y avoir des retours à la ligne... Sauf que lorsque j'édite mon fichier avec le bloc note de mon serveur 2016 cela ne fonctionne pas, il n'y a pas de sauts de ligne. J'ai essayé en mettant \n puis \r\n puis PHP_EOL mais rien n'y fait... ce que je ne comprends pas c'est lorsque je mets la partie avec les fwrite en commentaire ça me génère toujours le fichier...
<?php
 
//cas de la tâche planifiée
if (!empty($argv[1]) && $argv[1] === 'planif') {
    $url = 'passerelle_carburant';
    require_once dirname(__FILE__) . '/../../config.php';
    require_once dirname(__FILE__) . '/../../model/common/Utils.php';
    \Common\Utils::initAutoloader();
    try {
        $nameFile = date('Ymd_His') . '_export.txt';
        $pathLog = dirname(__FILE__) . '/../../log/' . $nameFile;
        if (file_exists($pathLog)) {
            unlink($pathLog);
        }
        $fileLog = fopen($pathLog, 'c+b');
        $cpyMan = new \Admin\Company\CompanyManager(new Common\DAO(DB_CONFIG));
        $tabCpy = $cpyMan->getAll();
        $expMan = new Report\ExportManager(new Common\DAO(DB_EPACK));
		foreach ($tabCpy as $cpy) {
            $dataRes = $expMan->getAll(['month' => date('m') - 1, 'year' => date('Y'), 'cpy' => $cpy]);
            fwrite($fileLog, 'Société : ' . $cpy->getName() . "\r\n");
            fwrite($fileLog, '- Consommation : ' . $dataRes['conso'] . "\r\n");
            fwrite($fileLog, '- Refacturation : ' . $dataRes['refact'] . "\r\n");
        }
        fclose($fileLog);
        $mail = new Common\Mail('Passerelle carburant - Export automatique', 'L\'export mensuel s\'est déroulé avec succès', DEST_MAIL, ['sigmail' => 'Service informatique']);
        $mail->addFile(['name' => $nameFile, 'tmp_name' => $pathLog, 'type' => 'application/txt', 'size' => filesize($pathLog)]);
        $mail->sendMail();
    } catch (\Admin\AdminException | Exception | Swift_SwiftException $exc) {
        fwrite($fileLog, 'Erreur lors de l\'export mensuel ' . $exc->getMessage());
        $mail = new Common\Mail('Passerelle carburant - Erreur', 'Une erreur est survenue lors de l\'export mensuel : ' . $exc->getMessage(), DEST_MAIL, ['sigmail' => 'Service informatique']);
        $mail->sendMail();
    }
} else {
    require_once(dirname(__FILE__) . '/../../view/template/header.php');
    if (empty($_SESSION['authentPasserelleCarburant']['authent']) && empty(filter_input(INPUT_GET, 'planif'))) {
        require(dirname(__FILE__) . '/../../view/template/noaccess.php');
    } else {
        try {
            $safePost = filter_input_array(INPUT_POST);
            $yearSel = empty($safePost['year']) ? date('Y') : $safePost['year'];
            $monthSel = empty($safePost['month']) ? date('m') - 1 : $safePost['month'];
            if (!empty($safePost)) {
                $cpy = unserialize(urldecode($safePost['cpy']));
                $expMan = new Report\ExportManager(new Common\DAO(DB_EPACK));
                $dataRes = $expMan->getAll(['month' => $monthSel, 'year' => $yearSel, 'cpy' => $cpy]);
            }
        } catch (Admin\AdminException $ex) {
            echo new \Common\Alert($ex->getMessage(), 'error');
        }
    }
    include (dirname(__FILE__) . '/../../view/export/v_export.php');
    include (dirname(__FILE__) . '/../../view/template/footer.php');
}

Re: Interprétation des retour à la ligne

Posté : 26 févr. 2024, 15:13
par Spols
C'est l'instruction FOPEN qui crée le fichier, c'e'st donc logique que commenté les fwrite crée quand même le fichier.

As tu essayé de téléchargé le fichier et de le lire avec un éditeur avancé comme notepad ++ qui te permettra de voir les caractère non imprimable comme \r et \n pour t'assurer qu'ils sont bien ajouter. Il est possible que le bloc note de ton serveur ne les affiche pas. si tu regarde le résultat directement dans un navigateur, regarde aussi le code source. si ils ne sont pas transformé en <br> tu ne verra pas les retour à la ligne

Re: Interprétation des retour à la ligne

Posté : 26 févr. 2024, 15:27
par matthieudu57
Je n'ai pas compris... éditer le fichier php ? l'éditer avec un notepad++ ?

Re: Interprétation des retour à la ligne

Posté : 26 févr. 2024, 15:42
par matthieudu57
Ce qui est bizarre c'est que si j'édite mon fichier d'export txt dans notepad++ le fichier est ok mais si je l'édite via le bloc-note du serveur il n'y a pas de saut de ligne.

Re: Interprétation des retour à la ligne

Posté : 26 févr. 2024, 15:52
par matthieudu57
Quand j'édite mon fichier avec notepad++ je vois bien LF, le retour chariot...

Re: Interprétation des retour à la ligne

Posté : 26 févr. 2024, 16:47
par matthieudu57
je précise qu'il m'indique dans notepad++ Unix LF alors que je suis sur un serveur Windows. Le fichier d'export qui fonctionne de l'ancienne appli est indiqué Windows CRLF. Est-il possible dans mon php de forcer Windows CRFL au lieu d'UNIX LF ?

Re: Interprétation des retour à la ligne

Posté : 26 févr. 2024, 16:54
par Spols
Apparement c'est le bloc note de ton serveur qui n'affiche pas correctement, peut tu le changer ?

As tu besoin de lui ? que dois faire ton fichier d'export au final ?

Re: Interprétation des retour à la ligne

Posté : 26 févr. 2024, 17:24
par matthieudu57
je n'ai pas besoin de lui non mais le soucis c'est que je dois faire un import dans une application qui attend CR LF à la fin de chaque ligne. Vu que je n'ai que LF il me met erreur de syntaxe.

Re: Interprétation des retour à la ligne

Posté : 26 févr. 2024, 18:57
par matthieudu57
J'ai l'impression que quoique je fasse comme modification rien n'est pris en compte... comment je pourrai faire un test bête pour s'assurer que mes modifications sont prises en compte ?

Re: Interprétation des retour à la ligne

Posté : 26 févr. 2024, 22:22
par Spols
repart d'un script vierge, utilise fopen et fwrite pour ajouter 2 lignes et vois si ca marche.

essaye aussi file_put_content pour tout injecter en une fois.

repart du plus simple et complexifie si ca marche

Re: Interprétation des retour à la ligne

Posté : 27 févr. 2024, 09:04
par matthieudu57
Désolé mais c'est un script que j'ai récupérer... je n'ai pas le niveau pour redévelopper un tel script...

Re: Interprétation des retour à la ligne

Posté : 27 févr. 2024, 12:09
par Spols
Sans aucune garantie, j'ai remplacé tes fopen et fwrite par une collect des info et utiliser les fonction file_get_contents et file_put_contents
<?php
 
//cas de la tâche planifiée
if (!empty($argv[1]) && $argv[1] === 'planif') {
    $url = 'passerelle_carburant';
    require_once dirname(__FILE__) . '/../../config.php';
    require_once dirname(__FILE__) . '/../../model/common/Utils.php';
    \Common\Utils::initAutoloader();
    try {
        $nameFile = date('Ymd_His') . '_export.txt';
        $pathLog = dirname(__FILE__) . '/../../log/' . $nameFile;
        if (file_exists($pathLog)) {
            unlink($pathLog);
        }
        //$fileLog = fopen($pathLog, 'c+b');
$contents = file_get_contents($pathLog);
        $cpyMan = new \Admin\Company\CompanyManager(new Common\DAO(DB_CONFIG));
        $tabCpy = $cpyMan->getAll();
        $expMan = new Report\ExportManager(new Common\DAO(DB_EPACK));
    foreach ($tabCpy as $cpy) {
            $dataRes = $expMan->getAll(['month' => date('m') - 1, 'year' => date('Y'), 'cpy' => $cpy]);
            //fwrite($fileLog, 'Société : ' . $cpy->getName() . "\r\n");
            //fwrite($fileLog, '- Consommation : ' . $dataRes['conso'] . "\r\n");
            //fwrite($fileLog, '- Refacturation : ' . $dataRes['refact'] . "\r\n");
           $contents .= 'Société : ' . $cpy->getName() . "\r\n";
           $contents .= '- Consommation : ' . $dataRes['conso'] . "\r\n";
           $contents .= '- Refacturation : ' . $dataRes['refact'] . "\r\n";
        }
        //fclose($fileLog);
       file_put_contents($pathLog, $contents);
        $mail = new Common\Mail('Passerelle carburant - Export automatique', 'L\'export mensuel s\'est déroulé avec succès', DEST_MAIL, ['sigmail' => 'Service informatique']);
        $mail->addFile(['name' => $nameFile, 'tmp_name' => $pathLog, 'type' => 'application/txt', 'size' => filesize($pathLog)]);
        $mail->sendMail();
    } catch (\Admin\AdminException | Exception | Swift_SwiftException $exc) {
        //fwrite($fileLog, 'Erreur lors de l\'export mensuel ' . $exc->getMessage());
       $contents .= 'Erreur lors de l\'export mensuel ' . $exc->getMessage() . "\r\n";
       file_put_contents($pathLog, $contents);
        $mail = new Common\Mail('Passerelle carburant - Erreur', 'Une erreur est survenue lors de l\'export mensuel : ' . $exc->getMessage(), DEST_MAIL, ['sigmail' => 'Service informatique']);
        $mail->sendMail();
    }
} else {
    require_once(dirname(__FILE__) . '/../../view/template/header.php');
    if (empty($_SESSION['authentPasserelleCarburant']['authent']) && empty(filter_input(INPUT_GET, 'planif'))) {
        require(dirname(__FILE__) . '/../../view/template/noaccess.php');
    } else {
        try {
            $safePost = filter_input_array(INPUT_POST);
            $yearSel = empty($safePost['year']) ? date('Y') : $safePost['year'];
            $monthSel = empty($safePost['month']) ? date('m') - 1 : $safePost['month'];
            if (!empty($safePost)) {
                $cpy = unserialize(urldecode($safePost['cpy']));
                $expMan = new Report\ExportManager(new Common\DAO(DB_EPACK));
                $dataRes = $expMan->getAll(['month' => $monthSel, 'year' => $yearSel, 'cpy' => $cpy]);
            }
        } catch (Admin\AdminException $ex) {
            echo new \Common\Alert($ex->getMessage(), 'error');
        }
    }
    include (dirname(__FILE__) . '/../../view/export/v_export.php');
    include (dirname(__FILE__) . '/../../view/template/footer.php');
}
Sinon Il faut te tourner vers le créateur du script ou une agence spécialisée

Re: Interprétation des retour à la ligne

Posté : 27 févr. 2024, 14:52
par Spols
Je viens de penser a quelque chose,

vu que tu ouvre ton fichier en mode c+, si il existe il n'est pas recréé. donc si il est dans un mauvais mode de retour à la ligne il le restera. Essaye de supprimer le fichier (ou le renommer) pour repartir d'un fichier neuf plutot que celui qui pourrait être "corrompu"

Re: Interprétation des retour à la ligne

Posté : 27 févr. 2024, 16:04
par matthieudu57
Je n'ai pas de contact avec la personne qui a fait le script... J'avais déjà créé un nouveau fichier ça n'avait rien changé. ton script non plus ne change rien... j'ai contourné le problème en faisant un script powershell et en le lançant à la fin de l'export. J'ai une autre demande mais je vais créer un autre post.