Interprétation des retour à la ligne

Eléphanteau du PHP | 16 Messages

26 févr. 2024, 15:01

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');
}

Mammouth du PHP | 1967 Messages

26 févr. 2024, 15:13

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
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 16 Messages

26 févr. 2024, 15:27

Je n'ai pas compris... éditer le fichier php ? l'éditer avec un notepad++ ?

Eléphanteau du PHP | 16 Messages

26 févr. 2024, 15:42

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.

Eléphanteau du PHP | 16 Messages

26 févr. 2024, 15:52

Quand j'édite mon fichier avec notepad++ je vois bien LF, le retour chariot...

Eléphanteau du PHP | 16 Messages

26 févr. 2024, 16:47

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 ?

Mammouth du PHP | 1967 Messages

26 févr. 2024, 16:54

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 ?
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 16 Messages

26 févr. 2024, 17:24

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.

Eléphanteau du PHP | 16 Messages

26 févr. 2024, 18:57

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 ?

Mammouth du PHP | 1967 Messages

26 févr. 2024, 22:22

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
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 16 Messages

27 févr. 2024, 09:04

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...

Mammouth du PHP | 1967 Messages

27 févr. 2024, 12:09

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
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Mammouth du PHP | 1967 Messages

27 févr. 2024, 14:52

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"
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 16 Messages

27 févr. 2024, 16:04

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.