Visualizzazione risultati 1 fino 28 di 28

Discussione: Problema con query ed array

  1. #1
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito Problema con query ed array

    Ciao
    Il codice sotto dovrebbe sommare tutti i valori presenti in un campo del DB (totale) relativi allo stesso giorno, se ce ne sono) e inserire i totali ottenuti in un array ($totali_mese)

    Codice PHP:

    ........
    $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>";

    echo
    $totali_mese[0]."<br>";
    for (
    $i = 0; $i <= $totins; $i++) {
    echo
    $totali_mese[$i]."<br>";
    }
    ho inserito qualche echo per controllo.
    Nelll' array risultano 34 inserimenti ed in effetti è 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 (totale) della fattura del primo giorno ($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 in questo caso, e fare la somma dei valori per gli altri se nello stesso giorno, come ho detto ci sono più documenti emessi invece niente.

    Quale può essere l'errore?
    Grazie

  2. #2
    L'avatar di silverseraph
    silverseraph non è connesso AlterGuru
    Data registrazione
    27-04-2005
    Residenza
    Localhost
    Messaggi
    1,104

    Predefinito

    ciao, prova a fare così:
    Codice PHP:
    $totali_mese = array();
    $result_totale = mysql_query("SELECT SUM(totale) as totale_oggi from fatture where data = $data",$db);
    for (
    $data = $num; $data <= $num2; $data += 86400)
    {
    if (
    mysql_num_rows($result_totale) > 0)
    {
    $tmp = mysql_fetch_array($result_totale);
    $totali_mese[] = $tmp["totale_oggi"];
    }
    else
    {
    $totali_mese[] = 0;
    }
    }
    $totins = count($totali_mese);
    echo
    $totins."<br><br>";
    echo
    $totali_mese[0]."<br>";
    for (
    $i = 0; $i <= $totins; $i++)
    {
    echo
    $totali_mese[$i]."<br>";
    }
    Ultima modifica di silverseraph : 19-04-2007 alle ore 17.14.11

  3. #3
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Citazione Originalmente inviato da silverseraph
    ciao, prova a fare così:
    Codice PHP:
    $totali_mese = array();
    $result_totale = mysql_query("SELECT SUM(totale) as totale_oggi from fatture where data = $data",$db);
    for (
    $data = $num; $data <= $num2; $data += 86400)
    {
    if (
    mysql_num_rows($result_totale) > 0)
    {
    $tmp = mysql_fetch_array($result_totale);
    $totali_mese[] = $tmp["totale_oggi"];
    }
    else
    {
    $totali_mese[] = 0;
    }
    }
    $totins = count($totali_mese);
    echo
    $totins."<br><br>";
    echo
    $totali_mese[0]."<br>";
    for (
    $i = 0; $i <= $totins; $i++)
    {
    echo
    $totali_mese[$i]."<br>";
    }

    riporta questo errore:

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

    la linea è questa:

    if (mysql_num_rows($result_totale) > 0)

    ciao

  4. #4
    L'avatar di dementialsite
    dementialsite non è connesso Super Moderatore
    Data registrazione
    19-10-2004
    Residenza
    fuori Padova
    Messaggi
    5,046

    Predefinito

    Trovo un po' strano l'uso di mysql_fetch_array() all'interno di una selezione (if) e non di un ciclo (while)... ti ricordo che quella funzione estrae UNA SOLA riga della tabella.

    Per estrarle tutte, questo è il ciclo tipico di acquisizione dei dati:
    Codice PHP:
    $result = mysql_query ($query, $db);

    while (
    $line = mysql_fetch_array ($result))
    {
    // qui puoi elaborare i dati del DB selezionandoli con la sintassi $line['nome_campo'];
    // da notare che è GIÀ INCLUSO il fatto che qui ci siano risultati, non serve un altro controllo...
    }
    Statemi bene...
    Le questioni tecniche hanno risposte migliori nel forum pubblico, non trovi?

    When you don't know your next step... improvise

    ALTERVISTA WANTS YOU!
    Vuoi diventare moderatore su AlterVista? Scopri come...

  5. #5
    L'avatar di silverseraph
    silverseraph non è connesso AlterGuru
    Data registrazione
    27-04-2005
    Residenza
    Localhost
    Messaggi
    1,104

    Predefinito

    Scusa ma se è in un ciclo for non è lo stesso? lì è già dentro a un ciclo...

  6. #6
    Guest

    Predefinito

    Citazione Originalmente inviato da silverseraph
    Scusa ma se è in un ciclo for non è lo stesso? lì è già dentro a un ciclo...
    No, perchè il ciclo for non attraversa il risultato della query, mentre mysql_fetch_* sì.


    Ciaoooo!!!

  7. #7
    L'avatar di silverseraph
    silverseraph non è connesso AlterGuru
    Data registrazione
    27-04-2005
    Residenza
    Localhost
    Messaggi
    1,104

    Predefinito

    Scusa, non ti sto seguendo. Io volevo dire che fare
    Codice PHP:
    $result = mysql_query ($query, $db);

    while (
    $line = mysql_fetch_array ($result))
    {
    }
    e fare
    Codice PHP:
    $result = mysql_query ($query, $db);
    for (
    $i = 1; $i <= mysql_num_rows($result); $i++)
    {
    $line = mysql_fetch_array ($result);
    }
    è la stessa cosa...

  8. #8
    Guest

    Predefinito

    Non è la stessa cosa, perchè il comportamento di fetch_array (come di _assoc e _row) non te lo permette.
    A conferma di questo puoi fare delle prove.


    Ciaooo!!!

  9. #9
    L'avatar di silverseraph
    silverseraph non è connesso AlterGuru
    Data registrazione
    27-04-2005
    Residenza
    Localhost
    Messaggi
    1,104

    Predefinito

    Ho sempre fatto con il for e non ho mai riscontrato problemi...

  10. #10
    L'avatar di funcool
    funcool non è connesso Utente storico
    Data registrazione
    05-02-2004
    Residenza
    Qui... Non lì, qui!
    Messaggi
    15,433

    Predefinito

    Citazione Originalmente inviato da silverseraph
    Scusa, non ti sto seguendo. Io volevo dire che fare
    Codice PHP:
    $result = mysql_query ($query, $db);

    while (
    $line = mysql_fetch_array ($result))
    {
    }
    e fare
    Codice PHP:
    $result = mysql_query ($query, $db);
    for (
    $i = 1; $i <= mysql_num_rows($result); $i++)
    {
    $line = mysql_fetch_array ($result);
    }
    è la stessa cosa...
    Per quel che so io è così, perché ogni volta che viene eseguito mysql_fetch_array (o funzione simile) il puntatore passa all'elemento successivo.
    Mattia vi manda a FunCool - Matriz - Directory Gogol - Sfondo rosso per la Birmania
    «Tu mi dai fastidio perché ti credi tanto un Dio!» «Bè, dovrò pur prendere un modello a cui ispirarmi, no?» Woody Allen

  11. #11
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    ho fatto così, ma non è cambiato niente:

    Codice PHP:
    $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>";
    }
    Ancora non ho risolto il problema.

    Mi stampa dopo il primo risultato 34 "->"
    Ultima modifica di gianlucaweb : 20-04-2007 alle ore 15.13.40

  12. #12
    Guest

    Predefinito

    x silverseraph: scusa non avevo letto il tuo secondo esempio, lì infatti, anche se con un dispendio superiore di risorse, il risultato può essere uguale.


    Ciao!

  13. #13
    L'avatar di binarysun
    binarysun non è connesso Utente storico
    Data registrazione
    02-07-2004
    Messaggi
    2,017

    Predefinito

    Citazione Originalmente inviato da debug
    x silverseraph: scusa non avevo letto il tuo secondo esempio, lì infatti, anche se con un dispendio superiore di risorse, il risultato può essere uguale.


    Ciao!
    Be, minimamente superiore in risorse.
    Ma rimane il fatto che il ciclo while in questo caso è più "elegante".
    "L'intelligenza è una pianta che va curata continuamente.
    Dovreste vedere com'è bello, il mio bonsai."
    Rat-man®

    [Gradient Text]
    [Su che server sei?]
    ->flickr

  14. #14
    L'avatar di silverseraph
    silverseraph non è connesso AlterGuru
    Data registrazione
    27-04-2005
    Residenza
    Localhost
    Messaggi
    1,104

    Predefinito

    Concordo con binarysun... cmq prova a fare così:
    Codice PHP:
    $totali_mese = array();
    $result_totale = mysql_query("SELECT SUM(totale) as totale_oggi from fatture where data = $data;",$db);
    while (
    $tmp = mysql_fetch_array($result_totale))
    {
    if (
    mysql_num_rows($result_totale) > 0)
    $totali_mese[] = $tmp["totale_oggi"];
    else
    $totali_mese[] = 0;
    }
    }
    $totins = count($totali_mese);
    echo
    $totins."<br><br>";
    echo
    $totali_mese[0]."<br>";
    for (
    $i = 0; $i <= $totins; $i++)
    {
    echo
    $totali_mese[$i]."<br>";
    }
    Ho tolto il for con lo step che non ne capivo il significato

  15. #15
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Citazione Originalmente inviato da silverseraph
    Concordo con binarysun... cmq prova a fare così:
    Codice PHP:
    $totali_mese = array();
    $result_totale = mysql_query("SELECT SUM(totale) as totale_oggi from fatture where data = $data;",$db);
    while (
    $tmp = mysql_fetch_array($result_totale))
    {
    if (
    mysql_num_rows($result_totale) > 0)
    $totali_mese[] = $tmp["totale_oggi"];
    else
    $totali_mese[] = 0;
    }
    }
    $totins = count($totali_mese);
    echo
    $totins."<br><br>";
    echo
    $totali_mese[0]."<br>";
    for (
    $i = 0; $i <= $totins; $i++)
    {
    echo
    $totali_mese[$i]."<br>";
    }
    Ho tolto il for con lo step che non ne capivo il significato

    ancora il solito messaggio di errore.
    Possibile che non si riesca a risolvere la cosa?
    Grazie comunque.

  16. #16
    Guest

    Predefinito

    Il controllo sul numero di righe estratte deve stare fuori dal ciclo!
    Infatti, nel caso che la query non producesse nessun risultato (cioè nessuna riga estratta) il ciclo non dovrebbe essere eseguito.


    Ciao!

  17. #17
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Citazione Originalmente inviato da debug
    Il controllo sul numero di righe estratte deve stare fuori dal ciclo!
    Infatti, nel caso che la query non producesse nessun risultato (cioè nessuna riga estratta) il ciclo non dovrebbe essere eseguito.


    Ciao!

    Cioè? Così?

    Codice PHP:
    $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) > 0) {

    while (
    $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>";

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

    Non cambia niente anche in questo caso; non ho errori ma stampo solo il primo valore del primo record e poi 34 "->"

    Grazie
    Ultima modifica di gianlucaweb : 21-04-2007 alle ore 19.12.45

  18. #18
    L'avatar di silverseraph
    silverseraph non è connesso AlterGuru
    Data registrazione
    27-04-2005
    Residenza
    Localhost
    Messaggi
    1,104

    Predefinito

    Prova a togliere il for con lo step

  19. #19
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Citazione Originalmente inviato da silverseraph
    Prova a togliere il for con lo step
    step? Cos'è?

    Ma se tolgo il for come ciclo i giorni da una data all'altra?
    Grazie



    ...Forse ho capito!
    Il problema dovrebbe essere nella data ($data).
    Ci sentiamo domani.
    Ultima modifica di gianlucaweb : 21-04-2007 alle ore 21.25.28

  20. #20
    L'avatar di Luffio
    Luffio non è connesso Utente attivo
    Data registrazione
    02-07-2006
    Messaggi
    439

    Predefinito

    Vorrei dire: ma $result_totale non è un numero anzichè un array? (non lo so, vorrei me lo diceste :P)

    Mi sembra ci sia un errore qui:
    Codice PHP:
    while ($tmp = mysql_fetch_array($result_totale)){
    $totali_mese[$i_day] = $tmp["totale_oggi"];
    }
    Se ci vuole l' while, non incrementi $i_day quindi ogni volta sovrascrive! Se invece è uno solo, ci vuole l' if!
    Luffio Web Site, Luffio's personal site
    Age Of Empires GIF, sito per la creazione di GIF animate di Age of Empires
    Clan italiano di Age of Empires The Conquerors, uno dei più vecchi ancora attivi

  21. #21
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    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

  22. #22
    L'avatar di silverseraph
    silverseraph non è connesso AlterGuru
    Data registrazione
    27-04-2005
    Residenza
    Localhost
    Messaggi
    1,104

    Predefinito

    Scusa se insisto ma io ancora non ho ben capito perchè usi quel ciclo... scusa non potresti prelevare i risultati che ti interessano con la query? Lo script diventa più veloce, leggibile e pulito.

  23. #23
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Citazione Originalmente inviato da silverseraph
    Scusa se insisto ma io ancora non ho ben capito perchè usi quel ciclo... scusa non potresti prelevare i risultati che ti interessano con la query? Lo script diventa più veloce, leggibile e pulito.

    Non cambia niente il problema è nella data.
    A proposito come si converte un data nel formato timestamp come è registrata nel campo data (tipo int) in una di tipo date o datetime?
    grazie

  24. #24
    L'avatar di silverseraph
    silverseraph non è connesso AlterGuru
    Data registrazione
    27-04-2005
    Residenza
    Localhost
    Messaggi
    1,104

    Predefinito

    date("d/m/Y", $data_timestamp);

    Comunque puoi spiegarmi perchè lo usi quel ciclo?

  25. #25
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Citazione Originalmente inviato da silverseraph
    date("d/m/Y", $data_timestamp);

    Comunque puoi spiegarmi perchè lo usi quel ciclo?
    doveva servire, secondo le intenzioni, ad aggiungere alla data iniziale un giorno fino al raggiungimento della data finale in modo da avere per la query la variabile $data aggiornata ciclicamente ma come ho detto...
    Grazie

    ps: ma cosa è successo al tuo sito, Silver?
    Ultima modifica di gianlucaweb : 22-04-2007 alle ore 16.17.39

  26. #26
    L'avatar di silverseraph
    silverseraph non è connesso AlterGuru
    Data registrazione
    27-04-2005
    Residenza
    Localhost
    Messaggi
    1,104

    Predefinito

    Molto più semplicemente nel while potresti fare $data += 8600

    p.s. non è più mio ed è scaduto il database...
    Ultima modifica di silverseraph : 22-04-2007 alle ore 16.33.45

  27. #27
    L'avatar di Luffio
    Luffio non è connesso Utente attivo
    Data registrazione
    02-07-2006
    Messaggi
    439

    Predefinito

    io preleverei tutte le colonne del database che servono, e dopo farei il controllo sulla data controllando che la data coincida.
    Luffio Web Site, Luffio's personal site
    Age Of Empires GIF, sito per la creazione di GIF animate di Age of Empires
    Clan italiano di Age of Empires The Conquerors, uno dei più vecchi ancora attivi

  28. #28
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Citazione Originalmente inviato da Luffio
    io preleverei tutte le colonne del database che servono, e dopo farei il controllo sulla data controllando che la data coincida.
    questo teoricamente lo avevo pensato pure io, ma mi sono reso conto che complessivamente non è così semplice.
    grazie

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •