Newsgroup: it.comp.www.php
Titolo: esportare csv con php

Ho creato queste righe perche mi serve esportare con il browser un csv tramite una query
 
Mi esegue normalmente la query e mi fa un print ma non mi da la possibilità di creare un file .csv (ups_export.csv)
dove ho sbagliato?
 
<html>
<body>
<?php
    ob_start();
	header("Content-type: text/csv");
	header("Content-Disposition: attachment; filename=ups_export.csv");
	header("Pragma: no-cache");
	header("Expires: 0");
	ob_end_clean();
	mysql_connect('localhost','aaaaaa_aaF5df','aaaaaaaaMACS');
    mysql_select_db('aaaa_HGDaa4tgk');
	$query = mysql_query('SELECT upscountry.Country, upscountry.ISO, upscountry.RegionState, upscountry.City, upscountry.ZipPostalCodeFrom, upscountry.ZipPostalCodeTo, upsprices.WeightFrom, upsprices.WeightTo, upsprices.ShippingPrice, upsprices.DeliveryType
FROM upscountry
LEFT JOIN upsprices ON upscountry.Zone = upsprices.Zone');
while($r=mysql_fetch_array($query)){
	foreach($r as $k => $v){
		if(is_numeric($k)){
			echo '"'.str_replace('"', '""', $v).'",';
		}
	}
	echo "<br/>";
}
 
?>
</body>
</html>


togli <html>  <body> ob_start() e ob_clean()
 
prendi anche l'abitudine di togliere il ?> di chiusura
-- 
I fatti mi cosano

 			echo '"'.str_replace('"', '""', $v).'",';
 
Gh! :(
 
http://php.net/manual/en/function.fputcsv.php
 
 
Fa tutto da solo.
E se non hai PHP 5.1, cambia server.
 
Bye.

Grazie ho risolto
ora però mi trovo un altro ostacolo prima di creare il csv devo manipolare il dato di un campo
 
creo la query
$result = mysql_query(" SELECT upscountry.Country, upscountry.ISO, upscountry.RegionState, upscountry.City, upscountry.ZipPostalCodeFrom, upscountry.ZipPostalCodeTo, upsprices.WeightFrom, upsprices.WeightTo, upsprices.ShippingPrice, upsprices.DeliveryType
FROM upscountry
LEFT JOIN upsprices ON upscountry.Zone = upsprices.Zone
ORDER BY upscountry.Country ASC ");
 
ora avrei la necessità di manipolare il dato del campo upsprices.ShippingPrice e maggiorarlo di una percentuale:
 
$Transportcost = Il dato estratto da upsprices.ShippingPrice
$Freightcost = "16,50";	
$Shipmentcost = round(Transportcost + (Transportcost * ($Freightcost / 100)),2) ;
 
come posso fare?		

come posso fare?		
 
SELECT ... ROUND(upsprices.ShippingPrice*1.165,2) AS ShippingPrice
 
Pero' occhio che, se scrivi "16,50" con la virgola, in certi casi te lo
considerera' una stringa, la promuovera' a numero, e siccome la virgola
non e' un separatore valido perche' ci vorrebbe il PUNTO, interpretera'
la sequenza come: 16<CACCA>, il cui valore e' 16, e non 16.5 come forse
ti aspettavi.
 
Leonardo
 
-- 
 
Then felt I like some watcher of the skies, when a new planet swims into his ken;
Or like stout Cortez when with eagle eyes, he star'd at the Pacific; and all his men
Look'd at each other with a wild surmise - silent, upon a peak in Darien.

ti aspettavi.
 
Nel caso, basta che tu dichiari invece:
 
	$Freightcost = 16.5;
 
e dovrebbe funzionare. Suggerisco:
 
	$Shipmentcost = round($Transportcost*(1.0+$Freightcost/100.0),2);



domanda stupida
perche 16.50 lo hai trasformato in 1.165,2?
 

perche 16.50 lo hai trasformato in 1.165,2?
 
*Non* l'ho trasformato in 1.165,2! La scrittura:
 
	ROUND(upsprices.ShippingPrice*1.165,2)
 
significa che prendo "upsprices.ShippingPrice*1.165" con 2 decimali.
 
Magari avrei dovuto scrivere, piu' chiaramente,
 
	ROUND( upsprices.ShippingPrice * 1.165, 2 )
 
Perche' ho trasformato 16.50 in 1.165: perche' tu vuoi sommare a ShippingPrice
il 16.5% di ShippingPrice. Ma 
 
	SP + SP*16.50/100.0
	=
	SP * ( 1.0 + 16.50/100.0 )
	=
	SP * ( 1.0 + 0.165 )
	=
	SP * 1.165
 
Un'altra curiosita' carina e': perche' insista a scrivere 1.0 invece che 1. La
maggioranza dei linguaggi di programmazione, dovendo sommare due numeri non di
uno stesso tipo (1 e' un intero, 0.165 un 'virgola mobile') promuovono il tipo
con range o precisione minore. In questo caso, 1 diventa virgola mobile.
 
In altri casi succede che vince il primo, o magari ci sono due conversioni (ad
esempio "16" + 2.33). E li' puo' succedere la qualunque.
 
Per esempio:
 
	"16" + 2.33   ragionamento: "16 e' una stringa: allora, converto anche
		                     2.33 in stringa"
		      risultato: 162.33 (mai successo, col Javascript? :-) )
 
	"16" + 2.33   ragionamento: "16 e' una stringa: lo porto ad intero"
		      risultato: 18
 
	"16" + 2.33   ragionamento: "16 e' una stringa... porto ad intero EHI!
		      ma 2.33 e' in virgola mobile! Allora, porto 16 da intero
		      a virgola mobile"
		      risultato: 18.33
 
Per questo motivo, preferisco essere paranoicamente pignolo, e specificare che
quando dico 16.5/100, quel 100 e' perdio un floating point, e che non si sogni
manco p'a controcassa di fare magari una divisione intera e restituire "zero",
o approssimare e darmi "0.16" che poi, su un milione di euro, fra averli e non
averli ci corre un cinquomilo.


Il giorno sabato 21 settembre 2013 08:58:54 UTC+2, 
jesol...@gmail.com
 ha scritto:

Scusa ma le cose mi vengono dette dopo,
il valore upsprices.ShippingPrice deve essere manipolato 2 volte 
per cui dato che ho fatto cosi:
$Freightcost = $row_freight['Freight'];
$Freight = round((1.0+$Freightcost/100.0),2); 
 
$Commissioncost = $row_freight['Commission'];
$Commission = round((1.0+$Commissioncost/100.0),2); 
 
La query la ho impostata cosi inizialmente 
 
SELECT upscountry.Country, upscountry.ISO, upscountry.RegionState, upscountry.City, upscountry.ZipPostalCodeFrom, upscountry.ZipPostalCodeTo, upsprices.WeightFrom, upsprices.WeightTo, ROUND(upsprices.ShippingPrice*$Freight,2) AS ShippingPrice, upsprices.DeliveryType
FROM upscountry
LEFT JOIN upsprices ON upscountry.Zone = upsprices.Zone
ORDER BY upscountry.Country ASC, upsprices.WeightFrom
 
Ma l'operazione sarebbe ShippingPrice + Freightcost dal valore ottenuto dovrei aggiungere una ulteriore ricarico $Commission
 
Ho provato ma non ne vengo fuori 
 

On Mon, 23 Sep 2013 02:09:24 -0700 (PDT), 
jesol...@gmail.com
 wrote:
 
Scusa, forse avrei dovuto dirtelo prima, ma il fatto e' che per come scrivi e
come quoti, leggerti per me e' FATICOSISSIMO. Ti chiederei di fare un piccolo
sforzo: 
http://wiki.news.nic.it/QuotarBene
 


Ma l'operazione sarebbe ShippingPrice + Freightcost dal valore ottenuto dovrei aggiungere una ulteriore ricarico $Commission
 
Lascia stare l'SQL e il PHP: matematicamente, l'operazione com'e'? Detto X lo
ShippingPrice, Y il freight, Z la commissione, la cifra che deve venire fuori
come e' ottenuta? ("Supponiamo che lo shippingprice sia 123.45, e che... ecc.
ecc.; allora la cifra finale e'...").
 
Intanto chiarisci questo: altrimenti, non ha senso provare a mettere giu' PHP
o SQL, e soprattutto, c'e' il rischio che quando anche venisse fuori la cifra
giusta, venisse fuori per il motivo sbagliato: il classico caso che funziona,
durante i test, e poi ti pianta in asso in produzione.


Il giorno sabato 21 settembre 2013 08:58:54 UTC+2, 
jesol...@gmail.com
 ha scritto:

Scusa ma sto utilizzando 
https://groups.google.com
 per leggere e scrivere ed è Sgoogle che decide dove quotare

Il giorno sabato 21 settembre 2013 08:58:54 UTC+2, 
jesol...@gmail.com
 ha scritto:

Meglio se scrivo un esempio esplicativo:
 
Prezzo spedizione 10,00 euro
Supplemento prezzo carburante + 16,50%
Ricarico prezzo di speizione + 5%
 
per cui sarebbe 
10,00 + 16,50% = 11,65 euro
11,65 + 5% = 12,23 
arrotondamento per eccesso allo 0,50 superiore = 12,50
(se avevo 12,76 ad esempio arrotondare alle 00 per cui 13,00)
 
 
Grazie mille in anticipo

(se avevo 12,76 ad esempio arrotondare alle 00 per cui 13,00)
 
Applichi sempre la solita formula per le percentuali:
 
	ROUND ( 10.00 * 1.165 * 1.05, 2)
 
dove 1.165 = (100+16.5)/100, e 1.05 = (100+5)/100.
 
Volendo ottimizzare, visto che 1.165*1.05 = 1.22325, puoi anche scrivere
 
	ROUND ( 10.00 * 1.22325, 2 )
 
Funziona con qualunque numero di percentuali. "Aggiungere il quarantadue
per cento" equivale a "moltiplicare per uno virgola quarantadue".


Il giorno sabato 21 settembre 2013 08:58:54 UTC+2, 
jesol...@gmail.com
 ha scritto:

Scusa ma ho un problema con la funzione fputcsv
 
Il manuale dice fputcsv(file, fields, separator, enclosure);
 
per cui query 
 
$result = mysql_query(" SELECT upscountry.Country, upscountry.ISO, upscountry.RegionState, upscountry.City, upscountry.ZipPostalCodeFrom, upscountry.ZipPostalCodeTo, upsprices.WeightFrom, upsprices.WeightTo, ROUND(upsprices.ShippingPrice*$Freight*$Commission,1) AS ShippingPrice, upsprices.DeliveryType
FROM upscountry
LEFT JOIN upsprices ON upscountry.Zone = upsprices.Zone
ORDER BY upscountry.Country ASC, upsprices.WeightFrom ");
 
Creo l'Header 		
fputcsv($f, array('Country','ISO','Region/State','City','Zip/Postal Code From','Zip/Postal Code To','Weight From','Weight To','Shipping Price','Delivery Type'));
 
stampo i valori
 
while($row = mysql_fetch_row($result)) {
	fputcsv($f, $row, ',');
}
 
i valori estratti vengono divisi correttamente dalla virgola,  non mi serve il carattere di chiusura riga enclosure.
ma non ho capito perche non mi mette "" anche sul valore testo
 
ecco le prime 2 righe estratte
praticamente Afghanistan AFG e * sono senza apici mentre UPS Express Saver li ha inseriti 
 
Afghanistan,AFG,*,,,,0.0000,0.5000,39.4,"UPS Express Saver"
Afghanistan,AFG,*,,,,0.5100,1.0000,45.3,"UPS Express Saver"

 ma non ho capito perche non mi mette "" anche sul valore testo
 
Perché il formato csv è fatto cosí. Mette le virgolette solo quando serve 
(ci sono spazi :) )
 
Bye.

 qualunque.
 
viva Delphi :)
 
-- 
Alessandra
 
[NUOVO] "Contiamo il gioco tv in Delphi" (ebook) -
http://tinyurl.com/contiamo-gioco-delphi
 
Altri libri e pubblicazioni su > 
http://alessandraromano.weebly.com
 
 
Creare il mondo in sei giorni, ma che poteva venire? Una cosa
arrangiata.