it-swarm.com.de

Generierung der CSV-Datei fehlgeschlagen

Ich verwende ein Plugin für einen Client (das ich bis zu einem gewissen Grad modifiziert habe), das eine Datenbank mit Organisationsmitgliedern erstellt und verwaltet (dazu verwende ich eine neue WP-Tabelle).

Es gibt eine nette Funktion, die einen CSV-Import und eine Einfügung ausführt, die großartig funktioniert. Es gibt auch eine Funktion zum Herunterladen des Inhalts dieser Tabelle als CSV, die auf meinem lokalen System einwandfrei funktioniert, jedoch beim Ausführen vom Server aus fehlschlägt. Ich bin ehrlich gesagt ratlos, warum.

Die PHP-Datei, die die Logik enthält, wird einfach verlinkt. Die Datei:

<?php
    //include some files
    include('../../../wp-blog-header.php');

    //DIAG: phpinfo();   

    function fputcsv4($fh, $arr) {
        $csv = "";
        while (list($key, $val) = each($arr)) {
            $val = str_replace('"', '""', $val);
            $csv .= '"'.$val.'",';
        }
        $csv = substr($csv, 0, -1);
        $csv .= "\n";
        if ([email protected]($fh, $csv)) 
            return FALSE;
    }

    //get member info and column data
    $table_name = $wpdb->prefix . "member_db";
    $year = date ('Y');
    $members = $wpdb->get_results("SELECT * FROM ".$table_name, ARRAY_A);
    $columns = $wpdb->get_results("SHOW COLUMNS FROM ".$table_name, ARRAY_A);
    //DIAG: echo 'SQL: '.$sql.', RESULT: '.$result.'<br>';

    //output headers
    header("Content-type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"members.csv\"");

    //open output stream
    $output = fopen("php://output",'w'); 

    //output column headings
    $data[0] = "ID";
    $i = 1;
    foreach ($columns as $column){
        //DIAG: echo '<pre>'; print_r($column); echo '</pre>';
        $field_name = '';
        $words = explode("_", $column['Field']);
        foreach ($words as $Word) $field_name .= $Word.' ';
        if ( $column['Field'] != 'id' && $column['Field'] != 'date_updated' ) {
            $data[$i] = ucwords($field_name);
            $i++;
        }
    }
    $data[$i] = "Date Updated";
    fputcsv4($output, $data);

    //output data
    foreach ($members as $member){
        //DIAG: echo '<pre>'; print_r($member); echo '</pre>';
        $data[0] = $member['id'];
        $i = 1;
        foreach ($columns as $column){
            //DIAG: echo '<pre>'; print_r($column); echo '</pre>';
            if ( $column['Field'] != 'id' && $column['Field'] != 'date_updated' ) {
                $data[$i] = $member[$column['Field']];
                $i++;
            }
        }
        $data[$i] = $member['date_updated'];
        //echo '<pre>'; print_r($data); echo '</pre>';
        fputcsv4($output, $data); 
    }
    fclose($output);
?>

Wir haben also eine Routine, in der eine Abfrage ausgeführt wird, $output mit fopen erstellt wird, die über foreach-Anweisungen hinzugefügt wird und schließlich fclosed.

Der Fehler, den ich (vom Server) erhalte, ist

Error 6 (net::ERR_FILE_NOT_FOUND): The file or directory could not be found.

Aber es wird eindeutig gefunden, es scheitert einfach. Wenn ich phpinfo() (PHP Version 5.2.17) oben in der Datei aktiviere, erhalte ich definitiv eine Antwort - insbesondere Cannot modify header information (weil phpinfo() bereits einen Header generiert hat). Alle erwarteten Daten werden jedoch auf die Seite gedruckt, so dass zumindest vieles korrekt funktioniert.

Ich vermute, dass es etwas gibt, das verhindert, dass die Funktionen fopen, fclose richtig funktionieren, aber ich habe nicht genug Erfahrung damit, um genau zu identifizieren, woran das Problem liegt.

Ich werde noch einmal bemerken, dass dies in meiner Testumgebung (localhost/XAMPP, netbeans) genauso funktioniert wie erwartet.

Alle mögliche Gedanken würden am meisten geschätzt.

1
Bosworth99

Versuche dies:

<?php
   header("Content-type: application/csv");
   header('Content-Disposition: inline; filename="export.csv"'); // change this filename
   include ('../../../wp-load.php'); // may need to change number of "../" depending upon location
   global $wpdb;
   $rows = $wpdb->get_results ("SELECT * FROM {$wpdb->prefix}table_name"); // change the table name
   echo strtolower(implode(',', array_keys((array)$rows[0]))) . "\r\n"; // fixes an Excel bug if the first column is "ID"
   foreach($rows as $row) echo '"' . implode ('","', array_values((array)$row)) . '"' . "\r\n";
?>

Dadurch wird automatisch der gesamte Inhalt der Tabelle als CSV-Datei formatiert und der Download direkt an den Browser übertragen. Dabei wird ein Dialogfeld geöffnet, in dem der Benutzer aufgefordert wird, die Datei zu speichern.

1
JMichael