CSV export naar een folder
Ik heb een php script, welke ik wil automatiseren om CSV bestanden te exporteren naar een bepaalde directory. De data wordt uit een mysql tabel gehaald.
CSV bestanden worden nu netjes in een directory geschreven dus wat dat betreft gaat dat prima. Echter wil ik dat het CSV wordt gedeeld op basis van een order ID. Voor elk order ID moet dus een apart CSV bestand worden gemaakt.
Zoals:
12-09-2016-05-21_csvexport_1.CSV < data van order 1
12-09-2016-05-21_csvexport_2.CSV < data van order 2
Het script wil ik gaan automatiseren d.m.v. een cronjob. De te exporteren orders mogen d.m.v. een bepaalde datum range worden gefilterd. Bijv: wanneer het script wordt uitgevoerd, dan mag deze de orders van de laatste 2 dagen exporteren.
Het maakt daarbij niet uit als de CSV wordt overschreven.
Het script ziet er zo uit:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php
error_reporting(E_ALL ^ E_DEPRECATED);
$host = 'localhost';
$user = 'user';
$pass = 'pass';
$db = 'database';
$table = 'columns';
$file = 'csvexport';
$dir = 'csv';
$link = mysql_connect($host, $user, $pass) or die("Can not connect." . mysql_error());
mysql_select_db($db) or die("Can not connect.");
function escape_csv_value($value) {
$value = str_replace('"', '""', $value);
if ( preg_match( '/\\r|\\n|,|"/', $value ) ) {
return '"' . str_replace( '"', '""', $value ) . '"';
} else {
return $value;
}
}
$result = mysql_query("SHOW COLUMNS FROM ".$table."");
$i = 0;
if (mysql_num_rows($result) > 0) {
while ($row = mysql_fetch_assoc($result)) {
$csv_output .= $row['Field']."; ";
$i++;
}
}
$values = mysql_query("SELECT id_order, date, customer FROM orders");
while ($rowr = mysql_fetch_row($values)) {
for ($j=0;$j<$i;$j++) {
$csv_output .= escape_csv_value($rowr[$j]).';';
}
$csv_output .= "\n";
}
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: csv" . date("Y-m-d") . ".csv");
header( "Content-disposition: attachment; filename=".$filename.".csv");
$filename = date("d-m-Y-i-s_", time()) . $file.".csv";
print $csv_output;
file_put_contents($dir ."/".$filename, $csv_output);
}
?>
error_reporting(E_ALL ^ E_DEPRECATED);
$host = 'localhost';
$user = 'user';
$pass = 'pass';
$db = 'database';
$table = 'columns';
$file = 'csvexport';
$dir = 'csv';
$link = mysql_connect($host, $user, $pass) or die("Can not connect." . mysql_error());
mysql_select_db($db) or die("Can not connect.");
function escape_csv_value($value) {
$value = str_replace('"', '""', $value);
if ( preg_match( '/\\r|\\n|,|"/', $value ) ) {
return '"' . str_replace( '"', '""', $value ) . '"';
} else {
return $value;
}
}
$result = mysql_query("SHOW COLUMNS FROM ".$table."");
$i = 0;
if (mysql_num_rows($result) > 0) {
while ($row = mysql_fetch_assoc($result)) {
$csv_output .= $row['Field']."; ";
$i++;
}
}
$values = mysql_query("SELECT id_order, date, customer FROM orders");
while ($rowr = mysql_fetch_row($values)) {
for ($j=0;$j<$i;$j++) {
$csv_output .= escape_csv_value($rowr[$j]).';';
}
$csv_output .= "\n";
}
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: csv" . date("Y-m-d") . ".csv");
header( "Content-disposition: attachment; filename=".$filename.".csv");
$filename = date("d-m-Y-i-s_", time()) . $file.".csv";
print $csv_output;
file_put_contents($dir ."/".$filename, $csv_output);
}
?>
Ik hoop dat iemand mij hiermee kan helpen. Bij voorbaat dank
Gewijzigd op 12/09/2016 23:45:39 door Bart Versteeg
Waarom je dan op regels 40/42 ineens headers geeft om een excel aan te kondigen???
In elk geval:
als je dit in 1 query wilt doen, dan zou ik op regel 32 de query eerst uitbreiden met een
WHERE date > CURRENT_DATE - INTERVAL 2 DAY
om alleen de recente orders op te halen.
Daarnaast moetje dan de query uitbreiden met
ORDER BY id_order
Vervolgens is er een regel nodig
$vorigeId = -999;
(of een andere waarde die niet voor gaat komen. Bijvoorbeeld "leeg".)
In het stukje WHILE controleer je vervolgens of de data van een andere orderID is dan de vorige regels
Zo nee: regel toevoegen
Zo ja: file afsluiten en nieuwe file openen (en $vorigeID een nieuwe waarde geven.)
En om je escape functie etc. niet nodig te hebben, zou je naar
http://php.net/manual/en/function.fputcsv.php
kunnen kijken.
Dan escapet het automatisch
B.v.d.
Denk eerst de query uit. (where en order by)
Dan een while loop om de data allemaal onder elkaar op het scherm te zetten (row voor row)
Doe maar iets als
Dan komt de stap om te gaan scheiden op orderid.
Dus kijk eens hoe je een extra wit regel kunt plaatsen tussen de rows van order 1 en van order 2 etc.
Vervolgens pas gaan kijken hoe je dat in een file plaatst. Dat kun je al, daar wringt de schoen dus niet.