CSV export naar een folder

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Bart Versteeg

Bart Versteeg

12/09/2016 23:45:08
Quote Anchor link
Hallo mede php'ers,

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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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);
}

?>


Ik hoop dat iemand mij hiermee kan helpen. Bij voorbaat dank
Gewijzigd op 12/09/2016 23:45:39 door Bart Versteeg
 
PHP hulp

PHP hulp

02/12/2024 21:59:11
 
Ivo P

Ivo P

13/09/2016 02:44:06
Quote Anchor link
je hebt het in je vraag niet over het uitspugen van een csv file.

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
 
Bart Versteeg

Bart Versteeg

13/09/2016 10:01:54
Quote Anchor link
Bedankt voor je reactie. Zou je mij misschien nog iets verder kunnen helpen? Ik weet niet goed waar ik moet beginnen en welk stukje code ik hiervoor moet aanspreken.

B.v.d.
 
Ivo P

Ivo P

13/09/2016 10:42:37
Quote Anchor link
Begin eerst eens om de data op het scherm te zetten.

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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php  echo $row['order_id']. '; '. $row['date'] .'; ' . $row['customer'] . '<br>'; ?>


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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.