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;

?>


Alvast bedankt.
Voor regel 33 de kolommen van $row die van het "Money format" zijn aanpassen met number_format()?
Hoi Thomas,

Bedankt voor je reactie.
Dit heb ik al getest op de volgende manier: fputcsv($fh, number_format($row,2), ";");
Maar dit werkt helaas niet.

Alvast bedankt.
Mja, number_format op een array werkt niet he.

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, ";");
}
?>
Bedankt voor de reactie, waar haal je de momoney en de moprobs vandaan? Of wat wil dat zeggen, daar krijg ik nu een foutmelding van.
@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.
Hoi Johan,

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.

Ik zal morgen die print_r is gebruiken.
@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

?>[/fout]
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.
Thomas van den Heuvel op 31/05/2015 01:01:57

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:

<?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)){

$i = 1; // gebruik print_r($row) om er achter te komen welke array index jouw "currency" bevat.
$row[$i] = number_format( $row[$i], 2 );

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;

?>

To be fair: de topicstarter gaf niet aan dat daar het probleem zat / zit.

Vaak is 3/4 van het werk om vragen op een forum als deze te beantwoorden het uitvogelen:
- wat iemand nu bedoelt
- wat iemand nu wil

Als dat duidelijk is geworden is het vinden van een oplossing simpelweg het extrapoleren van de verzamelde informatie...

Volgens mij wordt dit in de volksmond ook wel het opstellen van een specificatie genoemd.

Vergelijk het met het bakken van een taart. Zonder een recept wordt dat verdomd lastig en weet ik ook niet hoe deze uiteindelijk zou moeten smaken.

Reageren