grafici con php

Ciao

Avrei intenzione di creare (se possibile) dei grafici con il php.

Mi spiego meglio:

Interrogando il db su un certo cliente che ha fatto degli acquisti io posso sapere

quando ha speso in un mese (o frazione) o quante fatture sono state emesse e in che giorno, sempre per uno stesso cliente (in verità posso avere anche i dati globali, cioè che sono riferiti alle somme di tutti i movimenti).

Vorrei fare in modo adesso di visualizzare i dati sotto forma di grafici, come quelli di excel (es: asse x tempo, asse y quantità o valori) avendo come punto di riferimento per il tempo il mese cioè il grafico completo del mese anche

se sono stati fatti movimenti solo dal 02 al 15 del mese (magari mettere in grigietto il resto) e così per tutti i mesi dell'anno.

Prima domanda: è possibile farlo con le librerie grafiche del php?

Seconda: Potete indicarmi, per il momento almeno in linea di massima, come?

Grazie anticipatamente.

inviato 9 anni fa
frankphp
X 0 X

Si, puoi farlo con le GD. In questo libro c'è un esempio (pagina 320):

http://www.phptr.com/content/images/013147149X/downloads/013147149X_book.pdf

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Si, puoi farlo con le GD. In questo libro c'è un esempio (pagina 320):

http://www.phptr.com/content/images/013147149X/downloads/013147149X_book.pdf

 :bye:

vado a scaricarlo da un amico con l'adsl (ho un 56k e il file sembra grosso)..comunque:

mi hanno suggerito questa pagina:

http://builder.com.com/5100-6371-5092227.html?tag=crm

Forse adotterò quello della figura b.

Quello che devo fare è però abbastanza complesso (almeno per me si intende) mi spiego nei dettagli.

Nella pagina della ricerca scelgo un determinato cliente e poi (usando dei campi imput text) un determinato intervallo di tempo come può essere ad esempio dal 15/01/07 al 31/03/07. Vorrei quindi, in base a questa scelta,

che la pagina che riceve questi dati crei 3 grafici del tipo indicato

(con sull'asse x tutti i giorni del mese e sull'asse Y vari intervalli di valori, da ? 1000, 2000, 3000 ecc ecc) sul primo, quello di gennaio tutti i valori dei movimenti commerciali (ad esempio il totale importo fattura o fatture x quel cliente in quel giorno) relativi a quel mese ma solo dal 15 in poi;

il secondo, febbraio, con tutti i valori di febbraio e marzo la stessa cosa.

Non so se sono stato chiaro. Penso di si.

Il fatto è che non so come impostare il progetto ..sembra facile a dirsi ma a metterci le mani non so da dove cominciare. Per la ricerca con le date non dovrebbe esserci problemi, visto che ho affrontato la cosa (e risolto) in una mia discussione precedente, se ricordi

Potete aiutarmi a capire come fare in questo caso?

Grazie ancora

risposto 9 anni fa
frankphp
X 0 X

inizia col realizzare una sola immagine, partendo dal riferimento che ti ho postato ed utilizzando dati "finti" statici, conservati in degli array.

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

inizia col realizzare una sola immagine, partendo dal riferimento che ti ho postato ed utilizzando dati "finti" statici, conservati in degli array.

 :bye:

proviamo..poi però dovresti aiutarmi ::)

risposto 9 anni fa
frankphp
X 0 X

Ciao

Intanto ho provato a visualizzare il grafico della pagina al link sopra postato e mi da errore:

Warning: Cannot modify header information - headers already sent by (output started at D:\Programmi\xampp\htdocs\fattura\trova.php:2) in D:\Programmi\xampp\htdocs\fattura\trova.php on line 138

