Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Impossibile inserire valore 0 in un Array

    Ciao ragazzi,

    premetto che sono particolarmente nuovo su tutti i tipi di forum quindi vi chiedo già scusa se sbaglio qualcosa.
    Vi spiego la mia situazione. Ho questo pezzo di codice:

    codice:
    $array_fatturato=array();
      for($gg=1;$gg<=31;$gg++){
         $query=mysqli_query($con, "SELECT * FROM chiusure WHERE data_chiusura = '$anno-$mese_ricercato-$gg'");
            while($desc=mysqli_fetch_array($query)){
                $righe=mysqli_num_rows($query);
                 if($righe==0){
                    $array_fatturato[]=0;
                  }else{
                     $array_fatturato[]=$desc['t_fatturato'];
                  }
            }
     }
    Vi spiego cosa fa che così evitate di perdere tempo nel capirlo. Sostanzialmente ho un ciclo for che prende 31 giorni del mese. Per ogni giorno viene effettuata una query che mi inserisce il totale del fatturato in un array che dovrebbe essere in qualsiasi caso di 30 elementi.

    Il mio problema è appunto che quando effettuo un print_r($array_fatturato); mi vengono visualizzati solo 25 elementi che corrispondono ai record totali della tabella "Chiusure".

    Mi sapete dire dove sbaglio gentilmente?

    Grazie in anticipo.

  2. #2
    Moderatore di Annunci siti web, Offro lavoro/collaborazione, Cerco lavoro L'avatar di cavicchiandrea
    Registrato dal
    Aug 2001
    Messaggi
    26,133
    O imposti la tabella che di default abbia valore 0 oppure prova così $array_fatturato[]=($desc['t_fatturato']=='')? 0 : $desc['t_fatturato'];
    Cavicchi Andrea
    Problemi con javascript, jquery, ajax clicca qui

  3. #3
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Secondo me ci sono diversi problemi...a partire dal fatto che num_rows lo controlli nel ciclo while.
    Inoltre, visto che fai un ciclo, ne deduco che ci sono più record per quel giorno e tu vuoi il totale di t_fatturato, giusto?
    Potresti fare così:

    Codice PHP:

    $array_fatturato
    =array();
    for(
    $gg=1;$gg<=31;$gg++){
      
    $query=mysqli_query($con"SELECT * FROM chiusure WHERE data_chiusura = '$anno-$mese_ricercato-$gg'");
      
    $array_fatturato[$gg-1] = 0;
      while(
    $desc=mysqli_fetch_array($query)){
                    
    $array_fatturato[$gg-1] += $desc['t_fatturato'];
       }

    Ultima modifica di boots; 26-09-2015 a 12:28

  4. #4
    Quote Originariamente inviata da boots Visualizza il messaggio
    Secondo me ci sono diversi problemi...a partire dal fatto che num_rows lo controlli nel ciclo while.
    Inoltre, visto che fai un ciclo, ne deduco che ci sono più record per quel giorno e tu vuoi il totale di t_fatturato, giusto?
    Potresti fare così:

    Codice PHP:

    $array_fatturato
    =array();
    for(
    $gg=1;$gg<=31;$gg++){
      
    $query=mysqli_query($con"SELECT * FROM chiusure WHERE data_chiusura = '$anno-$mese_ricercato-$gg'");
      
    $array_fatturato[$gg-1] = 0;
      while(
    $desc=mysqli_fetch_array($query)){
                    
    $array_fatturato[$gg-1] += $desc['t_fatturato'];
       }

    Ciao!

    Grazie per l'aiuto. Ho effettivamente risolto il problema sostando il controllo della riga al di fuori del ciclo. Non so per quale motivo l'avevo messo dentro!

    codice:
    $array_fatturato=array();
                    for($gg=1;$gg<=31;$gg++){
                        $query=mysqli_query($con, "SELECT * FROM chiusure WHERE data_chiusura = '$anno-$mese_ricercato-$gg'");
                        $righe=mysqli_num_rows($query);
                               if(!$righe){
                                       $array_fatturato[]=0;
                                }else{
                                    while($desc=mysqli_fetch_array($query)){
                                       $array_fatturato[]=$desc['t_fatturato'];}
                                    }
                            
                    }

  5. #5
    Utente bannato
    Registrato dal
    Jul 2013
    Messaggi
    290
    Quote Originariamente inviata da MirkoMontagna Visualizza il messaggio
    Ciao!

    Grazie per l'aiuto. Ho effettivamente risolto il problema sostando il controllo della riga al di fuori del ciclo. Non so per quale motivo l'avevo messo dentro!

    codice:
    $array_fatturato=array();
                    for($gg=1;$gg<=31;$gg++){
                        $query=mysqli_query($con, "SELECT * FROM chiusure WHERE data_chiusura = '$anno-$mese_ricercato-$gg'");
                        $righe=mysqli_num_rows($query);
                               if(!$righe){
                                       $array_fatturato[]=0;
                                }else{
                                    while($desc=mysqli_fetch_array($query)){
                                       $array_fatturato[]=$desc['t_fatturato'];}
                                    }
                            
                    }
    Mi sembra che stai facendo fare i conti a PHP, cosa che non è molto veloce.
    Io farei così
    - parti da un array posto tutto a zero
    - fai una query dove metti un SUM del fatturato con un GROUP BY sul DAY() (e relative WHERE)
    - cicli direttamente sui risultati e dove c'è una riga metti il relativo valore dentro l'array
    Così se in un mese, poniamo, hai 2 movimenti il ciclo dura 2 e non 31 come nel tuo codice.

  6. #6
    Quote Originariamente inviata da brancomat Visualizza il messaggio
    Mi sembra che stai facendo fare i conti a PHP, cosa che non è molto veloce.
    Io farei così
    - parti da un array posto tutto a zero
    - fai una query dove metti un SUM del fatturato con un GROUP BY sul DAY() (e relative WHERE)
    - cicli direttamente sui risultati e dove c'è una riga metti il relativo valore dentro l'array
    Così se in un mese, poniamo, hai 2 movimenti il ciclo dura 2 e non 31 come nel tuo codice.
    Ti ringrazio ma la mia necessità è quello di farlo durare comunque 31 giorni

    grazie... Come si fa a chiudere la discussione?

  7. #7
    Utente bannato
    Registrato dal
    Jul 2013
    Messaggi
    290
    Quote Originariamente inviata da MirkoMontagna Visualizza il messaggio
    Ti ringrazio ma la mia necessità è quello di farlo durare comunque 31 giorni

    grazie... Come si fa a chiudere la discussione?
    Scusa ma... perché?
    Mi sembra concettualmente sbagliato.
    Se in un certo mese hai poniamo qualcosa del tipo

    01.09.2015 7
    26.09.2015 10
    26.09.2015 3

    dovrai mettere nella posizione 1 dell'array 7, e nella posizione 26 10+3=13
    Eseguendo la somma da mysql otterresti questi dati

    1, 7
    26, 13

    sicchè ti basta fare un ciclo di due iterazioni che prende il giorno (1 e 26) scrive i dati nell'array (7 e 13)

    Una query invece di 31 query, e un ciclo del numero minimo di righe, ossia (così a stima) una cinquantina di volte PIU' veloce, e anche più semplice da scrivere.

    Ti basta partire con
    for($gg=1;$gg<=31;$gg++)
    $array_fatturato[$gg]=0;

    per "svuotare" i dati (essendo sicuro di non avere problemi con PHP)


    Infine ti suggerisco di togliere il select * perché inutilmente lento, a favore di un select t_fatturato.
    Inutile farsi ritornare tutte le righe, se ti basta un singolo dato

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.