简体   繁体   中英

export mysql table to csv with php (no select into outfile)

I am trying to export a MySQL table to a CSV file. The code I have works fine:

$result = mysql_query('SELECT * FROM `TABLE`'); 
if (!$result) die('Couldn\'t fetch records'); 
$num_fields = mysql_num_fields($result); 
$headers = array(); 
for ($i = 0; $i < $num_fields; $i++) 
{     
$headers[] = mysql_field_name($result , $i); 
} 
$fp = fopen('php://output', 'w'); 
if ($fp && $result) 
{     
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="export.csv"');
header('Pragma: no-cache');    
header('Expires: 0');
fputcsv($fp, $headers); 
while ($row = mysql_fetch_row($result)) 
{
fputcsv($fp, array_values($row)); 
}
die; 
}

However I would like to have the csv file uploaded automatically to my web host server instead of being downloaded to my computer.
I can't use the "SELECT... INTO OUTFILE" query as my provider does not want to give me the FILE privilege.
Any way I can wright the csv output to my provider's server with php instead of downloading it to my computer?

If you want to store on the server instead of offering the data to the browser, you need to do some changes with your (otherwise fine working) code:

  1. The header function is not needed any longer. Remove those.
  2. You don't want to output into php://output any longer, but instead use the path to the file where you want to store the CSV data into.

And that's it already.

Some example code with the outdated Mysql client library you're using as PHP 5.5 code:

$file_name = '/path/to/file/on/server.csv';
$sql       = 'SELECT * FROM `TABLE`';

$query = function ($statement) {
    if (!$result = mysql_query($statement)) throw new RuntimeException(
        sprintf('Statement %s failed: #%s %s', var_export($statement, true), mysql_errno(), mysql_error())
    );
    return $result;
};

$names = function ($result) {
    for ($names = [], $i = mysql_num_fields($result); $i; $i--)
        $names[] = mysql_field_name($result, $i);
    return $names;
};

$rows = function($result) {while ($row = mysql_fetch_row($result)) yield $row;};

$result = $query($sql);

$lines = new AppendIterator();
$lines->append(new ArrayIterator([$names($result)]));
$lines->append($rows($result));

$csv = new SplFileObject($file_name, 'w');
foreach ($lines as $fields) {
    $csv->fputcsv($fields);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM