Progressbar estrazione dati da tabella mySQL

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);
?>
 

WmbertSea

Moderatore
Membro dello Staff
MOD
28 Nov 2014
432
73
28
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.
 

epag8

Nuovo Utente
4 Dic 2020
8
0
1
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
 

WmbertSea

Moderatore
Membro dello Staff
MOD
28 Nov 2014
432
73
28
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 :)
 

epag8

Nuovo Utente
4 Dic 2020
8
0
1
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:
 

marino51

Utente Attivo
28 Feb 2013
3.203
207
63
Lombardia
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
 

epag8

Nuovo Utente
4 Dic 2020
8
0
1
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:
 

marino51

Utente Attivo
28 Feb 2013
3.203
207
63
Lombardia
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 .....
 

epag8

Nuovo Utente
4 Dic 2020
8
0
1
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
Autore Titolo Forum Risposte Data
A progressbar con conteggio record da una chiamata Ajax Ajax 1
ivarello Progressbar e dati background .NET Framework 1
L ProgressBar - problema caricamento Flash 3
A Problema Progressbar-albumfoto Flash 0
K Estrazione di più risultati da tabelle correlate PHP 5
L Estrazione dati php Database 6
L Estrazione dati casuali non doppioni MySQL 1
D Chiave unica in estrazione dati da array php PHP 0
L Estrazione valori max su più campi MySQL 4
M [PHP] Estrazione random con nomi presi dal db PHP 22
gandalf1959 Estrazione e visualizzazione del simbolo dell'euro php/mysqli PHP 0
ronny1710 Estrazione Dati Tessera Sanitaria .NET Framework 1
F Estrazione Email di persone selezionate e attive / facebook + invio di massa! Annunci servizi di Social Media Marketing 0
V Estrazione di una singola banda da file multi banda (RGB) con Python Programmazione 0
creatorweb [PHP] estrazione ciclica dati con 2 dati alla volta PHP 2
O [PHP] problema estrazione immagine da db PHP 12
Gigi87 [PHP] Estrazione dati da forum o da social network PHP 1
V [PHP] Estrazione con SQL PHP 1
L estrazione dati da mysql in php e salvataggio in cartella del server PHP 51
M [MS Access] Estrazione record multipli MS Access 1
E [PHP] estrazione dati in modo non continuativo PHP 1
S [PHP] estrazione dal DB complicata PHP 7
asevenx [Javascript] Estrazione dal database di un valore in base ad una scelta Javascript 7
S Php e mysql, estrazione da una tabella e inserimento in un'altra tabella PHP 14
P Probelma estrazione stringa PHP 5
C Estrazione Dati da Pagine Gialle PHP 0
L Estrazione Articoli Random da Tabella senza doppioni PHP 1
A Estrazione dati da tabella sql MySQL 27
gandalf1959 Estrazione di un singolo dato da una ricerca mysql PHP 1
T Codice per estrazione dati da db PHP 4
F estrazione codice Javascript 0
R Javascript e html - estrazione EXIF da jpg con link per geolocalizzazione google maps Javascript 0
D php estrazione random nomi e senza ripetizione PHP 14
M Problema con estrazione coordinate da google geocoding PHP 1
L Conversione date ed estrazione PHP 0
L estrazione dati per login PHP 0
W Estrazione dati da DB PHP 20
N Problemi estrazione / visualizzazione immagini dal database con PDO PHP 2
L Estrazione dati per settimana. PHP 13
L estrazione dati e immagini in contemporanea PHP 4
B Estrazione Database valori multipli MySQL 4
M estrazione dati casuali da database Database 0
A Evitare estrazione record doppioni PHP 2
C [PHP][MY SQL] - Estrazione dati database tramite form PHP 8
G estrazione dati da DB tramite PHP errore time out PHP 2
A problema estrazione singolo valore e memorizzazione in variabile PHP 1
B Estrazione dati utente loggato MySQL 1
W Estrazione dati DB da lista MySQL 1
M Connessione Database ed estrazione dati Javascript 6
H Problema riguardo l'estrazione di record dal DB tramite codice univoco PHP 7

Discussioni simili