【问题标题】:fputcsv doesn't work with a specific filefputcsv 不适用于特定文件
【发布时间】:2017-10-12 11:21:44
【问题描述】:

我有一个 PHP 函数,可以将行写入 3 个不同的 CSV 文件:

    if ($fonction == 1)
    {
        $handle = fopen("service_trames_acces.csv", "a");
        $ligne = array($fonction,$groupe,$zone,$no_lecteur,$no_carte, date("d/m/Y"),$date_courante2,$chrono[$no_chrono]['NO_CHRONO'],$cod_typ_acces,$statut,$codeErreur,0);
        fputcsv($handle,$ligne);
        fclose($handle);
    }

    if($fonction == 2)
    {

        $handle = fopen("service_trames_monet.csv", "a");
        $ligne = array($fonction,$groupe,$zone,$no_lecteur,$no_carte,date("d/m/Y"),$date_courante2,$chrono[$no_chrono]['NO_CHRONO'],$cod_typ_monet,$statut,1,$val_nbu_auto,$val_nbu_prec,$codeErreur,0);
        fputcsv($handle,$ligne);
        fclose($handle);
    }
    if($fonction == 3)
    {

        $handle = fopen("service_trames_badg.csv", "a");
        $ligne = array($fonction,$groupe,$zone,$no_lecteur,$no_carte,date("d/m/Y"),$date_courante2,$chrono[$no_chrono]['NO_CHRONO'],self::$entree_sortie,$statut,$codeErreur,0,0);
        fputcsv($handle,$ligne);
        fclose($handle);
    }

第三个如果从不写入文件。

  • fopen 返回一个资源 ID
  • fputcsv 返回写入行的长度

但是文件总是空的。我在生产服务器上没有这个问题,只有在测试中,如果我使用任何其他文件名,它就可以工作。

感谢您的帮助:)

【问题讨论】:

  • 你有写文件的权限吗?
  • 测试这个例子php.net/manual/es/… 但是你的文件..
  • var_dump($ligne) ¿?

标签: php csv fopen fputcsv fclose


【解决方案1】:

下面的评论片段可能会有所帮助。确保您对要写入的文件以及包含文件夹具有“写入权限”是非常必要的。下面的代码段确保您拥有此权限,但仅限于文件级别。它使用chmod() 来实现该目的。对于包含文件的目录,由您决定如何有效地完成它。

<?php 


    // CREATE AN ARRAY TO MAP $fonction TO SPECIFIC FILES
    $loadableFiles  = [
        1   => "service_trames_acces.csv",
        2   => "service_trames_monet.csv",
        3   => "service_trames_badg.csv",
    ];

    // OPEN A STREAM, AUTOMATICALLY LOADING THE NECESSARY FILE 
    // BASED ON THE VALUE OF $fonction
    $handle         = fopen($loadableFiles[$fonction]);

    // CREATE A BASE ARRAY TO HOLD ALL ENTRIES SHARED ACROSS ALL CASES
    $shared         = [ $fonction, $groupe, $zone, $no_lecteur, 
                        $no_carte, date("d/m/Y"),  $date_courante2, 
                        $chrono[$no_chrono]['NO_CHRONO'] ];

    // INITIALIZE $ligne TO NULL
    $ligne          = null;

    // USING THE VALUE OF $fonction BUILD THE $ligne ARRAY
    switch($fonction){
        case 1;
            $ligne  = [ $cod_typ_acces, $statut, $codeErreur, 0];
            break;
        case 2;
            $ligne  = [ $cod_typ_monet, $statut, 1,  $val_nbu_auto,
                        $val_nbu_prec,  $codeErreur, 0];
            break;
        case 3;
            $ligne  = [ self::$entree_sortie, $statut, $codeErreur, 0, 0];
            break;
    }

    // IF WE HAVE SOME DATA IN THE $ligne ARRAY, THEN WE PROCESS AND SAVE THE CSV
    // TO BE SURE WE HAVE "WRITE-PERMISSION" ON THE FILE; 
    // WE EXPLICITLY GIVE THE PERMISSION AGAIN
    if($ligne) {
        // MERGE $shared WITH $ligne
        $ligne      = array_merge($shared, $ligne);

        // GIVE READ/WRITE PERMISSIONS TO THE FILE OWNER (@LEAST)...
        chmod($loadableFiles[$fonction], 0644);

        // TRY SAVING THE FILE...
        // DUMP THE ERROR MESSAGE ON FAILURE... 
        // YOU MIGHT AS WELL THROW AN EXCEPTION...
        try{                
            fputcsv($handle, $ligne);
        }catch (Exception $e){
            var_dump($e->getMessage());
        }
    }
    // CLOSE THE STREAM
    fclose($handle);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 2016-07-23
    • 2019-08-24
    • 2019-10-19
    • 2012-12-25
    • 1970-01-01
    相关资源
    最近更新 更多