Door
Dennis B
op 30-05-2015 17:47
gewijzigd op 30-05-2015 17:48
1.602 views
Hallo allemaal,
Ik heb een werkend script dat vanuit MSSQL data exporteert naar csv. Wanneer ik het bestand met notepad open krijg ik .0000;1234.5600; enz.
De juiste waarden van bovenstaand voorbeeld is: 0.00 en 1234.56. Er komen dus telkens 2 extra nullen aan het eind bij. Bij 0.00 laat ie de eerste 0 niet zien.
In MSSQL heb ik het Money format, ik heb met dit probleem meer ervaring, dit heeft te maken met een number_format, alleen ik weet niet hoe ik number_format kan implementeren in mijn script.
hieronder het script:
<?php
include'connection.php';
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);
$fileName = 'test.csv';
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header('Content-Description: File Transfer');
header("Content-type: application/csv");
header("Content-Disposition: attachment; filename={$fileName}");
header("Expires: 0");
header("Pragma: public");
$fh = fopen( 'php://output', 'w' );
$query = "SELECT * FROM table";
$res = odbc_exec($db,$query);
$headerDisplayed = false;
// Add a header row if it hasn't been added yet
while($row = odbc_fetch_array($res)){
if ( !$headerDisplayed ) {
// Use the keys from $data as the titles
fputcsv($fh, array_keys($row), ";");
$headerDisplayed = true;
}
// Put the data into the stream
fputcsv($fh, $row, ";");
}
// Close the file
fclose($fh);
// Make sure nothing else is sent, our file is done
exit;
?>
Noot: je wil de "thousand separator" waarschijnlijk ook leeg maken (4e parameter number_format()).
Zoiets dus:
<?php
// ...
// array with names of "Money format" columns
$moneyColumns = array('momoney', 'moprobs');
while ($row = odbc_fetch_array($res)){
if (!$headerDisplayed) {
// Use the keys from $data as the titles
fputcsv($fh, array_keys($row), ";");
$headerDisplayed = true;
}
// adjust money columns
foreach ($moneyColumns as $moneyCol) {
$row[$moneyCol] = number_format($row[$moneyCol], 2, '.', '');
}
// current row is now correctly modified for insertion into CSV
// Put the data into the stream
fputcsv($fh, $row, ";");
}
?>
@Dennis, Thomas geeft jouw een code die werkt met kolom namen in plaats van een numerieke index. Zijn code werkt niet aangezien odbc_fetch_array() de positie van kolommen als nummer geeft. Het is dan ook niet echt verstandig om deze functie te gebruiken tenzij je weet wat je doet.
[fout]Verander "odbc_fetch_array" naar "odbc_fetch_row" en pas de "$moneyColumns" array aan met de kolom naam(en) van je database waar het geld bedrag in staat.[/fout]
Als je dat niet weet, plaats dan even in de while loop:
<?php
print_r($row);
?>
Misschien dat je dan wel ziet wat je doet.
Ja, ik kan het voor je voorkauwen zodat je het kan copy-pasten maar zo leer je het niet.
Het zijn meerdere kolomnamen maar via mijn huidige code haalt ie alles op, zonder dat ik ik alle kolommen moet benoemen, met een nummer of met de naam. Of is dit niet mogelijk wat ik wil? Ik wil mijn script namelijk zo dynamisch mogelijk hebben.
@Dennis, jouw SQL code haalt alles op (de *). [fout]De functies "odbc_fetch_row()" of "odbc_fetch_array()" doen allebij precies hetzelfde alleen krijg je een andere array structuur terug.
<?php
# odbc_fetch_array()
$row = array(
0 => 'waarde 1' // van de eerste kolom in je db
1 => 'nog een waarde' // van de tweede kolom in je db
2 => 'meh' // etc.
)
echo $row[2] // meh
# odbc_fetch_row()
$row = array(
'kolomnaam1' => 'waarde 1'
'monies' => 'nog een waarde'
'paid' => 'meh'
)
echo $row['monies']; // nog een waarde
Errr, dat wordt lastig als je bedragen in specifieke kolommen wilt omzetten? Tenzij alle kolommen bedragen bevatten? Je geeft ook niet echt aan hoe je tabel eruit ziet he.
@Johan K en met odbc_fetch_row() is weer wat anders aan de hand als ik PHP.net mag geloven, deze moet je gebruiken in combinatie met odbc_result(), want odbc_fetch_row() geeft enkel een boolean terug...
Je zult dus iig wat moeten experimenteren met de odbc functies.
Errr, dat wordt lastig als je bedragen in specifieke kolommen wilt omzetten? Tenzij alle kolommen bedragen bevatten? Je geeft ook niet echt aan hoe je tabel eruit ziet he.
@Johan K en met odbc_fetch_row() is weer wat anders aan de hand als ik PHP.net mag geloven, deze moet je gebruiken in combinatie met odbc_result(), want odbc_fetch_row() geeft enkel een boolean terug...
Je zult dus iig wat moeten experimenteren met de odbc functies.
Je hebt helemaal gelijk, de enigste manier om een kolom naam te krijgen is via "odbc_field_name()" beetje dom van me..
Ik zal het bij deze dan maar toch wel effe voorkauwen omdat ik ook fout zat: