Progressbar estrazione dati da tabella mySQL

  • Creatore Discussione Creatore Discussione epag8
  • Data di inizio Data di inizio

epag8

Nuovo Utente
4 Dic 2020
8
0
1
Buongiorno a tutti
Per un progetto aziendale, sto cercando di trasportare un vecchio sito PHP in javascript, per migliorare molti aspetti.
In queste ultime due settimane ho fatto un corso di javascript; quindi al momento non ho molta esperienza con il codice anche se ci sto provando.
Vi spiego cosa devo fare:
Nella tabella "schede" ho il tempo di realizzazione di una scatola in produzione, il tipo di scatola, il materiale ed i pezzi fatti per quella commessa ed altri dati accessori. Quindi:
- Ho una banale tabella HTML, con i campi che riportano i dati presenti su una tabella mySQL presente sul server XAMPP
- Ho un file connessione.js, che gestisce una chiamata AJAX al server dove c'è questa tabella mySQL
- Ho un file data.php, che esegue la query sulla tabella "schede" (in questo caso) e riporta il risultato a connessione.js sotto forma di JSON.
Ora, il risultato in questione viene riportato dopo circa 10 secondi (la tabella ha più di 30.000 righe...) quindi rispetto al PHP la velocità è decisamente aumentata. Quando invece dovrò maneggiare tabelle con 1.000.000 di righe esattamente non so cosa succederà :confused:

il punto della questione è:
come faccio a visualizzare lo stato ed il progresso della richiesta di estrazione dati dalla tabella?

Cosa importante: mi è stato suggerito nel corso di non utilizzare jquery, in quanto è una libreria che sta andando deprecata.
Su internet infatti trovo esempi di progressbar fatti proprio con jquery.... :mad:

HTML:
<table>
    <tr>
        <th>Scheda</th>
        <th>Tempo taglio</th>
        <th>Tipo scatola</th>
        <th>Materiale</th>
        <th>Area</th>
        <th>Pezzi</th>
        <th>Metodo</th>
        <th>Anomalia</th>
        <th>Data produzione</th>
        <th>Macchina</th>
    </tr>
    <tbody id="corpotabella">
        <!--i dati verranno visualizzati qui-->
    </tbody>
</table>
<script src='connessione.js'></script>

JavaScript:
//chiamiamo ajax
var ajax = new XMLHttpRequest();
var method = 'GET';
var url = './data.php';
var asincrono = true;

ajax.open(method, url, asincrono);
//sending ajax request
ajax.send();


//receveing response from data.php
ajax.onreadystatechange = function(){
    if ((this.readyState == 4) && (this.status==200)){
        //converting JSON back to array
        var data = JSON.parse(this.responseText);
        console.log(data); //for debugging
        //html value for <tbody>
        var html = "";
        //looping through the data
        for(var a=0 ; a < data.length ; a++){
            var scheda = data[a].scheda;
            var tempotaglio = data[a].tempotaglio;
            var tiposcatola = data[a].tiposcatola;
            var materiale = data[a].materiale;
            var area = data[a].area;
            var pezzi = data[a].pezzi;
            var metodo = data[a].metodo;
            var anomalia = data[a].anomalia;
            var dataproduzione = data[a].dataproduzione;
            var macchina = data[a].macchina;
            //appending at HTML
            html = html + '<tr>';
            html = html + '<td>' + scheda + '</td>';
            html = html + '<td>' + tempotaglio + '</td>';
            html = html + '<td>' + tiposcatola + '</td>';
            html = html + '<td>' + materiale + '</td>';
            html = html + '<td>' + area + '</td>';
            html = html + '<td>' + pezzi + '</td>';
            html = html + '<td>' + metodo + '</td>';
            html = html + '<td>' + anomalia + '</td>';
            html = html + '<td>' + dataproduzione + '</td>';
            html = html + '<td>' + macchina + '</td>';
            html = html + '</tr>';
        };
        //replacing the <tbody> of <table>
        document.getElementById("corpotabella").innerHTML = html;
    };
};

PHP:
<?php
//getting data from database
$conn = mysqli_connect("localhost", "root", "", "packcart4");
//getting data from utenti table
$result = mysqli_query($conn, "SELECT * FROM schede_plotter");
//storing in array
$data = array();
while($row = mysqli_fetch_assoc($result))
{
    $data[] = $row;
}
//returning results in JSON format
echo json_encode($data);
?>
 
Ciao, non entro in merito al discorso "progress bar" ma vorrei darti solo qualche consiglio.

