сжатие файла CSV, экспортированного из php - PullRequest
1 голос
/ 30 марта 2020

Итак, я только что начал PHP, и теперь я пишу скрипт, который будет принимать запрос mysql и экспортировать его в файл CSV, а затем сжать его перед загрузкой. Вот мой код

    <?php
$filename = "CSVexport";
// Connect to DB..
$host = 'localhost';
$user = 'root';         //database username
$password = '';         // database password
$database = 'script'; // database name
//Connect to MySQL using PDO.
$pdo = new PDO("mysql:host=$host;dbname=$database", $user, $password);
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, FALSE);
//tblclients is the table we are acting on
$resultset = $pdo->query('
    SELECT * FROM tblclients  
    ORDER BY id ASC
');
// Flushing less often requires more server memory usage to maintain the buffer
// but is probably faster and does better gzip compression
$flushEveryXRows = 5000;
// Enable GZIP on-the-fly compression
ini_set('zlib.output_compression_level', 9);
ob_start('ob_gzhandler');
//creating my zip file
$zipfile = tempnam("tmp", "zip");
$zip = new ZipArchive();
$zip->open($zipfile, ZipArchive::OVERWRITE);
$outputBuffer = fopen("php://temp/maxmemory:$php_memory", 'w');
if($outputBuffer === false) {
    die('Failed to create file');
}
// Create header row of CSV
fputcsv($outputBuffer, [
    'ID', 'uuid', 'FirstName', 'LastName', 'Company Name', 'Email', 'Address', 'address2', 'City', 'State', 'postcode', 'Country', 'Phone Number', 'taxid', 'password', 'authmodule', 'authdata', 'currency', 'defaultgateway', 'credit', 'taxexempt', 'latefeeoveride', 'overideduenotices', 'separateinvoices', 'disableautocc', 'Date created', 'notes', 'billingcid', 'securityqid', 'securityqans', 'groupid', 'cardtype', 'cardlastfour', 'cardnum', 'Start Date', 'Expiry Date', 'issuenumber', 'bankname', 'banktype', 'bankcode', 'bankacct', 'gatewayid', 'lastlogin', 'ip', 'host', 'Status', 'language', 'pwresetkey', 'emailoptout', 'marketingemailsoptin', 'overrideautoclose', 'allow_sso', 'email_verified', 'created at', 'updated at', 'pwresetexpiry'
]);
// Dump all rows
$count = 56;
while ($r = $resultset->fetch(PDO::FETCH_NUM)) {
    fputcsv($outputBuffer, $r);
 $zip->addFromString($filename . ".csv", stream_get_contents($outputBuffer));
}
fclose($outputBuffer);
$zip->close();
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="' . $filename . '.zip"');
header('Content-Length: ' . filesize($zipfile));
readfile($zipfile);
unlink($zipfile);

Таким образом, приведенный выше код действительно может создать заархивированный файл с csv внутри, но csv заканчивается пустым, содержимое из базы данных не записывается в csv. Может кто-нибудь, пожалуйста, дайте мне предложение о том, что делать. и как также я бы добавил шифрование в ZIP-файл. но на данный момент все, что мне нужно, это чтобы csv в zip-файле включал содержимое из моей базы данных, которое он не записывает.

...