Comunidad de diseño web y desarrollo en internet online

Problemas con fwrite y fputcsv en servidor compartido

Citar            
MensajeEscrito el 14 Feb 2016 02:54 am
Hola a todos,

Estoy tratando de crear un archivo CSV mediante PHP y el código creado para ello, que funciona sin problemas en mi maquina local, no lo hace igual al subirlo al servidor compartido. En realidad el archivo sí se crea con fopen, pero ninguno de los comandos de escritura (fwrite ni fputcsv) parece funcionar; al terminar de correr el código el archivo queda completamente vacío (0 bytes), pero no se reporta ningún error a pesar de tener error_reporting establecido a '-1'.

Incluso he aplicado chmod() para conceder todos los permisos al archivo, pero sigue quedando el archivo en blanco.

Sólo se me ocurre que pueda ser una directiva de PHP o Apache, pero no logro establecer cuál; he buscado información al respecto pero nada me ha ayudado.

¿Alguna idea?

Código :

   function rst2csv($file,$rst,$sep=';',$quo='"',$esc="\\",$fdl="\r\n") {
    //echo 'bdata.rst2csv( $rst = "'.rst2tbl($rst).'",$sep = "'.$sep.'",$quo = "'.$quo.'",$esc = "'.$esc.'",$fdl = "'.$fdl.'" )<br/>'; //onlydebug
    
     //crea el archivo de salida
    $file = 'tmp/'.$file.'.csv';
    echo $file.'<br/>';
    $ff = fopen ($file,'w');
    echo chmod($file,0777);
    
    //ecribe el archivo de salida
    if(data($rst)) {
      
      // crea la cadena de cabecera
         $reg = ''; // inicializa el registro o linea de datos
         while ($fld = getfld($rst)) {
        $reg.= (($reg=='')?'':$sep).ucfirst($fld->name);
      }
      
      //escribe la cadena de cabecera
      fwrite($ff,$reg.$fdl);
      
      //recorre el recordset $rst y escribe cada registro $row en el archivo de salida
      while ($row = getrow_assoc($rst)) {
        fputcsv($ff,$row,$sep,$quo,$esc);
      }
    }
    
    //cierra el archivo
    fclose($ff);
    //reinicia el recorset para su uso
    restart($rst);
    
    //devuelve la ruta del archivo creado
    return $file;
  }



Como os dije el código funciona perfectamente en modo local, no le presteis atención a variables y funciones; el problema surge en el servidor compartido.

Os agradezco cualquier ayuda

Por LumAuro

1 de clabLevel



 

firefox
Citar            
MensajeEscrito el 14 Feb 2016 03:46 am
Me respondo yo mismo:

Para buscar alguna directiva asociada al tema decidí usar 'phpinfo()' y, aunque al principio no percaté (realmente necesitaba un descanso mental y escribir la consulta me lo concedió), descubrí que la versión de PHP del servidor compartido que estaba usando (5.4.7) es menor a la versión en que se incluyó el parámetro 'escape_char' (la 5.5.4), y da la casualidad que en mi código quise preveer la posibilidad de cambiar los parámetros del archivo CSV (incluyendo el caracter de escape).

Para conservar esa posibilidad de definir un caracter de escape diferente al que viene por defecto, modifiqué el código en la parte pertinente así:

Código :

      $pv = explode(".",phpversion());
      $pv = $pv[0]*10000+$pv[1]*100+$pv[2];
      
      //recorre el recordset $rst y escribe cada registro $row en el archivo de salida
      while ($row = getrow_assoc($rst)) {
        if($pv>=50504)fputcsv($ff,$row,$sep,$quo,$esc); else fputcsv($ff,$row,$sep,$quo);
      }


Y con eso corre perfecto, en ambas máquinas... (menudo lío el de las versiones XD)

Sigo sin entender porqué no se mostró el error o alguna advertencia al respecto, cuando cambié error_reporting a -1; pero eso ya será otra historia.

Gracias por leer.

Por LumAuro

1 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.