IMHO è concettualmente sbagliato pensare di rendere fruibile in un sol colpo, su un qualsiasi browser, un documento con una tabella di 1M di righe o_O ma anche fossero 10mila son sempre troppe. Che sia poi generato attraverso php o javascript, poco cambia. A parte l'attesa del caricamento dei dati, dovresti considerare anche le possibili difficoltà da parte dell'utente nel consultare quella mole di dati.

Per prima cosa dovresti pensare di creare un sistema di "paginazione" in modo da frammentare il caricamento dei dati ad un numero prestabilito (e presumibilmente accettabile) di righe. Potresti anche pensare di predisporre un campo di selezione con cui l'utente stesso può personalizzare il numero di righe da mostrare per pagina, scegliendo magari tra diversi valori (ad esempio, 500, 1000, 5000, 10000 righe per pagina).

Seconda cosa, se già non lo hai considerato nel tuo progetto, dovresti pensare di impostare un sistema di ricerca/filtro dei record da mostrare, in modo da concentrare la restituzione dei dati a quelli potenzialmente utili all'utente, e facilitarne quindi la consultazione.

A questo punto il tempo di attesa sarebbe comunque minimo e potrebbe anche bastare una semplice icona di caricamento da mostrare magari in overlay, piuttosto che una progress bar.
 
Ciao, non entro in merito al discorso "progress bar" ma vorrei darti solo qualche consiglio.

IMHO è concettualmente sbagliato pensare di rendere fruibile in un sol colpo, su un qualsiasi browser, un documento con una tabella di 1M di righe o_O ma anche fossero 10mila son sempre troppe. Che sia poi generato attraverso php o javascript, poco cambia. A parte l'attesa del caricamento dei dati, dovresti considerare anche le possibili difficoltà da parte dell'utente nel consultare quella mole di dati.

Per prima cosa dovresti pensare di creare un sistema di "paginazione" in modo da frammentare il caricamento dei dati ad un numero prestabilito (e presumibilmente accettabile) di righe. Potresti anche pensare di predisporre un campo di selezione con cui l'utente stesso può personalizzare il numero di righe da mostrare per pagina, scegliendo magari tra diversi valori (ad esempio, 500, 1000, 5000, 10000 righe per pagina).

Seconda cosa, se già non lo hai considerato nel tuo progetto, dovresti pensare di impostare un sistema di ricerca/filtro dei record da mostrare, in modo da concentrare la restituzione dei dati a quelli potenzialmente utili all'utente, e facilitarne quindi la consultazione.

A questo punto il tempo di attesa sarebbe comunque minimo e potrebbe anche bastare una semplice icona di caricamento da mostrare magari in overlay, piuttosto che una progress bar.
Ciao, questa è una query d'esempio; ci sono anche altre query più leggere ma anche altri molto più complesse e anche molto più pesanti. Quindi mi serve qualcosa che mi indichi lo stato del processo (una progressbar, un numero di record letti, un timer booh) ma non so come fare e non so dove inserirla all'interno dei miei script.

Se vuoi un esempio di query pesante potrebbe essere questo: estrarre tutte le commesse fatte a Marzo 2021. Per quanto riguarda il mio database, vengono estratte una cosa come 935.679 righe. E qua il browser si "pianta" per circa una decina di minuti...
Se avessi qualcosa che funziona così sarebbe perfetto:
- ci sono 935.679 totali;
- leggo la prima riga e ti aggiorno la progress bar;
- leggo la seconda riga e ti aggiorno la progress bar;
- ...
- leggo l'N-esima riga e ti aggiorno la progress bar;
- ...
- ho finito di leggere, tolgo la progress bar ed eccoti le righe del database sulla tua pagina web
 
La situazione era già chiara fin dall'inizio e restano validi i consigli che già ho fornito. Hai un problema di fondo: stai maneggiando una quantità enorme di dati; prima ancora di pensare a barre di avanzamento e fronzoli vari, una buona strategia è la paginazione ed un eventuale filtraggio dei dati.

Alcuni riferimenti:
Paginazione dei dati con PHP e MySQL
Ajax Pagination with Search and Filter in PHP

Chiaramente fai tu quel che ti sembra meglio. Nel caso tu non abbia interesse a cambiare idea, lascio spazio ad eventuali altri interventi.

Buon proseguimento :)
 
La situazione era già chiara fin dall'inizio e restano validi i consigli che già ho fornito. Hai un problema di fondo: stai maneggiando una quantità enorme di dati; prima ancora di pensare a barre di avanzamento e fronzoli vari, una buona strategia è la paginazione ed un eventuale filtraggio dei dati.

Alcuni riferimenti:
Paginazione dei dati con PHP e MySQL
Ajax Pagination with Search and Filter in PHP

Chiaramente fai tu quel che ti sembra meglio. Nel caso tu non abbia interesse a cambiare idea, lascio spazio ad eventuali altri interventi.

Buon proseguimento :)
Beh chiaramente sono di aiuto anche i link che mi mandi, che già magari aiutano a filtrare qualcosa in più (e ti ringrazio per questo); purtroppo ho comunque operazioni da fare che coinvolgono sempre una mole impressionante di dati... quindi anche se metto tanti filtri poi alla fine devo estrarli tutti comunque... Perciò non so se c'è qualcuno che si è già imbattuto in queste cose che magari sa darmi qualche spunto nuovo :rolleyes:
 
estrarre tutte le commesse fatte a Marzo 2021. Per quanto riguarda il mio database, vengono estratte una cosa come 935.679 righe
massi paginiamo !
con 50 righe per pagina (935.679/50) verranno generate 18.714 pagine
vogliamo mettere 3 minuti per leggere una pagina (18714*3), spenderemmo 56.140 minuti equivalenti a 935 ore
di solito lavoriamo 8 ore al giorno senza interruzione (935/8), terminiamo la consultazione dopo 117 giorni lavorativi
che equivalgono a più di 5 mesi, considerando 22 giorni lavorati nel mese, in media
ed abbiamo fatto solo 1 estrazione dei dati

non sono bravo a fare i calcoli, di solito mi vengono sbagliati,

se poi la tabella deve permettere la ricerca di pochi elementi, ebbene confido nel disastro totale

ma di sicuro non ho capito niente ed é la "progress bar" la vera soluzione
 
massi paginiamo !
con 50 righe per pagina (935.679/50) verranno generate 18.714 pagine
vogliamo mettere 3 minuti per leggere una pagina (18714*3), spenderemmo 56.140 minuti equivalenti a 935 ore
di solito lavoriamo 8 ore al giorno senza interruzione (935/8), terminiamo la consultazione dopo 117 giorni lavorativi
che equivalgono a più di 5 mesi, considerando 22 giorni lavorati nel mese, in media
ed abbiamo fatto solo 1 estrazione dei dati

non sono bravo a fare i calcoli, di solito mi vengono sbagliati,

se poi la tabella deve permettere la ricerca di pochi elementi, ebbene confido nel disastro totale

ma di sicuro non ho capito niente ed é la "progress bar" la vera soluzione
I dati normalmente vengono estratti per analisi successive, sia manuali che a sistema.
Quindi non preoccuparti di quante pagine vengono generate o di quanto tempo debba investire una persona per leggerli.
Il focus della discussione è la "progressbar" (o un metodo simile), non la paginazione dei dati :confused:
 
I dati normalmente vengono estratti per analisi successive, sia manuali che a sistema.
ma non ha molto senso leggere "milionate" di righe
$result = mysqli_query($conn, "SELECT * FROM schede_plotter");
come ti é stato suggerito,
meglio creare una pagina che accetti dei filtri
e poi query mirate che possano rendere elementi molto vicini al risultato voluto

nel database sarà necessario indicizzare delle colonne per permettere ricerche veloci
e non letture sequenziali della tabella come la tua query dimostra

quindi se vuoi ottenere un buon risultato concentrati
a definire quali possono essere le query utili per i risultati attesi,
l'indicizzazione appropriata del database
e sviluppare un applicazione che in base ai filtri generi al meglio il "risultato"

Il focus della discussione è la "progressbar"
spero di no .....
 
ma non ha molto senso leggere "milionate" di righe

come ti é stato suggerito,
meglio creare una pagina che accetti dei filtri
e poi query mirate che possano rendere elementi molto vicini al risultato voluto

nel database sarà necessario indicizzare delle colonne per permettere ricerche veloci
e non letture sequenziali della tabella come la tua query dimostra

quindi se vuoi ottenere un buon risultato concentrati
a definire quali possono essere le query utili per i risultati attesi,
l'indicizzazione appropriata del database
e sviluppare un applicazione che in base ai filtri generi al meglio il "risultato"


spero di no .....
Ti spiego come sta la faccenda, se non è ancora chiaro:
- Mensilmente mi viene richiesto di estrarre TUTTI gli ordini inseriti
- Tali ordini corrispondono a delle commesse fatte in produzione, perciò dovrò estrarre TUTTI i dati relativi a quelle commesse
- Poi dovrò stabilire il margine di guadagno relativo al mese in questione

E' chiaro il fatto che devo estrarre TUTTE le commesse su base mensile? Bene.
I filtri li uso già in altre sezioni. In questa sezione mi serve qualcosa per capire com'è messo il sistema durante queste analisi.
 

Discussioni simili