PNG ??? IHDR??????d???ë9^§??IIDATxíÛA @?Á5øÿ/Ö I/Uç=f0Ûq²×¯?ß0OÂ< ó$Ì0OÂ< ó$Ì0OÂ< ó$Ì0OÂ< ó$Ì0OÂ< ó$Ì0OÂ< ó$Ì0OÂ< ó$ÌÛ§^oÛvþÀÿ¤7pFú;¤yæI'ayæI'aÞôj³üEiý cõA'ayæI'ayæ%Wûå.S Çê)iyæI'ayæI÷/«½Ëeÿp8¸\eæI'ayæI'ay7®ö.ϸ÷:ãàò?4OÂ< ó$Ì0OÂ< ó$Ì0OÂ< ó$Ì0OÂ< ó$Ì0O¼Ý.uûðKA'ayæI'ayû\þóκ'ñ· ????IEND®B`

la linea 138 è riferita all'header:

header("Content-type: image/png");

Il tutorial del link dice che bisogna richiamare il grafico così:

<img src="grid.php" />

Ma io devo per forza mettere il tutto nella stessa pagina altrimenti avrei problemi con l'invio dei dati per il db e la visualizzazione della stessa pagina.

Come risolvo adesso il problema?

Grazie

risposto 9 anni fa
frankphp
X 0 X

inizia col generare una sola immagine, senza utilizzare un'altra pagina che la richiama al suo interno!!!!

risposto 9 anni fa
Gianni Tomasicchio
X 0 X
inizia col generare una sola immagine, senza utilizzare un'altra pagina che la richiama al suo interno!!!!

forse non ho capito io, ma se richiamo l'immagine con

<img src="grid.php" />

Funziona, ma così non posso fare in quanto avrei problemi in seguito con l'invio delle variabili.

Devo risolvere per forza il problema dell'header.

Prova pure tu per piacere.

Grazie

risposto 9 anni fa
frankphp
X 0 X

il problema dell'header è causato dal fatto che, per qualche motivo, invii altri dati in output prima degli headers, tipo degli spazi, degli a capo.

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

il problema dell'header è causato dal fatto che, per qualche motivo, invii altri dati in output prima degli headers, tipo degli spazi, degli a capo.

 :bye:

infatti, hai ragione. Dimentico sempre sta menata degli header :P

Adesso ho risolto e vado avanti.

Gianni scusa ho provato a visualizzare anche il grafico a pagina 320 (quello con le barre) copiandone il codice

ma l'editor mi segnala errore in alcune righe (in rosso dei segni -) e non ho capito perchè.

Il grafico mi interessa tantissimo e vorrei "adottarlo".

Potresti capire cosa non va?

Grazie e ciao

risposto 9 anni fa
frankphp
X 0 X

riporta gli errori che ricevi

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Con questo piccolo script si crea un istogramma spero ti possa essere utile per creare cose piu' complesse ;)

<?php
    header ("Content-type: image/png");
   
   $img = imagecreatetruecolor(250, 200);
   
   $bianco = imagecolorallocate($img, 255, 255, 255);
   imagefill($img, 0, 0, $bianco);
   
   $rosso = imagecolorallocate($img, 255, 50, 50);
   $nero = imagecolorallocate($img, 0, 0, 0);
   
   imagefilledrectangle($img, 110, 90, 140, 90, $rosso);
   
   imagerectangle($img, 110, 90, 140, 90, $nero);
   
   imagefilledrectangle($img, 120, 20, 90, 90, $rosso);
   imagerectangle($img, 90, 20, 120, 90, $nero);
   
   $stile = array(
        $nero, $nero, $nero, $nero,
       $bianco, $bianco, $bianco, $bianco
    );
   
   imagesetstyle($img, $stile);
   
   imageline($img, 0, 90, 250, 90, IMG_COLOR_STYLED);
   imagepng($img);
?>
risposto 9 anni fa
DaD
DaD
1
X 0 X

Ok, ho risolto il problema. Questo quello che ho ottenuto, modificando dei valori ed aggiungendo come sfondo un'altra immagine:

carino no?!?

Adesso dovrei adattarlo.

Sull'asse x dovrei mettere i giorni del mese e sulle barre relative al giorno devo mettere la barra con il totale fatture relative a quel giorno (faccio il caso di non aver selezionato nessun cliente).

L'altro problema e aver un grafico separato per ogni mese (o frazione di esso) chiamato in questione dalla ricerca.

Come mi muovo gianni?

Grazie

ps: a proposito volevo inserire il simbolo dell'euro ma non riesco a visualizzarlo. Come mai?

risposto 9 anni fa
frankphp
modificato 9 anni fa
X 0 X

vogliamo riprendere il discorso?

Ciao

risposto 9 anni fa
frankphp
X 0 X

una cosa alla volta... qual'è la tua attuale priorità di modifica del precedente script?

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

una cosa alla volta... qual'è la tua attuale priorità di modifica del precedente script?

 :bye:

Certo Gianni, una cosa alla volta..altrimenti non ci capisco niente nemmeno io ;D

allora.

Non voglio stravolgere lo script del grafico sopra ma modificarlo dove è necessario.

Per primo devo creare grafici con sull'asse delle x i giorni del mese.

Ho fatto la cosa un po' alla carlona (aspettando suggerimenti) mettendo come chiave i giorni del mese manualmente nell'array:

$values = array(

1 => 5300,

2 => 5700,

3 => 6400,

4 => 6700,

5 => 6600,

6 => 7100,

7 => 7100,

8 => 4100,

9 => 100,

10 =>7100,

11 =>7900,

12 =>7500,

13 =>2100,

14 =>1100,

15 =>200

.....

31 =>1200

);

certo alcuni mesi sono di 30 gg e uno di 28 (o 29 come febbraio) ma forse posso aggirare la cosa

richiamando un array diverso con un IF a secondo del mese interessato; ma questa cosa magari possiamo vederla in seguito se per te va bene.

Primo problema:

Volendo utilizzare la struttura degli array, come ho detto, devo far confluire i totali delle fatture relativi ad un certo giorno

dopo la chiave dell'array ad esempio:

5 => "valore da inserire",

e su questo ci sto lavorando, non sapendo utilizzare gli array.

Il problema riguarda anche il valore da inserire visto che per lo stesso giorno ci possono essere + fatture, quindi dovrei aggiungere codice che verifichi la data e se questa è relativa allo stesso giorno sommare i valori e poi inserire nell'array il "valore da inserire"....non so se sono stato chiaro.

Ricordo che stiamo facendo l'ipotesi che la query riguarda i totali delle fatture di tutti i clienti (e non di uno solo) relativi ad un certo periodo anche se poi la cosa non cambia di molto in linea di massima.

Grazie

risposto 9 anni fa
frankphp
X 0 X

ho cominciato ad abbozzare qualcosa (aspettando consigli "professionali" ;)):

......
$title = 'Ammontare fatture mensili';
$title2 = 'Totale fatture (x Euro 100)';

$db = mysql_connect('localhost', 'root', '') or die(mysql_error());
@mysql_select_db('fattura', $db) or die(mysql_error());

$risultato = mysql_query("SELECT * FROM fatture",$db);
 


$values = array(
1 => 0,
2 => 0,
3 => 0,
4 => 0,
5 => 0,
6 => 0,
7 => 0,
8 => 0,
9 => 0,
10 => 0,
11 => 0,
12 => 0,
13 => 0,
14 => 0,
15 => 0,
16 => 0,
17 => 0,
18 => 0,
19 => 0,
20 => 0,
21 => 0,
22 => 0
);

$i = 1;
while($result = mysql_fetch_array($risultato)){
$values[$i] = $result['totale'];
$i++;
}


$max_value = 1000;
$units = 100;
...

Il codice completo del grafico, ovviamente, è quello da te suggerito ( pag 320 del pdf)

Con il codice sopra però non faccio altro che prendere i valori presenti nel campo totale della tabella del db uno x uno (e quindi il totale di ogni fattura singolarmente, ne sono presenti solo 20 al momento) e inserirli

nell'array. Devo adesso sommare i totali dello stesso giorno. Come posso fare?

Grazie

risposto 9 anni fa
frankphp
X 0 X

Secondo me in questo caso conviene affrontare i due problemi in una volta sola, altrimenti rischi di dover stravolgere nuovamente lo script.

Premettiamo che comunque ti sto proponendo una bozza che può essere migliorata, fa una query mysql per ogni giorno interessato.

Per prima cosa devi sapere quanti giorni ha il mese, ci sono diversi modi per fare questo, ad esempio:

$giorni = date("t",$giorni = date("t",mktime(0,0,0,$mese,1,$anno));
//$mese contiene il mese interessato, $anno idem

Poi con un ciclo, a.e. un bel for, scorri tutti i giorni e per ognuno recuperi e totalizzi le fatture, una cosa tipo (supponento che le date delle fatture sono salvate come timestamp):

$totalifatture = array();
for ($iday=0;$iday<$giorni;$iday++) {
    $datafattura = mktime (0,0,0,$iday+1,$mese,$anno);
    /*
    $query = somma tutte le fatture con data=$datafattura;
    esegui la query e recupera il totale a.e. $totale
    */
    $totalifatture[$iday] = $totale
}

A questo punto quando generi il grafico avrai l'array $totalifatture che contiene i totali di ogni giorno, tenendo presente che $totalifatture[0] è il totale delle fatture del primo giorno del mese.

risposto 9 anni fa
LonelyWolf
X 0 X

La query dovrebbe essere tipo:

select sum(campo_totale_fattura) as totale_giorno from tabella_fatture where campo_data_fattura = $datafattura;

E il totale lo trovi in totale_giorno.

risposto 9 anni fa
LonelyWolf
X 0 X

 ???

Non so ancora se la cosa mi è chiara.

Comunque vedo cosa riesco a fare.

Magari ti do i dati precisi su come è composta la tabella del db ecc ecc. per postarmi un codice che riesco ad interpretare meglio, con riferimenti generici negli esempi rischio di confondermi ancora più le idee.

In ogni caso, grazie lony.

risposto 9 anni fa
frankphp
X 0 X

scusa lony, mi sono reso conto che a questo punto è meglio fare il punto della situazione, la cosa è abbastanza complessa per le mie conoscenze.

E' vero che devo sapere quanti giorni ha il mese, ma il fatto che la query per la ricerca può includere date che

appartengono anche a diversi mesi (es: 12/02/07, 03/03/07, 05/04/07 ecc)

Io, come ho detto sto lavorando per il grafico sull'ipotesi più semplice, quella che prevede di visualizzare tutti i totali delle fatture (o sommarli se sono delle stesso giorno).

Se ricordi, visto che nel passo precedente del progetto mi hai aiutato moltissimo, io visualizzavo una lista delle fatture presenti del db in base al cliente selezionato e l'intervallo di tempo preso in considerazione.

Il codice era questo nel caso che volessi elencare tutto:

....
if (($_REQUEST['clie']=="")&&($_REQUEST['firstinput']=="")&&($_REQUEST['secondinput']==""))
   {
 $tutto = "SELECT * FROM fatture ORDER BY data";
     }
....

questo nel caso invece che selezionassi un certo cliente e delle date di intervallo per la ricerca nei moduli

html con i relativi campi nella pagina che inviava le variabili:

....
 elseif (($_REQUEST['clie']!="")&&($_REQUEST['firstinput']!="")&&($_REQUEST['secondinput']!="")) 
    {
    list($giorno,$mese,$anno) = split("/",$_REQUEST['firstinput']);
    $datain = mktime(0,0,0,$mese,$giorno,$anno);
    
    list($giorno,$mese,$anno) = split("/",$_REQUEST['secondinput']);
    $datafin = mktime(23,59,59,$mese,$giorno,$anno);
    
    $tutto = "SELECT * FROM fatture where id_cliente = '".$_REQUEST['clie']."' and data >= '".$datain."' and data <= '".$datafin."' ORDER BY data";
    }                

....

infine c'era il codice che mi dava la lista con i link alle fatture in base alla query.

Adesso il codice del grafico si dovrebbe trovare nella stessa pagina (io posso con 2 radio button nella pagina di ricerca, selezionare la modalità che mi visualizza la lista o il grafico).

I dati quindi inviati dal modulo di ricerca possono essere utilizzabili sia per la modalità lista sia per quella grafica (c'è un if che verifica la selezione di un o l'altro radio button e "attiva" un codice o l'altro).

I problemi sono molteplici (creare tanti grafici quanti sono i mesi presi in considerazione, anche se si trattasse solo dei dati di un solo giorno del mese), recuperare i totali per ogni giorno e sommarli (come mi hai fatto vedere tu) e infine creare il grafico o i grafici.

non saprei quindi come utilizzare questo codice:

$giorni = date("t",$giorni = date("t",mktime(0,0,0,$mese,1,$anno));
//$mese contiene il mese interessato, $anno idem
risposto 9 anni fa
frankphp
X 0 X

Purtroppo non ricordo più la struttura della tabella, mi rinfreschi la memoria?

La data della fattura è inserita come timestamp (usando la funzione mktime) vero?

risposto 9 anni fa
LonelyWolf
X 0 X

E' vero che devo sapere quanti giorni ha il mese, ma il fatto che la query per la ricerca può includere date che

appartengono anche a diversi mesi (es: 12/02/07, 03/03/07, 05/04/07 ecc)

Questo è un discorso differente e la query è diversa, quella che ti ho messo come esempio era per tutte le fatture di un mese, se hanno date differenti (+mesi) devi sapere come le identifichi, è quella la condizione where della query.

Questo codice:

$giorni = date("t",$giorni = date("t",mktime(0,0,0,$mese,1,$anno));

serve solo per sapere quanti giorni ha un determinato mese.

A questo punto però non è più chiaro a me cosa devi fare!

risposto 9 anni fa
LonelyWolf
X 0 X

Questo codice:

$giorni = date("t",$giorni = date("t",mktime(0,0,0,$mese,1,$anno));

serve solo per sapere quanti giorni ha un determinato mese.

A questo punto però non è più chiaro a me cosa devi fare!

Come non ti è più chiaro?

Se nel db sono presenti fatture che hanno nel campo "data" (di tipo int la cui data viene inserita con la funzione time(), mktime lo uso per trasformare le date del modulo che sono nel formato 12/03/07, ad esempio) diverse date nel senso che alcune hanno la data di 5 mesi fa altre di 2 mesi alcune addirittura di 15 mesi fa i devo sapere quanti mesi e quali mesi sono interessati dalla query in modo da generare tanti grafici uno per ogni mese che rientra nella query (fosse solo per un giorno solo)

Poi proseguo come hai detto tu nel senso che individuo di quanti giorni è fatto un mese per sommare i totali delle fatture dello stesso giorno.

Magari forse poi devo agire diversamente.

Grazie

risposto 9 anni fa
frankphp
X 0 X

Ma come fai a sapere a quando risalgono le fatture? in base a cosa le scegli? Questa è la domanda.

Se devi selezionare le fatture di un singolo cliente ok, riesco a concepirlo, un cliente ha fatture in giorni/mesi/anni differenti ed è una cosa, le fatture vengono selezionate per cliente E per data.

La domanda principale, in sostanza, è: come selezioni le fatture?

risposto 9 anni fa
LonelyWolf
X 0 X

Ma come fai a sapere a quando risalgono le fatture? in base a cosa le scegli? Questa è la domanda.

Se devi selezionare le fatture di un singolo cliente ok, riesco a concepirlo, un cliente ha fatture in giorni/mesi/anni differenti ed è una cosa, le fatture vengono selezionate per cliente E per data.

La domanda principale, in sostanza, è: come selezioni le fatture?

Pensavo che questo punto fosse acquisito ormai.

questa è la pagina con i moduli dal quale inserisco i dati per le ricerche:

<html>
<head>
<title>Ricerca in Database</title>
<script language="javascript" src="cal2.js">
/*
Xin's Popup calendar script-  Xin Yang (http://www.yxscripts.com/)
Script featured on/available at http://www.dynamicdrive.com/
This notice must stay intact for use
*/
</script>
<script language="javascript" src="cal_conf2.js"></script>
</head>

<body>
<b>Ricerca Fatture</b><br><br>
<form name="sampleform" onkeyup="return false;"method="post" action="trova.php">
  <table border="0" width="28%" cellspacing="2" cellpadding="2">
   <tr>
    <td width="1%"><b>Cliente</b></td>
    <td width="48%"> 
  <select name="clie" size="1">
     <option></option>
        <?
        $db = mysql_connect('localhost', 'root', '') or die(mysql_error());
        @mysql_select_db('fattura', $db) or die(mysql_error());

        $query = mysql_query('SELECT * FROM clientidb ORDER BY cognome', $db);
        while( $row = mysql_fetch_array($query) )
        {
            echo "<option value=\"" . $row['id_user'] . "\">" ."<b>". $row['cognome'] ."</b>". ' ' . $row['nome'] . "</option>\n";
          
        }
        ?>
    </select></td>
  <tr>
    <td width="1%"><b>Data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b></td>
    <td width="28%"><input type="text" name="firstinput" size=20> <small><a href="javascript:showCal('Calendar1')">Data dal</a></small></td>
    <td width="1%">&nbsp;&nbsp;&nbsp;</td>
    <td width="28%"><input type="text" name="secondinput" size=20> <small><a href="javascript:showCal('Calendar2')">Data al</a></small</td>
  </tr>
  <tr>
    <td><b>Lista</b>
    <input type="radio" name="button" value="lista" checked/></td>
   <td><b>Stat</b>
    <input type="radio" name="button" value="stat"/></td>
 </tr>

  <tr><td width="48"><input type="submit" value="Invia" name="B1"></td><td><input type="reset" value="Reimposta dati" name="B2">
 </td>
</tr>
</table>
</form>
</body>
</html>

Come puoi vedere posso selezionare e fare ricerche su un certo cliente (richiamati dal db e inseriti in un elenco a discesa) e relativamente a una certa data, ma posso anche non selezionare niente e lasciare i campi vuoti in questo caso ottengo la lista completa (o meglio una lista in cui sono presenti nome, cognome, data e il link per aprire la pagina con i dati completi della fattura) di tutti  i documenti presenti nel db una volta inviati i dati alla pagina trova.php

Questa la semplice query (il caso che sto prendendo in esame per esempio, ma ormai avrai capito che è indifferente per lo scopo) e il codice che interroga il db e mi da la lista

nel caso non inserisco nessun dato nei campi di ricerca della pagina sopra:

$scelta = $_POST['button'];
if ($scelta == "lista"){
........
......

if (($_REQUEST['clie']=="")&&($_REQUEST['firstinput']=="")&&($_REQUEST['secondinput']==""))
   {
 $tutto = "SELECT * FROM fatture ORDER BY data";
     }

.......

.........


$query = mysql_query ($tutto,$link)
 or die ("Non riesco ad eseguire la richiesta $tutto");
 $totr=mysql_num_rows($query);
 echo "<b>Numero fatture trovate: <font color=\"#FF0000\" size=\"5\"> ".$totr." </font></b> <a href=\"ricerca.php\">Ritorna al modulo</a><br><br>
 

<table border=1 width=\"600\" cellspacing=\"0\" cellpadding=\"5\"><tr>
  <td width='80' align='center'><b>Fattura N°</b></td>
  <td width='150' align='center'><b>Data</b></td>
  <td width='250' align='center'><b>Cliente</b></td>
  <td width='120'align='center'><b>Dettagli</b></td></tr></table><br>"; 

while( $row = mysql_fetch_array($query) )
   {
   $cust = $row["id_fattura"];
   
   $querycust = mysql_query("SELECT * FROM clientidb JOIN fatture ON clientidb.id_user=fatture.id_cliente
   WHERE fatture.id_fattura = $cust",$link);
   
   while( $rowcust = mysql_fetch_array($querycust) )
{
   $cognome_cliente = $rowcust["cognome"];
   $nome_cliente    = $rowcust["nome"];
  }
?>
<html>
<script type="text/javascript">
function PopupCentrata(dest_url) {
    var w = 600;
    var h = 800;
    var l = Math.floor((screen.width-w)/2);
    var t = Math.floor((screen.height-h)/2);
    window.open(dest_url, "nome_finestra", "width=" + w + ",height=" + h + ",top=" + t + ",left=" + l);
}
</script>  
</html>
<?   
echo "
<table border=0 width=\"600\" cellspacing=\"3\"><tr>
  <td width='80' align='right'><b>$row[numero_fatt]</b></td>
  <td width='150' align='center'><b>".date("d/m/y", $row['data'])."</b></td>
  <td width='125' align='left'><b>&nbsp; $cognome_cliente</b></td>
  <td width='125' align='left'><b>&nbsp; $nome_cliente</b></td>
  <td width='120'align='center'><b><a href=\"#\" onClick=\"PopupCentrata('filmato.php?variabile=$cust')\">Visualizza</a></b></td>
  </tr>
  </table>"; 

else {

//grafico
...
 }

Certo il codice sopra non riguarda il grafico ma questo è il modo in cui seleziono le fatture dal db e faccio le query. Adesso in base a questo tipo di selezioni invece di ottenere la lista con i link a ogni fattura devo ottenere i grafici secondo quando ho spiegato sopra nei miei precedenti post.

Penso che tu abbia capito pure a cosa servono i radio button. Se seleziono uno ottengo la lista (vedi IF)

altrimenti (else) il codice del grafico sul quale stiamo lavorando.

Grazie e ciao Lony.

risposto 9 anni fa
frankphp
X 0 X
Pensavo che questo punto fosse acquisito ormai.

Acquisito è un parolone, vedendo il codice dei post di tutti, le mie applicazioni in corso, è difficile ricordarsi tutto. :D

cmq, arriviamo al punto, dunque le fatture sono selezionate per codice cliente e per periodo, mi sembra di capire.

quindi la query dovrebbe essere tipo questa:

select * from fatture where (id_cliente = $_REQUEST['clie']) and (data betwen $_REQUEST['firstinput'] and $_REQUEST['secondinput']) order by data;

così seleziona tutte le fatture del cliente nel periodo.

A questo punto hai 2 possibilità per ottenere i totali:

1 - ciclare il risultato di questa query sommando le date

2 - fare un ciclo che scorra ogni giorno del periodo e sommare direttamente nella query, cambiandola + o meno così:

for ($data= $_REQUEST['firstinput'];$data<=$_REQUEST['secondinput'];$data+=86400) {

/*

select sum(totale) from fatture where (id_cliente = $_REQUEST['clie']) and (data = $data) order by data;

*/

}

nel caso volessi chiederlo, 86400 equivale a 1 giorno in secondi (60s*60m*24h).

risposto 9 anni fa
LonelyWolf
X 0 X
Pensavo che questo punto fosse acquisito ormai.

quindi la query dovrebbe essere tipo questa:

select * from fatture where (id_cliente = $_REQUEST['clie']) and (data betwen $_REQUEST['firstinput'] and $_REQUEST['secondinput']) order by data;

così seleziona tutte le fatture del cliente nel periodo.

A questo punto hai 2 possibilità per ottenere i totali:

1 - ciclare il risultato di questa query sommando le date

2 - fare un ciclo che scorra ogni giorno del periodo e sommare direttamente nella query, cambiandola + o meno così:

for ($data= $_REQUEST['firstinput'];$data<=$_REQUEST['secondinput'];$data+=86400) {

/*

select sum(totale) from fatture where (id_cliente = $_REQUEST['clie']) and (data = $data) order by data;

*/

}

nel caso volessi chiederlo, 86400 equivale a 1 giorno in secondi (60s*60m*24h).

Rimanendo sospesa la questione dei diversi grafici per ogni mese, mi sfugge adesso come, una volta sommati i totali per ogni giorno, visualizzarli questi diversi totali per i giorni del mese. Devo fare come l'array sopra?

Grazie e ciao

risposto 9 anni fa
frankphp
X 0 X

Potresti anche usare l'array come sopra, prima lo riempi con i risultati delle query e poi lo scorri per creare il grafico.

risposto 9 anni fa
LonelyWolf
X 0 X
Potresti anche usare l'array come sopra, prima lo riempi con i risultati delle query e poi lo scorri per creare il grafico.

oggi ho un po' di tempo, vediamo cosa ne esce fuori.

Il fatto è che sembra molto difficile mettere insieme tutti pezzi.

Sapere quanti e quali mesi sono interessati dalla query, sommare i totali per ogni giorno dei vari mesi, creare i grafici uno per ogni mese...ecc ecc

Grazie

risposto 9 anni fa
frankphp
X 0 X

c'è qualcosa che non ho capito.

Ho buttato giù un po' di codice per far delle prove:

$db = mysql_connect('localhost', 'root', '') or die(mysql_error());
@mysql_select_db('fattura', $db) or die(mysql_error());

$query3 = "SELECT data FROM fatture ORDER BY data ASC LIMIT 1";
$query2 = "SELECT data FROM fatture ORDER BY data DESC LIMIT 1";

$result3 = mysql_query($query3);
while($rot3 = mysql_fetch_array($result3)){
$num = $rot3["data"];

 $mese3 = date("m", $rot3["data"]);
 
}

$result = mysql_query($query2);
while($rot = mysql_fetch_array($result)){
$num2 = $rot["data"];
 
 $mese = date("m", $rot["data"]);
}
echo $num."<br>";
echo $num2."<br><br>";

echo $mese3."<br>";
echo $mese;

for ($data= $num; $data<=$num2;$data+=86400) {

$som = mysql_query("SELECT * sum(totale) from fatture data = $data order by data",$db);
}

In pratica ho richiamato il primo e l'ultimo inserimento nel db dei documenti e poi ho ciclato giorno per giorno

(quindi, in questo caso niente ricerca fatture per cliente e per intervallo di tempo, ma semplicemente richiamo tutti i documenti per sommarne i totali x giorno), ho fatto qualche echo di prova all'inizio più per curiosità verso altri aspetti relativi alla data

La cosa adesso che mi sfugge e come inserire i risultati della query $som nell'array; non ho mai usato sum.

Sono abituato ad usare un while e il mysql_fetch_array che mi richiamano i valori dei vari campi del record come ad esempio (il codice sotto non ha niente  che fare con il grafico..è solo un esempio che avevo da parte):

$db = mysql_connect('localhost', 'root', '') or die(mysql_error());
@mysql_select_db('fattura', $db) or die(mysql_error());

$risultato = mysql_query("SELECT * FROM fatture",$db);
 
$graphValues=array();
while($result = mysql_fetch_array($risultato)){
$graphValues[] = $result['totale'];
}
$righe = mysql_affected_rows();

for ($i = 0; $i <= $righe; $i++) {
echo $graphValues[$i]."<br>";
}

Ho provato a fare in maniera simile ma ho solo messaggi di errore.

Come inserisco i valori sommati dalla query nell'array e li visualizzo insomma, Grazie

risposto 9 anni fa
frankphp
modificato 9 anni fa
X 0 X

Allora vediamo un po' che succede, il ciclo deve essere + o - così:

$totali_mese = array();
$i_day=0;
for ($data= $num; $data<=$num2;$data+=86400) {

$result_totale = mysql_query("SELECT * sum(totale) as totale_oggi from fatture data = $data;",$db);
if (mysql_num_rows($result_totale)){
   $tmp = mysql_fetch_array($result_totale);
   $totali_mese[$i_day] = $tmp["totale_oggi"];
}
else {
     $totali_mese[$i_day] = 0;
}
$i_day++;
}

Alla fine in $totali_mese[0] avrai il totale primo giorno e così via.
risposto 9 anni fa
LonelyWolf
X 0 X

Allora vediamo un po' che succede, il ciclo deve essere + o - così:

$totali_mese = array();
$i_day=0;
for ($data= $num; $data<=$num2;$data+=86400) {

$result_totale = mysql_query("SELECT * sum(totale) as totale_oggi from fatture data = $data;",$db);
if (mysql_num_rows($result_totale)){
   $tmp = mysql_fetch_array($result_totale);
   $totali_mese[$i_day] = $tmp["totale_oggi"];
}
else {
     $totali_mese[$i_day] = 0;
}
$i_day++;
}

Alla fine in $totali_mese[0] avrai il totale primo giorno e così via.

visualizzo un messaggio di errore:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in D:\Programmi\xampp\htdocs\fattura\prova.php on line 35

relativo a questa riga:

if (mysql_num_rows($result_totale)){

Forse c'è qualche errore nel codice ma io non so quale, scusami.

Grazie ancora

risposto 9 anni fa
frankphp
X 0 X

ho modificato così:

$totali_mese = array();
$i_day=0;
for ($data= $num; $data<=$num2; $data+=86400) {

$result_totale = mysql_query("SELECT SUM(totale) as totale_oggi from fatture where data = $data",$db);
if (mysql_num_rows($result_totale)){
   $tmp = mysql_fetch_array($result_totale);
   $totali_mese[$i_day] = $tmp["totale_oggi"];
  }
  else {
     $totali_mese[$i_day] = 0;
}
$i_day++;
}
count($totali_mese);
$totins = count($totali_mese);
echo $totins."<br><br>";

Non ricevo più messaggi di errore e contando gli elementi dell'array risultano 34 inserimenti ed in effetti èi giusto visto che tra la data della prima fattura e l'ultima ci sono 34 gg di differenza.

Provando a stamparne i risultati:

for ($i = 0; $i <= $totins; $i++) {
echo $totali_mese[$i]."<br>";
}

mi stampa solo un numero: il primo importo della fattura ($totali_mese[0]).

Ho provato ad inserire manualmente l'indice dell'array e a stamparlo es:

echo $totali_mese[4],

echo $totali_mese[34] ecc ecc

ma non mi stampa niente.

Tra una data ed un altra possono non esserci inserimenti ma io mi aspettavo che mi stampasse zero per quel giorno invece niente.

Quale è adesso il prblema?

Grazie

risposto 9 anni fa
frankphp
X 0 X

Non so se dipenden da quello, ma sarebbe il caso di aggiungere:

mysql_free_result($result_totale);

dentro l'if dopo questa riga:

$totali_mese[$i_day] = $tmp["totale_oggi"];
risposto 9 anni fa
LonelyWolf
X 0 X

Non so se dipenden da quello, ma sarebbe il caso di aggiungere:

mysql_free_result($result_totale);

dentro l'if dopo questa riga:

$totali_mese[$i_day] = $tmp["totale_oggi"];

Non è cambiato niente.

Cosa può essere allora?

Grazie

risposto 9 anni fa
frankphp
X 0 X

Metti così:

for ($i = 0; $i <= $totins; $i++) {
echo "->".$totali_mese[$i]."<br>";
}

In questo modo vediamo se effettivamente i valori intermedi sono vuoti o se hanno 0, ogni riga visualizzata avrà almeno "->"

E nei giorni tra la prima e l'ultima ci sono fatture?

risposto 9 anni fa
LonelyWolf
X 0 X

Metti così:

for ($i = 0; $i <= $totins; $i++) {
echo "->".$totali_mese[$i]."<br>";
}

In questo modo vediamo se effettivamente i valori intermedi sono vuoti o se hanno 0, ogni riga visualizzata avrà almeno "->"

E nei giorni tra la prima e l'ultima ci sono fatture?

stampa il primo valore e il resto 34 "->"

Grazie

risposto 9 anni fa
frankphp
X 0 X

...Forse ho capito!

Il problema dovrebbe essere nella data ($data).

Ci sentiamo domani.

risposto 9 anni fa
frankphp
X 0 X

Buongiorno!

Come dicevo, penso di aver capito dov'è il problema.

Si tratta della data.

Il valore numerico della variabile $data (nel ciclo e nella query) è di tipo timestamp.

Il primo valore è 1170617190 che corrisponde al 04/02/07.

Adesso ci aspettiamo che la query sommi tutti i totali dei documenti di quel giorno (04/02) ma nel db essendo

la data salvata in timestamp anche se il successivo documento è del 04/02 in timestamp è riportata come

1170617232 che non è la stessa cosa del primo valore $data, ecco perchè visualizzo poi solo il totale del primo documento la cui data effettivamente corrisponde al primo valore di $data.

Aggiungendo a ogni passaggio del ciclo 86400, come suggerito da Lony, salto certo al giorno successivo, più o meno, ma il valore numerico non è detto che corrisponda effettivamente al timestamp dei documenti di quel giorno (sarebbe un caso eccezionale poi se si verificasse una cosa del genere).

Il problema adesso è cosa faccio?

Dovrei sbatterci la testa risolvendo la cosa tenendo conto di quanto sopra, oppure, pensavo di aggiungere un campo di tipo date o datetime nella tabella del DB (non vorrei sostituire il campo int dove è registrato il timestamp con il nuovo di tipo date altrimenti dovrei rimettere mano a molte parti del codice del progetto..e non ne ho proprio voglia :)), aggiungere dal phpmyadmin manualmente i valori corrispondenti del tipo date o datetime dei documenti già registrati e poi aggiungere dove necessario qualche riga di codice per salvare la data dei documenti nel db oltre nel valore timestamp anche in date nel campo aggiuntivo. Non so ancora

come si fa, ma aspetto vostri pareri.

Grazie

risposto 9 anni fa
frankphp
X 0 X

'sera!

Allora, ragazzi.

In attesa, se ne vale la pena, di soluzioni inerenti all'uso del formato timestamp, ho aggiunto, nel frattempo, un campo di tipo DATE che ho nominato "giorno" alla tabella "fatture" del db

ho aggiunto la data della fattura del tipo:

2007-02-04

Adesso volevo chiedere come è possibile operare su questo tipo di data, tenendo conto di quanto ho detto sopra, cioè in pratica come ciclo giorno per giorno con questo tipo di formato come facevo sul formato timestamp aggiungendo il valore 86400 (corrispondente ad un giorno) anche se, come spiegato, la procedura non era corretta.

GRazie

risposto 9 anni fa
frankphp
modificato 9 anni fa
X 0 X

aspettavo un consiglio :'(

risposto 9 anni fa
frankphp
X 0 X

io sono rientrato solo oggi in ufficio e a casa ancora niente connettività, facevo prima a cambiare operatore!

Venendo al punto, si potresti anche trattare la data in quel modo e per ciclare i giorni è un po' meno semplice.

La data messa come timestamp prima probabilmente la generavi utilizzando anche ore/minuti/secondi del momento in cui veniva inserita la fattura anzichè mantenere sempre ore/minuti/secondi fissi, quindi la query doveva essere leggermente differente:

$datainizio = mktime (0,0,0,mese,giorno,anno);
$datafine = mktime (23,59,59,mese,giorno,anno);

$query = ""SELECT * sum(totale) as totale_oggi from fatture where data between $datainizio and $datafine;"
// ciclo, esecuziione query, ecc.ecc.

Invece per ciclare i giorni con la data messa nel secondo modo secondo me conviene che la trasformi in timestamp, aggiungi un giorno in secondi (86400) e la ritrasformi nel formato precedente così non devi controllare il numero del giorno/mese/anno.

risposto 9 anni fa
LonelyWolf
modificato 9 anni fa
X 0 X

Ciao ragazzi sono nuovo di questo forum! O0 :2funny:

Ho bisogno di aiuto! devo inviare tramite un collegamento ipertestuale ad una pagina, un array (di valori numerici serializzato con serialize). Arrivato a questa pagina io mi aspetterei di ricevere l'array e di "unserializzarlo" per poi fare l'istogramma. Il problema è ke ciò nn avviene, cioè l'array nel secondo script è come se nn fosse mai arrivato :'(. se volete darmi una mano sono disposto a postarvi le due pagine php. Confido in voi. Ciao ciao :bye:

risposto 9 anni fa
peppebrioscia
X 0 X

Ciao ragazzi sono nuovo di questo forum! O0 :2funny:

Ho bisogno di aiuto! devo inviare tramite un collegamento ipertestuale ad una pagina, un array (di valori numerici serializzato con serialize). Arrivato a questa pagina io mi aspetterei di ricevere l'array e di "unserializzarlo" per poi fare l'istogramma. Il problema è ke ciò nn avviene, cioè l'array nel secondo script è come se nn fosse mai arrivato :'(. se volete darmi una mano sono disposto a postarvi le due pagine php. Confido in voi. Ciao ciao :bye:

Sarebbe stato meglio che creavi un nuovo topic, comunque come invii da una pagina all'altra l'array? nella seconda pagina la recuperi correttamente (invio get $_GET, invio post $_POST)?

risposto 9 anni fa
LonelyWolf
X 0 X

TI FACCIO VEDERE SUBITO;

<?PHP include("membersonly.inc.php"); ?>

<?PHP

$url1 = $HTTP_GET_VARS["url"];

$orario = $HTTP_GET_VARS["orario"];

$query = "Select * from ping where url='$url1'";

$result = mysql_query($query);

$muero=mysql_num_rows ($result);

$pacchettipersi=0;

$pacchettiricevuti=0;

$maxt=0;

$mint=100000;

$sommatot=0;

$minimograf=array();

for ($i=0;$i<$muero;$i++)

   {$sommatot+=$somma;

    $pacchettipersi+=$persi;

    $pacchettirivecuti+=$ric;

    if($row = mysql_fetch_array($result)){

                echo "$row[primo]";

                echo"$row[secondo]";

               echo"$row[terzo]";

    echo"$row[quarto]";

    $max=0;$min=100000;   $somma=0;$elemento=0;$cento=0;$duecento=0;$trecento=0;$cinquecento=0;

   for ($j=1;$j<5;$j++)

              {if ($row[$j]<99999)   

{$somma+=$row[$j];

                               $elemento+=1;

                               $media=$somma/$elemento;   

                               if ($row[$j]>$max)   {$max=$row[$j];}

                               if ($row[$j]<$min)   {$min=$row[$j];}

                               if ($row[$j]<=100)   {$cento=$row[$j];}

                               if (($row[$j]>100)&&($row[$j]<=200))   {$duecento=$row[$j];}

                               if (($row[$j]>200)&&($row[$j]<=500))   {$trecento=$row[$j];}

                               if ($row[$j]>500)   {$cinquecento=$row[$j];}}

                           }

                     if ($min>99999) {$min=0;echo $min;} else {echo $min;}

                     if ($max>$maxt){$maxt=$max;}

                     if ($min<$mint){$mint=$min;}

                     //echo $minimograf[]=$min;

                     if ($min<>0) {array_push($minimograf,$min);}

                  ?> </font>ms</font></strong></div></td>  </tr>

                    <tr bordercolor="#00FF00" bgcolor="#FFFF66">

            <td bordercolor="#0099CC" bgcolor="#99FF99"><p align="center"><font color="#FF0000"><strong><font face="Arial, Helvetica, sans-serif">Massimo<br>

                   </font></strong></font></p></td>

             <td bordercolor="#0099CC" bgcolor="#99FF99"><div align="center"><strong><font color="#FF0000"><font face="Arial, Helvetica, sans-serif">

                  <?PHP echo $max; array_push($massimograf,$max);?> </font>ms</font></strong></div></td>  </tr>  <tr bordercolor="#00FF00" bgcolor="#FFFF66">

             <td bordercolor="#0099CC" bgcolor="#99FF99"><p align="center"><font color="#FF0000"><strong><font face="Arial, Helvetica, sans-serif">Media<br>

                   </font></strong></font></p></td>

             <td bordercolor="#0099CC" bgcolor="#99FF99"><div align="center"><strong><font color="#FF0000"><font face="Arial, Helvetica, sans-serif">

                  <?PHP    if ($elemento==0){echo 0;}

                     else {echo $media;}?> </font>ms</font></strong></div></td>  </tr>   <tr bordercolor="#00FF00" bgcolor="#FFFF66">

             <td bordercolor="#0099CC" bgcolor="#99FF99"><p align="center"><font color="#FF0000"><strong><font face="Arial, Helvetica, sans-serif">Persi<br>

                   </font></strong></font></p></td>

             <td bordercolor="#0099CC" bgcolor="#99FF99"><div align="center"><strong><font color="#FF0000"><font face="Arial, Helvetica, sans-serif">

                  <?PHP echo $persi=persi($row[primo],$row[secondo],$row[terzo],$row[quarto]); ?> </font>pacchetti</font></strong></div></td>  </tr>

                    <tr bordercolor="#00FF00" bgcolor="#FFFF66">

             <td bordercolor="#0099CC" bgcolor="#99FF99"><p align="center"><font color="#FF0000"><strong><font face="Arial, Helvetica, sans-serif">Ricevuti<br>

                   </font></strong></font></p></td>

             <td bordercolor="#0099CC" bgcolor="#99FF99"><div align="center"><strong><font color="#FF0000"><font face="Arial, Helvetica, sans-serif">

                  <?PHP echo $ric=4-$persi;?> </font>pacchetti</font></strong></div></td>  </tr>

                    <tr bordercolor="#00FF00" bgcolor="#FFFF66">

      <td bordercolor="#0099CC" bgcolor="#99FF99"><p align="center"><font color="#FF0000"><strong><font face="Arial, Helvetica, sans-serif">Percentuale di successo <br>

                        </font></strong></font></p></td>

              <td bordercolor="#0099CC" bgcolor="#99FF99"><div align="center"><strong><font color="#FF0000"><font face="Arial, Helvetica, sans-serif">

                  <?PHP echo $perc=($ric/4)*100; echo"%";  ?> </font></font></strong></div></td>   </tr></table>         <p><?PHP }else{echo "<title>Errore!</title><meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\"></head><body>Errore, non                                                       riesco a vedere informazioni per il sito.<br><a href=\"user.php?action=more&username=$url1\">Torna indietro</a>";}}

                  for ($i=0;$i<$muero;$i++)

                  {echo $minimograf[$i];echo "\n";}

                  echo "<br>";

                  for ($i=0;$i<$muero;$i++)

                  {echo $massimograf[$i];echo "\n";//echo '<br>';

                  }?>

                  <?php echo $stringa =serialize($minimograf);

                  echo $mass=max($minimograf);echo $minimo=min($minimograf);

            echo "<a href='Untitled-1.php?m=$minimo&s=$mass&action=$stringa' title='Grafico' target='_blank'>Grafico</a>";  ?>

                  <table width="100%" border="0" cellpadding="0" cellspacing="0">

                        <tr bgcolor="#FF0000">

                        <td><div align="center"><strong><font color="#000000" size="+2">STATISTICHE</font></strong></div></td>

                        <td><div align="center"><font color="#000000"><strong><font size="+2">VALORI</font></strong></font></div></td> </tr>

                        <tr bordercolor="#00FF00" bgcolor="#0000FF">

                        <td bordercolor="#0099CC"><p align="center"><font color="#000000"><strong><font face="Arial, Helvetica, sans-serif">Minimo assoluto<br>

                        </font></strong></font></p></td>

                        <td bordercolor="#0099CC"><div align="center"><font color="#000000" size="+1" face="Courier New, Courier, monospace"><strong>

                        <?   if ($mint==100000){echo 0;}else{echo $mint;}   ?> ms</strong></font></div></td>  </tr><tr bordercolor="#00FF00" bgcolor="#0000FF">

                        <td bordercolor="#0099CC"><p align="center"><font color="#000000"><strong><font face="Arial, Helvetica, sans-serif">Massimo assoluto <br>

                        </font></strong></font></p></td>

                        <td bordercolor="#0099CC"><div align="center"><font color="#000000" size="+1" face="Courier New, Courier, monospace"><strong>

                  <? echo $maxt;?> ms</strong></font></div></td></tr><tr bordercolor="#00FF00" bgcolor="#0000FF">

                  <td bordercolor="#0099CC"><p align="center"><font color="#000000"><strong><font face="Arial, Helvetica, sans-serif">Media<br>

                        </font></strong></font></p></td>

                        <td bordercolor="#0099CC"><div align="center"><font color="#000000" size="+1" face="Courier New, Courier, monospace"><strong>

                        <?  $pacchettirivecuti+=$ric;               

                     $sommatotale=$somma+$sommatot;

                     if ($pacchettirivecuti==0){echo 0;}

                     else {echo $mediatotale=$sommatotale/$pacchettirivecuti;}?> ms</strong></font></div></td></tr>

                         <tr bordercolor="#00FF00" bgcolor="#0000FF">

                         <td bordercolor="#0099CC"><p align="center"><font color="#000000"><strong><font face="Arial, Helvetica, sans-serif">Persi<br>

                         </font></strong></font></p></td>

                         <td bordercolor="#0099CC"><div align="center"><font color="#000000" size="+1" face="Courier New, Courier, monospace"><strong>

                   <? echo $pacchettipersi+=$persi;?> pacchetti</strong></font></div></td></tr><tr bordercolor="#00FF00" bgcolor="#0000FF">

                   <td bordercolor="#0099CC"><p align="center"><font color="#000000"><strong><font face="Arial, Helvetica, sans-serif">Ricevuti<br>

                         </font></strong></font></p></td>

                         <td bordercolor="#0099CC"><div align="center"><font color="#000000" size="+1" face="Courier New, Courier, monospace"><strong>

                   <? echo $pacchettirivecuti   ?> pacchetti</strong></font></div></td></tr>

                   <tr bordercolor="#00FF00" bgcolor="#0000FF">

                        <td bordercolor="#0099CC"><p align="center"><font color="#000000"><strong><font face="Arial, Helvetica, sans-serif">Percentuale di successo <br>

                         </font></strong></font></p></td>

                         <td bordercolor="#0099CC"><div align="center"><font color="#000000" size="+1" face="Courier New, Courier, monospace"><strong>

                         <? $totpac=$pacchettipersi+$pacchettirivecuti;

                      echo $percentualesuccesso=($pacchettirivecuti/$totpac)*100;?>%</strong></font></div></td></tr>

                        </table>

                  </body> </html>

                  </p> </body>

</html>

risposto 9 anni fa
peppebrioscia
X 0 X

ho modificato il codice precedente

risposto 9 anni fa
peppebrioscia
modificato 9 anni fa
X 0 X

ho creato un nuovo topic:

http://www.phpnews.it/forum/index.php?topic=2078.new

help me!

risposto 9 anni fa
peppebrioscia
X 0 X

io sono rientrato solo oggi in ufficio e a casa ancora niente connettività, facevo prima a cambiare operatore!

Venendo al punto, si potresti anche trattare la data in quel modo e per ciclare i giorni è un po' meno semplice.

La data messa come timestamp prima probabilmente la generavi utilizzando anche ore/minuti/secondi del momento in cui veniva inserita la fattura anzichè mantenere sempre ore/minuti/secondi fissi, quindi la query doveva essere leggermente differente:

$datainizio = mktime (0,0,0,mese,giorno,anno);
$datafine = mktime (23,59,59,mese,giorno,anno);

$query = ""SELECT * sum(totale) as totale_oggi from fatture where data between $datainizio and $datafine;"
// ciclo, esecuziione query, ecc.ecc.

Invece per ciclare i giorni con la data messa nel secondo modo secondo me conviene che la trasformi in timestamp, aggiungi un giorno in secondi (86400) e la ritrasformi nel formato precedente così non devi controllare il numero del giorno/mese/anno.

 :-\  scusami, ma adesso ho le idee ancora più confuse.

La data timestamp la generavo con time() e poi la salvavo nel campo.  Non sapevo che è possibile mantenere ore minuti e secondi fissi; se è così posso sempre cambiarle manualmente e poi fare la query come prima.

Ma come si fa?

Il campo date che ho aggiunto è solo per trovare un'alternativa ma posso benissimo cancellarlo

e rimanere solo con il campo int (data) per il timestamp

questa non l'ho capita:

$datainizio = mktime (0,0,0,mese,giorno,anno);

$datafine = mktime (23,59,59,mese,giorno,anno);

$query = ""SELECT * sum(totale) as totale_oggi from fatture where data between $datainizio and $datafine;"

// ciclo, esecuziione query, ecc.ecc.

Nel caso che sto prendendo in esame non indico una data di inizio e una finale nel form ma per avere la lista completa richiamo direttamente la prima data di inserimento e l'ultima (quindi già in timestamp) e poi dovrei ciclare giorno per giorno per sommare i totali delle fatture per ogni giorno di appartenenza.

Nel caso da te adesso suggerito con between $datainizio and $datafine, non sommo tutti i totali di tutti i giorni compresi nell'intervallo, o mi sbaglio.

Grazie lony e ciao.

PS: ho provato un po' ad operare con le date nel campo "giorno" che ho aggiunto di tipo DATE

(quindi con la data del tipo 2007-04-23 e non in timestamp) ma non riesco a richiamarla e a stamparla sulla pagina, perchè?

risposto 9 anni fa
frankphp
modificato 9 anni fa
X 0 X

Ora te la spiego:

generando il timestamp con time() hai data e ora del momento in cui la generi, fiun qui lo sai anche tu, nel caso specifico il campo data delle fatture conteneva si giorno mese anno uguali per tutte le fatture dello stesso giorno, ma anche ore minuti secondi differenti a secondo da quando veniva inserita la fattura; per mantenerli fissi avresti dovuto generare il timestamp con

mktime (0,0,0,date("m"),date("d"),date("Y));

in questo modo il timestamp di tutte le fatture dello stesso giorno sarebbe stato identico e avresti fatto la query con il codice di prima.

Avendolo impostato con time() devi invece cercare tutte le fatture che hanno come data un valore compreso tra le 0:0:0 di gg/mm/aaaa (datainizio) e le 23:59:59 di gg/mm/aaaa (datafine).

E' chiaro ora il discorso?

Ovviamente rimane comunque il ciclo delle date che diventa:

for ($datainizio= $num; $datainizio<=$num2; $datainizio+=86400) {
// tutto il codice di prima ma con la nuova query
$datafine += 86400;
} //chiusura del ciclo
risposto 9 anni fa
LonelyWolf
X 0 X

Ora te la spiego:

generando il timestamp con time() hai data e ora del momento in cui la generi, fiun qui lo sai anche tu, nel caso specifico il campo data delle fatture conteneva si giorno mese anno uguali per tutte le fatture dello stesso giorno, ma anche ore minuti secondi differenti a secondo da quando veniva inserita la fattura; per mantenerli fissi avresti dovuto generare il timestamp con

mktime (0,0,0,date("m"),date("d"),date("Y));

in questo modo il timestamp di tutte le fatture dello stesso giorno sarebbe stato identico e avresti fatto la query con il codice di prima.

Avendolo impostato con time() devi invece cercare tutte le fatture che hanno come data un valore compreso tra le 0:0:0 di gg/mm/aaaa (datainizio) e le 23:59:59 di gg/mm/aaaa (datafine).

E' chiaro ora il discorso?

Ovviamente rimane comunque il ciclo delle date che diventa:

for ($datainizio= $num; $datainizio<=$num2; $datainizio+=86400) {
// tutto il codice di prima ma con la nuova query
$datafine += 86400;
} //chiusura del ciclo

Capito + o -!!.

In ogni caso ho preferito cancellare tutti i documenti e inserirne di nuovi con il timestamp senza ore e minuti.

Ho modificato qualche volta la data del sistema per inserire date vecchie. Poi ho modificato leggermente il codice della pagina di prova (ci sono qualche echo di verifica):

$db = mysql_connect('localhost', 'root', '') or die(mysql_error());
@mysql_select_db('fattura', $db) or die(mysql_error());

$query3 = "SELECT data FROM fatture ORDER BY data ASC LIMIT 1";
$query2 = "SELECT data FROM fatture ORDER BY data DESC LIMIT 1";

$result3 = mysql_query($query3);
while($rot3 = mysql_fetch_array($result3)){
$num = $rot3["data"];

 $mese3 = date("m", $rot3["data"]);
}

$result = mysql_query($query2);
while($rot = mysql_fetch_array($result)){
$num2 = $rot["data"];
 
 $mese = date("m", $rot["data"]);
}
echo $num."<br>";
echo $num2."<br><br>";

echo $mese3."<br>";
echo $mese."<br><br>";

$ogg= mktime(0,0,0,date("m"),date("d"),date("Y"));
echo $ogg."<br><br>";

$giorno= date("d", $num);
echo $giorno."<br><br>";

$totali_mese = array();
$i_day=0;
for ($data= $num; $data<=$num2; $data+=86400) {

$result_totale = mysql_query("SELECT SUM(totale) as totale_oggi from fatture where data = $data",$db);
   while ($tmp = mysql_fetch_array($result_totale)){
   $totali_mese[$i_day] = $tmp["totale_oggi"];
  }
$i_day++;
}
count($totali_mese);
$totins = count($totali_mese);
echo $totins."<br><br>";

for ($i = 0; $i <= $totins; $i++) {
echo "->".$totali_mese[$i]."<br>";
}

Adesso la query funziona. Però c'è un problema di cui non capisco la causa.

Quando stampo i dati dell'array ci sono i totali solo fino ad una certa data.

Stampo questo:

1170802800

1176242400

02

04

1177711200

07

63

->141.00480270386

->

->

->

->

->

->

->

->

->

->

->

->

->

->

->

->167.83199691772

->

->

->

->

->

->

->

->

->

->

->

->

->

->

->

->

->

->

->

->

->26.39999961853

->

->

->

->

->

->

->

->

->

->

->

->

->

->

->

->

->

->

->

->

->

->

->

->

->

->

Nella tabella fatture del db invece c'è questo:

id_fattura -- numero_fatt --  id_cliente --  totale -- data--- giorno //giorno è nel formato DATE, che non utilizzo

1---1---3 ---46.31---1170802800---2007-02-07

2---2---4---53.9268---1170802800---2007-02-07

3---     3---     4---      40.768--- 1170802800---    2007-02-07

4---    4---    14---     147.032---1172185200--- 2007-02-23

5---    5---    3---     20.8---     1172185200---     2007-02-23

6---    6---    11---     26.4---     1173999600---     2007-03-16

7---    7---     12---     80.496---1175205600---     2007-03-30

8---    8---     3---     62.4---     1175205600---     2007-03-30

9---    9---     12---     11---     1175464800---     2007-04-02

10---    10---     14---     85.972---1176242400---    2007-04-11

Spero che sia chiaro.

In pratica stampo i totali x giorno fino al 2007-03-16.

Perchè?

Grazie

risposto 9 anni fa
frankphp
X 0 X

per fare tt questo in linux cosa devo fare? :D

risposto 9 anni fa
peppebrioscia
X 0 X

rettifico... ho creato un topic (2085) per il problema dei grafici su linux. ciao ciao

risposto 9 anni fa
peppebrioscia
X 0 X

Ho ricreato l'ambiente con i tuoi dati e fatto un paio di test:

le fatture hanno come ora le 12:00:00 fino al 25/03/2007 dal 26/03/2007 hanno 1:00:00, quindi sommando 1 giorno (86400) partendo dalla prima cerchi sempre le fatture fatte alle 12 e quindi dal 26/03/07 non le conta.

L'errore è solo quello, correggi le date e tutto va a posto.

risposto 9 anni fa
LonelyWolf
X 0 X

Ho ricreato l'ambiente con i tuoi dati e fatto un paio di test:

le fatture hanno come ora le 12:00:00 fino al 25/03/2007 dal 26/03/2007 hanno 1:00:00, quindi sommando 1 giorno (86400) partendo dalla prima cerchi sempre le fatture fatte alle 12 e quindi dal 26/03/07 non le conta.

L'errore è solo quello, correggi le date e tutto va a posto.

Non ho capito questa cosa. Se l'algoritmo è giusto dovrebbe contemplare tutte le possibilità, anche se avevo già pensato ad un eventuale altro problema aggiungendo 86400 con il timestamp

risposto 9 anni fa
frankphp
X 0 X

Il timestamp non include tutte le ore di un giorno ma solo quelle di un determinato momento, quindi:

la prima fattura ha come data 07/02/2007 alle ore 12:00:00

aggiungendo un giorno diventa 08/02/2007 alle ore 12:00:00

infatti fino al 25/03/2007 non ci sono problemi; ci sei fino a qui? bene.

a questo punto aggiungi ancora un giorno e diventa:

26/03/2007 alle ore 12:00:00 ma la tua fattura del 26/03/2007 ha come ore 1:00:00 quindi il timestamp è diverso e non uguale a quello creato aggiungendo 86400 quindi non viene compresa nella query, come questa anche le successive.

risposto 9 anni fa
LonelyWolf
X 0 X

Il timestamp non include tutte le ore di un giorno ma solo quelle di un determinato momento, quindi:

la prima fattura ha come data 07/02/2007 alle ore 12:00:00

aggiungendo un giorno diventa 08/02/2007 alle ore 12:00:00

infatti fino al 25/03/2007 non ci sono problemi; ci sei fino a qui? bene.

a questo punto aggiungi ancora un giorno e diventa:

26/03/2007 alle ore 12:00:00 ma la tua fattura del 26/03/2007 ha come ore 1:00:00 quindi il timestamp è diverso e non uguale a quello creato aggiungendo 86400 quindi non viene compresa nella query, come questa anche le successive.

Quindi anche questo sistema non è affidabile in conclusione.

Avevo pensato ad un'altra soluzione.

Nel db c'è anche un campo "giorno" con questo tipo di date: 2007-04-11.

Non potrei trasformare nel ciclo for la data dal formato timestamp a date e poi fare la verifica nella query su su questa ?

Mi spiego.

for ($data= $num; $data<=$num2; $data+=86400) {

// qui trasformo $data nel formato compatibile con il campo giorno del db
//dovrebbe essere qualcosa del genere $tuttogiorno = date("y,"m","d", $data)....o non va bene?

$result_totale = mysql_query("SELECT SUM(totale) as totale_oggi from fatture where giorno = $tuttogiorno",$db);
   while ($tmp = mysql_fetch_array($result_totale)){
   $totali_mese[$i_day] = $tmp["totale_oggi"]; 
  }
$i_day++;
}

Come idea (se tecnicamente è realizzabile) non mi sembra male.

Che ne pensi?

risposto 9 anni fa
frankphp
X 0 X

Per affidabilità è affidabile, potresti avere anche statistiche con dettaglio giornaliero delle fatture, basta usare datafattura compresa tra iniziogiorno e finegiorno anzichè datafattura = datagiorno; dipende da quello che vuoi realizzare, inoltre se la data la memorizzi mantenendo ore minuti secondi fissi (come dicevo nell'altro post) il problema non si pone.

Per la seconda soluzione, ovvero usare la data del campo giorno, devi semplicemente trasformarla più o meno così:

$tuttogiorno = date("Y-m-d",$data);
risposto 9 anni fa
LonelyWolf
X 0 X

Per affidabilità è affidabile, potresti avere anche statistiche con dettaglio giornaliero delle fatture, basta usare datafattura compresa tra iniziogiorno e finegiorno anzichè datafattura = datagiorno; dipende da quello che vuoi realizzare, inoltre se la data la memorizzi mantenendo ore minuti secondi fissi (come dicevo nell'altro post) il problema non si pone.

Per la seconda soluzione, ovvero usare la data del campo giorno, devi semplicemente trasformarla più o meno così:

$tuttogiorno = date("Y-m-d",$data);

Ok provo stasera e faccio sapere, adesso non posso.

Comunque confesso che ancora non mi è chiara la soluzione proposta nella pagina precedente quella con between nella query se ti riferisci ad essa.

Seleziono i totali compresi nello stesso giorno, ma come ciclo giorno per giorno.

Il mio codice adesso ce l'hai quasi per intero; potresti postare questa tua soluzione  e magari poi faccio un confronto.

Grazie

risposto 9 anni fa
frankphp
X 0 X

il ciclo l'hai già fatto e funziona, è quello in cui sommi 86400!

risposto 9 anni fa
LonelyWolf
X 0 X
il ciclo l'hai già fatto e funziona, è quello in cui sommi 86400!

Cioè fammi capire.

Viene prima questo:

$datainizio = mktime (0,0,0,mese,giorno,anno);
$datafine = mktime (23,59,59,mese,giorno,anno);

$query = ""SELECT * sum(totale) as totale_oggi from fatture where data between $datainizio and $datafine;"

e poi questo codice:

for ($data= $num; $data<=$num2; $data+=86400) {

$result_totale = mysql_query("SELECT SUM(totale) as totale_oggi from fatture where data = $data",$db);
   while ($tmp = mysql_fetch_array($result_totale)){
   $totali_mese[$i_day] = $tmp["totale_oggi"];
  }
$i_day++;
}

Scusa visto che inserisco codice completo e non ci intendiamo perfettamente perchè non posti la tua soluzione per intero con il between il for la query con sum e compagnia bella. Adesso finisco per non capirci più niente :-[

In ogni caso ho avuto occasione pe provare la tua ultima soluzione quella con

$tuttogiorno = date("Y-m-d",$data);

Ma non stampavo niente, poi ricordandomi che il db trasforma le date automaticamente in alcuni casi ho cambiato così:

$tuttogiorno = date("Ymd",$data);

e funziona QUASI bene (evidentemente c'era una cattiva interpretazione dei trattini -)

Quasi perchè stampando i risultati mia accorgo che l'ultimo giorno non viene sommato si ferma al 20070410.

C'è, quindi, un problema simile al precedente.

Incomincio a pentirmi di aver affrontato questo argomento dei grafici :buck

Aspetto notizie, ciao.

risposto 9 anni fa
frankphp
X 0 X

Ok, vediamo un po il codice (certo che qualche commento in più e un ordine migliore aiuterebbe! :D )

Riprendo e modifico il tuo codice della pagina precedente, dove hai postato anche i valori d'esempio.

$db = mysql_connect('localhost', 'root', '') or die(mysql_error());
@mysql_select_db('fattura', $db) or die(mysql_error());

$query3 = "SELECT data FROM fatture ORDER BY data ASC LIMIT 1";
$query2 = "SELECT data FROM fatture ORDER BY data DESC LIMIT 1";

$result3 = mysql_query($query3);
while($rot3 = mysql_fetch_array($result3)){
$num = $rot3["data"];

 $mese3 = date("m", $rot3["data"]);
}

$result = mysql_query($query2);
while($rot = mysql_fetch_array($result)){
$num2 = $rot["data"];
 
 $mese = date("m", $rot["data"]);
}
echo $num."<br>";
echo $num2."<br><br>";

echo $mese3."<br>";
echo $mese."<br><br>";

$ogg= mktime(0,0,0,date("m"),date("d"),date("Y"));
echo $ogg."<br><br>";

$giorno= date("d", $num);
echo $giorno."<br><br>";

//------------------------
// $mattina ovvero l'inizio del giorno di cui sommare le fatture
$mattina = mktime(0,0,0,date("m",$num),date("d",$num),date("Y",$num));
// $sera ovvero la fine del giorno di cui sommare le fatture
$sera = mktime(23,59,59,date("m",$num),date("d",$num),date("Y",$num));
//--------------------

$totali_mese = array();
$i_day=0;
//------------------
//stesso giorno della prima fattura, ma come orario mettiamo l'inizio della giornata
$num = $mattina;
//ultimo giorno, come prima, ma con orario parificato all'inizio del primo giorno
$num2 = mktime(0,0,0,date("m",$num2),date("d",$num2),date("Y",$num2));
//----------------------------
for ($data=$num; $data<=$num2; $data+=86400) {

$result_totale = mysql_query("SELECT SUM(totale) as totale_oggi from fatture where data between $mattina and $sera",$db);
//traduzione + omeno comprensibile della query:
//seleziona la somma del campo totale con nome totale_oggi dalla tabella fatture dove il valore data è compreso tra mattina e sera
//quindi a.e.: 16/02/2007 alle 12:30 e 16/02/2007 alle 16:10 vengono trovati essendo tra mattina e sera 
   while ($tmp = mysql_fetch_array($result_totale)){
   $totali_mese[$i_day] = $tmp["totale_oggi"];
  }
$i_day++;
}
count($totali_mese);
$totins = count($totali_mese);
echo $totins."<br><br>";

for ($i = 0; $i <= $totins; $i++) {
echo "->".$totali_mese[$i]."<br>";
}

Dovremmo esserci, anche se non ho testato date che non ho + il db di prova.

risposto 9 anni fa
LonelyWolf
X 0 X

Non va.

Ho modificato l'ultima riga del codice così per verificare quanti valori stampa:

for ($i = 0; $i <= $totins; $i++) {
echo $i."->".$totali_mese[$i]."<br>";
}

il risultato è questo:

1170802800

1176242400

02

04

1177970400

07

63

0->141.00480270386

1->141.00480270386

2->141.00480270386

3->141.00480270386

4->141.00480270386

5->141.00480270386

6->141.00480270386

7->141.00480270386

8->141.00480270386

9->141.00480270386

10->141.00480270386

11->141.00480270386

12->141.00480270386

13->141.00480270386

14->141.00480270386

15->141.00480270386

16->141.00480270386

17->141.00480270386

18->141.00480270386

19->141.00480270386

20->141.00480270386

21->141.00480270386

22->141.00480270386

23->141.00480270386

24->141.00480270386

25->141.00480270386

26->141.00480270386

27->141.00480270386

28->141.00480270386

29->141.00480270386

30->141.00480270386

31->141.00480270386

32->141.00480270386

33->141.00480270386

34->141.00480270386

35->141.00480270386

36->141.00480270386

37->141.00480270386

38->141.00480270386

39->141.00480270386

40->141.00480270386

41->141.00480270386

42->141.00480270386

43->141.00480270386

44->141.00480270386

45->141.00480270386

46->141.00480270386

47->141.00480270386

48->141.00480270386

49->141.00480270386

50->141.00480270386

51->141.00480270386

52->141.00480270386

53->141.00480270386

54->141.00480270386

55->141.00480270386

56->141.00480270386

57->141.00480270386

58->141.00480270386

59->141.00480270386

60->141.00480270386

61->141.00480270386

62->141.00480270386

63->

Stampa solo il totale del primo giorno e l'ultimo valore (63) non è compreso ugualmente.

Ciao e grazie ancora.

risposto 9 anni fa
frankphp
X 0 X

Certo, se sono 63 giorni totali_mese[63] sarebbe il 64mo dato che il primo giorno è con indice 0, da 0 a 62 sono 63 elementi.

Poi mi sono accorto di un piccolo problemino, il ciclo lavora con le variabili sbagliate, non le avevo coprrette nella fretta, infatti $mattina e $sera non cambiavano mai, restavano sempre sul primo giorno!

Eccolo qua:

$db = mysql_connect('localhost', 'root', '') or die(mysql_error());
@mysql_select_db('fattura', $db) or die(mysql_error());

$query3 = "SELECT data FROM fatture ORDER BY data ASC LIMIT 1";
$query2 = "SELECT data FROM fatture ORDER BY data DESC LIMIT 1";

$result3 = mysql_query($query3);
while($rot3 = mysql_fetch_array($result3)){
$num = $rot3["data"];

 $mese3 = "Ultima fattura: ".date("d/m/Y", $rot3["data"])." ".$rot3["data"];
}

$result = mysql_query($query2);
while($rot = mysql_fetch_array($result)){
$num2 = $rot["data"];
 
  $mese = "Prima fattura: ".date("d/m/Y", $rot["data"])." ".$rot["data"];
}

echo "$mese<br />$mese3";

//------------------------
// $mattina ovvero l'inizio del giorno di cui sommare le fatture
$mattina = mktime(0,0,0,date("m",$num),date("d",$num),date("Y",$num));
// $sera ovvero la fine del giorno di cui sommare le fatture
$sera = mktime(23,59,59,date("m",$num),date("d",$num),date("Y",$num));
//--------------------
echo "Primo giorno mattina: $mattina ".date("d/m/Y",$mattina)." - sera: $sera ".date("d/m/Y",$sera);

$totali_mese = array();
$i_day=0;
//------------------
//stesso giorno della prima fattura, ma come orario mettiamo l'inizio della giornata
$num = $mattina;
//ultimo giorno, come prima, ma con orario parificato all'inizio del primo giorno
$num2 = mktime(0,0,0,date("m",$num2),date("d",$num2),date("Y",$num2));
//----------------------------
while($mattina<=$num2) {
$result_totale = mysql_query("SELECT SUM(totale) as totale_oggi from fatture where data between $mattina and $sera",$db);
//traduzione + o meno comprensibile della query:
//seleziona la somma del campo totale con nome totale_oggi dalla tabella fatture dove il valore data è compreso tra mattina e sera
//quindi a.e.: 16/02/2007 alle 12:30 e 16/02/2007 alle 16:10 vengono trovati essendo tra mattina e sera 
   while ($tmp = mysql_fetch_array($result_totale)){
   $totali_mese[$i_day] = $tmp["totale_oggi"];
  }
$i_day++;
$mattina += 86400;
$sera += 86400;
}
count($totali_mese);
$totins = count($totali_mese);
echo $totins."<br><br>";

for ($i = 0; $i <= $totins; $i++) {
echo "->".$totali_mese[$i]."<br>";
}
risposto 9 anni fa
LonelyWolf
X 0 X

Adesso funziona.

Provo ad adattare il tutto a un codice per grafici e vediamo cosa ne viene fuori.

grazie

risposto 9 anni fa
frankphp
X 0 X

Adesso funziona.

Provo ad adattare il tutto a un codice per grafici e vediamo cosa ne viene fuori.

grazie

..hmm. La cosa non sembra tanto facile.

Ho inserito i dati dell'array nel codice che produce il grafico (del quale ho postato l'immagine qualche post fa)

In effetti non ci sono particolari problemi. Il grafico prodotto però mette in serie numerando i giorni da 1 a 63 in questo caso e produce sul numero relativo la barra verticale con le somme del giorno, se ce ne sono.

Dovrei adesso mettere al posto dei numeri genereci la data del mese e poi dovrei per ogni mese interessato dalla richiesta produrre un grafico separato.

Aspetto consigli.

Grazie

risposto 9 anni fa
frankphp
X 0 X

niente?

risposto 9 anni fa
frankphp
X 0 X

Non ho proprio presente lo script che usi, ma potresti usare un array associativo, mettendo il giorno come indice anzichè da 0 a 62.

Il fatto è che con qualunque soluzione, il ciclo nello script del grafico va modificato per bene.

risposto 9 anni fa
LonelyWolf
X 0 X

Non ho proprio presente lo script che usi, ma potresti usare un array associativo, mettendo il giorno come indice anzichè da 0 a 62.

Il fatto è che con qualunque soluzione, il ciclo nello script del grafico va modificato per bene.

Hai ragione Lonely.

Ho pensato a varie possibili soluzioni e seppur, almeno teoricamente, valide sono tecnicamente fuori dalle mie attuali conoscenze e dovrei "disturbare" ogni volta voi del forum su ogni piccolo passo oltre a dover riscrivere parte del codice.

Credo inoltre che in questo caso sia opportuno usare le classi (per la creazione del grafico) e io con le classi php ho sempre litigato.

Diciamo che il progetto dei grafici, per ora, finisce qui anche perchè devo ancora sistemare il codice in vari punti di tutto il progetto.

Ti ringrazio ancora per l'aiuto che mi hai dato.

Ciao

risposto 9 anni fa
frankphp
X 0 X

Ma non ti puoi mica fermare qui, DEVI procedere, tra un po' arriverò anche io (per il nuovo gestionale) a dover fare ste cose, se mi prepari la pappa sono più contento. :D

risposto 9 anni fa
LonelyWolf
X 0 X
Ma non ti puoi mica fermare qui, DEVI procedere, tra un po' arriverò anche io (per il nuovo gestionale) a dover fare ste cose, se mi prepari la pappa sono più contento. :D

magari fossi in grado di preparare le "phppappe2!!!

Ben volentieri lo farei.

In ogni caso tu cosa proponi?

risposto 9 anni fa
frankphp
X 0 X

domani ti faccio sapere, devo pensarci un pochino!

risposto 9 anni fa
LonelyWolf
X 0 X

vabbè, dai diciamo che questo ciclo:

while($mattina<=$num2) {
$result_totale = mysql_query("SELECT SUM(totale) as totale_oggi from fatture where data between $mattina and $sera",$db);
//traduzione + o meno comprensibile della query:
//seleziona la somma del campo totale con nome totale_oggi dalla tabella fatture dove il valore data è compreso tra mattina e sera
//quindi a.e.: 16/02/2007 alle 12:30 e 16/02/2007 alle 16:10 vengono trovati essendo tra mattina e sera 
   while ($tmp = mysql_fetch_array($result_totale)){
   $totali_mese[$i_day] = $tmp["totale_oggi"];
  }
$i_day++;
$mattina += 86400;
$sera += 86400;
}

Lo puoi cambiare così:

while($mattina<=$num2) {
$result_totale = mysql_query("SELECT SUM(totale) as totale_oggi from fatture where data between $mattina and $sera",$db);
//traduzione + o meno comprensibile della query:
//seleziona la somma del campo totale con nome totale_oggi dalla tabella fatture dove il valore data è compreso tra mattina e sera
//quindi a.e.: 16/02/2007 alle 12:30 e 16/02/2007 alle 16:10 vengono trovati essendo tra mattina e sera 
   while ($tmp = mysql_fetch_array($result_totale)){
   $totali_mese[$mattina] = $tmp["totale_oggi"];
  }
$mattina += 86400;
$sera += 86400;
}

Così come indice hai il timestamp, a questo punto il ciclo che realizza il grafico è uguale a questo che riempie il vettore, non ti resta altro da fare che convertire l'indice in data "umana" per il grafico.

risposto 9 anni fa
LonelyWolf
X 0 X

si, in pratica usi come indice array il giorno, buona idea.

Provo a convertire le date.

Il problema più difficile, secondo me, rimane quello di creare i vari grafici (uno x mese).

Adesso ho un solo grande grafico che si estende in orizzontale. Impresentabile.

Grazie

risposto 9 anni fa
frankphp
X 0 X

ho fatto così:

while($mattina<=$num2) {
$result_totale = mysql_query("SELECT SUM(totale) as totale_oggi from fatture where data between $mattina and $sera",$db);
//traduzione + o meno comprensibile della query:
//seleziona la somma del campo totale con nome totale_oggi dalla tabella fatture dove il valore data è compreso tra mattina e sera
//quindi a.e.: 16/02/2007 alle 12:30 e 16/02/2007 alle 16:10 vengono trovati essendo tra mattina e sera 
   while ($tmp = mysql_fetch_array($result_totale)){
   $datag= date("d/m",$mattina).
   $totali_mese[$datag] = $tmp["totale_oggi"];
  }
$mattina += 86400;
$sera += 86400;
}

Mi aspettavo che nel grafico al posto del numero generico uscisse solo la data usata come chiave dell'array.

In effetti la data almeno all'inizio la vedo (07/02) ma si accavalla con il valore della somma; probabilmente

il codice del grafico gestisce e stampa l'indice in un modo che non ho preso in considerazione.

Questo il codice del grafico:

.......

$size_x = 2040;
$size_y = 680;
$title = 'Ammontare fatture mensili';
$title2 = 'Totale fatture (x Euro 100)';

$totali_mese = array();

.......//query e compagnia bella

$max_value = 1000;
$units = 100;

$img = imagecreatetruecolor($size_x, $size_y);
imageantialias($img, true);
imagealphablending($img, true);

$bg_image = 'images/pan.png';
$bg = imagecreatefrompng($bg_image);
$sizes = getimagesize($bg_image);

imagecopyresampled(
$img, $bg,
0, 0, 0, 0,
$size_x, $size_y, $sizes[0], $sizes[1]
);

/* Chart area */
$background = imagecolorallocatealpha($img, 127, 127, 192, 32);
imagefilledrectangle(
$img,
20, 20, $size_x - 20, $size_y - 80,
$background
);
imagefilledrectangle(
$img, 20, $size_y - 60, $size_x - 20, $size_y - 20,
$background
);

/* Values */
$barcolor = imagecolorallocatealpha($img, 0, 0, 128, 80);
$spacing = ($size_x - 140) / count($totali_mese);
$start_x = 120;
foreach ($totali_mese as $key => $value) {
$x1 = $start_x + 0.2 * $spacing;
$x2 = $start_x + 0.8 * $spacing;
$y1 = $size_y - 120;
$y2 = $y1 - (($value / $max_value) * ($size_y - 160));
imagefilledrectangle($img, $x1, $y1, $x2, $y2, $barcolor);
$start_x += $spacing;
}

/* Grid */
$black = imagecolorallocate($img, 0, 0, 0);
$grey = imagecolorallocate($img, 128, 128, 192);
for ($i = $units; $i <= $max_value; $i += $units) {
$x1 = 110;

$y1 = $size_y - 120 - (($i / $max_value) * ($size_y -160));
$x2 = $size_x - 20;
$y2 = $y1;
imageline(
$img,
$x1, $y1, $x2, $y2,
($i % (2 * $units)) == 0 ? $black : $grey
);
}
/* Axis */
imageline($img, 120, $size_y - 120, 120, 40, $black);
imageline(
$img,
120, $size_y - 120, $size_x - 20, $size_y - 120,
$black
);

/* Title */
$c_x = $size_x / 2;
$c_y = $size_y - 40;
$box = imagettfbbox(20, 0, 'arial.ttf', $title);
$sx = $box[4] - $box[0];
$sy = $box[5] + $box[1];
imagettftext(
$img,
20, 0,
$c_x - $sx / 2, $c_y - ($sy / 2),
$black,
'arial.ttf', $title
);

$c_x = 50;
$c_y = ($size_y - 60) / 2;
$box = imagettfbbox(14, 90, 'arial.ttf', $title2);
$sx = $box[4] - $box[0];
$sy = $box[5] + $box[1];
imagettftext(
$img,
14, 90,
$c_x - ($sx / 2), $c_y - ($sy / 2),
$black,
'arial.ttf', $title2
);

/* Labels */
$c_y = $size_y - 100;
$start_x = 120;
foreach ($totali_mese as $label => $dummy) {
$box = imagettfbbox(12, 0, 'arial.ttf', $label);
$sx = $box[4] - $box[0];
$sy = $box[5] + $box[1];
$c_x = $start_x + (0.5 * $spacing);
imagettftext(
$img,
12, 0,

$c_x - ($sx / 2), $c_y - ($sy / 2),
$black,
'arial.ttf', $label
);
$start_x += $spacing;
}
$r_x = 100;
for ($i = 0; $i <= $max_value; $i += ($units * 2)) {
$c_y = $size_y - 120 - (($i / $max_value) * ($size_y - 160));

$box = imagettfbbox(12, 0, 'arial.ttf', $i / 100);
$sx = $box[4] - $box[0];
$sy = $box[5] + $box[1];
imagettftext(
$img,
12, 0,
$r_x - $sx, $c_y - ($sy / 2),
$black,
'arial.ttf', $i / 100
);
}

/* Output to browser */
header('Content-type: image/png');
imagepng($img);    
    
  }
}

Non so dove mettere le mani. Dovrei stampare sotto (alla base della barra del che produce il grafico la data).

Cosa dovrei modificare?

Grazie

risposto 9 anni fa
frankphp
X 0 X

Ci sono riuscito  ;D ;D

.......

while($mattina<=$num2) {
$result_totale = mysql_query("SELECT SUM(totale) as totale_oggi from fatture where data between $mattina and $sera",$db);
//traduzione + o meno comprensibile della query:
//seleziona la somma del campo totale con nome totale_oggi dalla tabella fatture dove il valore data è compreso tra mattina e sera
//quindi a.e.: 16/02/2007 alle 12:30 e 16/02/2007 alle 16:10 vengono trovati essendo tra mattina e sera 
   while ($tmp = mysql_fetch_array($result_totale)){
   $datag= date("d/m",$sera);
   $totali_mese[$datag] = $tmp["totale_oggi"];
  }
$mattina += 86400;
$sera += 86400;
}

.......

//poi ho sostituito nel codice del grafico  questo oreach ($totali_mese as $label => $dummy) { con..

foreach ($totali_mese as $label => $datag) {

.....

Il risultato è questo grafico (solo una parte, si estende troppo in orizzontale e ho dovuto anche aumentarne le dimensioni per visualizzare bene le date)

Adesso si dovrebbero creare tanti grafici quanti sono i mesi, ma non penso di esserne in grado da solo :P

Ciao

risposto 9 anni fa
frankphp
X 0 X

Adesso?

sembra che sia arrivato ad un punto morto.

Come ho detto precedentemente il codice del grafico dovrebbe essere organizzato come classe o come una funzione e poi una volta separati i valori per ogni mese passargli i dati relativi.

Aiuto.

risposto 9 anni fa
frankphp
X 0 X

ciao Lony

Ho trovato questa discussione:

http://forum.html.it/forum/showthread.php?s=&threadid=1072767&

Non l'ho ancora studiata con attenzione. Dici che potrebbe essere utile per il "nostro" grafico?

Grazie

risposto 9 anni fa
frankphp
X 0 X

Scusa ma sono un po' preso in questi giorni, son "fatto su" con un modulo preventivi veramente incasinato!

Comunque non ho letto tutta la discussione che hai trovato, ma per sommi capi devi fare così:

hai presente $mattina e $sera?

ecco pensa se invece di essere mattina e sera sono la mattina del 1° del mese e la sera dell'ultimo del mese? cosa succede?

succede che SUM(totale) as totale_oggi diventa SUM(totale) as totale_mese!

sei in grado di procedere da solo ora, vero? ;)

risposto 9 anni fa
LonelyWolf
X 0 X

Scusa ma sono un po' preso in questi giorni, son "fatto su" con un modulo preventivi veramente incasinato!

Comunque non ho letto tutta la discussione che hai trovato, ma per sommi capi devi fare così:

hai presente $mattina e $sera?

ecco pensa se invece di essere mattina e sera sono la mattina del 1° del mese e la sera dell'ultimo del mese? cosa succede?

succede che SUM(totale) as totale_oggi diventa SUM(totale) as totale_mese!

sei in grado di procedere da solo ora, vero? ;)

Non penso che sia così semplice.

Ci devo pensare. In questi giorni sono un po' occupato.

Ci risentiamo tra qualche giorno, ok?

Grazie

risposto 9 anni fa
frankphp
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda