Php aggiornamento tabella

Emanuele85

Utente Attivo
30 Gen 2021
117
0
16
Buongiorno a tutti, volevo chiedervi una info, sto facendo 1 applicazione che ha la necessità di visualizzare dei dati sulla dashboard di ogni utente. Questi dati variano a seconda delle scelte fatte. Es. Utente 1 accetta una richiesta e l'utente 2 vede che è accettata (esempio stupido ma rende l'idea). Per fare ciò ho progettato una tabella mysql con gli stati della notifica ecc... Ora se eseguo localmente la mia applicazione funziona ma se la sposto su hosting non va. La parte di codice è la seguente:

Questa è la funzione che si attiva ogni 5 secondi e chiama un file php

JavaScript:
<script type="text/javascript">
    $(document).ready(function(){
      refreshTable();
    });

    function refreshTable(){
        $('#tableHolder').load('getTable.php', function(){
           setTimeout(refreshTable, 5000);
        });
    }
</script>

getTable.php

PHP:
<?php
include('includes/dbconnection.php');
$id_gruppo_destinazione="CUCINA";
$stato_notifica=1;

$sql="SELECT notifiche.*,prodotti.*,utenti.* FROM notifiche";
$sql.=" LEFT JOIN prodotti ON notifiche.id_prodotto= prodotti.id_prodotto";
$sql.=" LEFT JOIN utenti ON notifiche.id_utente= utenti.id_utente";
$sql.=" WHERE notifiche.id_gruppo_destinazione=:id_gruppo_destinazione AND stato_notifica=:stato_notifica";
$sql.=" ORDER BY notifiche.id_ordine_temporaneo";

$query=$dbh->prepare($sql); 
$query->bindParam(':id_gruppo_destinazione',$id_gruppo_destinazione,PDO::PARAM_STR);
$query->bindParam(':stato_notifica',$stato_notifica,PDO::PARAM_STR);                 
$query->execute();
$results22=$query->fetchAll(PDO::FETCH_OBJ); 


$testo_tabella="";

$testo_tabella.="<div class=card-body table-responsive p-0 style=height: 300px;>";
$testo_tabella.="<table class=table table-head-fixed text-nowrap>";
$testo_tabella.="<thead><tr><th>Utente</th><th>Nume. Tav.</th><th>Ordine</th><th>Variazioni</th><th>Data/ora</th><th>Azioni</th></thead><tbody><tr>";


if($query->rowCount() > 0)
{ 
    

 foreach($results22 as $row)
  {       
    $testo_tabella.="<td>".$row->nome_utente.$row->cognome_utente."</td>";
    $testo_tabella.="<td>".$row->id_tavolo."</td>";
    $testo_tabella.="<td>".$row->id_ordine_temporaneo."</td>";
    $testo_tabella.="<td>".$row->variazioni_ordine."</td>";
    $testo_tabella.="<td>".$row->time_stamp_notifica."</td>";
    $testo_tabella.="<td><a class=btn btn-danger btn-sm  href=comanda_completata.php?id=".$row->id_notifica.">Eseguito</a></td></tr></tbody>";
 
}
echo ($testo_tabella);
}
?>

Non conosco (non sono esperto) altri sistemi per fare ciò, se avete qualche consiglio ben venga... ma in sostanza... dove sto sbagliando? Se aggiorno la pagina manualmente vedo i dati ma se ne inserisco di nuovi pur aggiornando non gli vedo.
come mai?

Grazie a tutti e spero di essere stato chiaro

Saluti
E
 

WmbertSea

Moderatore
Membro dello Staff
MOD
28 Nov 2014
432
73
28
Ciao, potrebbe essere un problema di cache per la pagina che stai chiamando attraverso ajax.
In genere si risolve passando all'url un valore in GET che cambia di volta in volta, ad esempio un timestamp:
JavaScript:
$('#tableHolder').load('getTable.php?nocache=' + Date.now(), function(){

Prova e fai sapere :)
 

Emanuele85

Utente Attivo
30 Gen 2021
117
0
16
Grazie mille per la risposta!!! Nel frattempo stavo provando un altro approccio al problema e sembra funzionare (almeno dai primi tests). Ti mostro il codice:

JavaScript:
<script type="text/javascript">

$(document).ready(function () { 
    
      
       myVar = setInterval(function () {
        
        $.ajax({
          type:'POST',         
          url:'getTable_notif.php',
          success: function (data) {
            $('#tableHolder').html(data);
            $('#stato').val("TRUE");
          }

       });
          
    }, 5000);
 
});

</script>

Ora vi chiedo, è giusta come soluzione? io programmo maggiormente per passione e per imparare, se ci sono altre soluzioni sono ben contento di valutarle. Detto ciò. questa soluzione potrebbe avere un problema, la latenza nella risposta. Come potrei fare per capire se il ciclo precedente è terminato? While???

Grazie mille a tutti
 

WmbertSea

Moderatore
Membro dello Staff
MOD
28 Nov 2014
432
73
28
Ora vi chiedo, è giusta come soluzione?

Non pensare sia molto differente dalla prima. Il metodo load() di jQuery non è altro che una scorciatoia del metodo ajax(), così come lo stai impostando ora.
questa soluzione potrebbe avere un problema, la latenza nella risposta. Come potrei fare per capire se il ciclo precedente è terminato? While???

Nel load() hai impostato una funzione di callback che equivale esattamente alla funzione che hai definito per la proprietà success. Entrambe sono richiamate quando si riceve una risposta positiva dal server.

Puoi quindi gestire la cosa così come hai già fatto con il load(). Se in quel caso non ti funziona, è presumibile che il problema non dipenda specificatamente dal metodo ajax usato ma piuttosto da qualche altro fattore.

L'unica differenza sostanziale che noto è il fatto che nella prima soluzione stai chiamando la funzione refreshTable() nel ready, quindi il load() viene eseguito appena il DOM è pronto, quindi ripeti la funzione dopo 5 secondi dal momento che avviene il success , mentre nella seconda soluzione stai eseguendo la chiamata ajax dopo i 5 secondi attraverso il setInterval nel ready, e quindi la chiamata viene ripetuta ogni 5 secondi a prescindere dall'esito ricevuto.

Infatti nel primo caso hai usato un setTimeout che viene eseguito solo dopo l'avvenuta del success (sempre se la chiamata è stata lanciata*)
Nel secondo caso invece stai usando un setInterval che lancia la chiamata comunque dopo ogni 5 secondi.

* ATTENZIONE: Il metodo load() lancia la chiamata ajax solo se il selettore jQuery, a cui è applicato il metodo, restituisce un qualche elemento.

Questo mi lascia pensare che il selettore $('#tableHolder') non sta trovando inizialmente l'elemento con id "tableHolder"; può essere che sia creato successivamente o che sia stato scritto male il valore dell'id, o chissà cos'altro.

In tal caso, con la prima soluzione, il ciclo di chiamate non inizierà per niente.

Mentre non è così nella seconda soluzione, perché stai già ritardando la prima chiamata (che avverrà solo dopo i primi 5 secondi), inoltre il lancio delle successive chiamate prescinde appunto dal fatto che sia stata ricevuta una qualche risposta.

Ti chiedo quindi, è possibile che l'elemento #tableHolder sia creato dopo o comunque non venga trovato per qualche motivo in un primo momento?

Puoi verificare con un console.log()?

Ad esempio metti una cosa del genere all'inizio del ready:
Codice:
$(document).ready(function () {
console.log($('#tableHolder')[0]); // l'output dovrebbe darti il riferimento a quell'elemento se esiste, altrimenti undefined
// resto dello script
}

Fai questa verifica e fai sapere.
 

Emanuele85

Utente Attivo
30 Gen 2021
117
0
16
Troppo preciso...grazie VERAMENTE!!! Quindi se ho capito bene, utilizzando onsuccess, la seconda chiamata NON aspetta l'esito della prima...e così via...di cui conseguenza mi converrebbe tornare sulla prima ipotesi...giusto???

A breve provo e ti aggiorno!!!
 

WmbertSea

Moderatore
Membro dello Staff
MOD
28 Nov 2014
432
73
28
di cui conseguenza mi converrebbe tornare sulla prima ipotesi...giusto???
Non esattamente, load() e ajax() fanno grossomodo la stessa cosa, eseguono una chiamata ajax e gestiscono comunque l'evento success anche se definito in modo differente. Ma a questo punto usare l'uno o l'altro metodo è indifferente, se non che con il load() hai uno script più stringato.

La differenza sta più che altro nel modo in cui vai ad eseguire e gestire tali chiamate ajax.

Caso 1

Hai incluso la chiamata ajax dentro una funzione (refreshTable). Questa funzione la chiami subito ad apertura pagina (quando avviene il ready) e poi la chiami successivamente quando (e se) avviene il success, per proseguire il ciclo ajax.

Questo potrebbe interrompere già in principio il ciclo di chiamate ajax perché, come già indicato, il load() esegue la chiamata ajax solo se il selettore jQuery ha un qualche riscontro, cioè se il tuo #tableHolder esiste in quel momento.

Va da sé che se, per qualche motivo, l'elemento selezionato non esiste ancora nel momento in cui applichi il load, non sarà eseguita la prima chiamata ajax e di conseguenza anche le successive dal momento che stai richiamando la funzione refreshTable attraverso l'evento success (il calback del metodo load).

Caso 2

La chiamata ajax viene eseguita solo attraverso l'intervallo. Quindi non viene eseguita inizialmente ad apertura pagina (quando avviene il ready), ma sarà lanciata dopo 5 secondi, come impostato nel setinterval.

In questo caso il metodo ajax() lancia la chiamata indipendentemente dalla presenza o no del tuo #tableHolder, infatti tale elemento lo "selezioni" poi quando avviene il success, per aggiornarne il contenuto.

Il ciclo di chiamate ajax continua a prescindere dalla risposta ricevuta, che avvenga o no il success.

Va da sé che, anche qualora il tuo elemento #tableHolder dovesse non essere presente in un primo momento, il ciclo inizia e prosegue comunque.

Per tale motivo mi viene il dubbio che l'elemento non sia trovato.
In tal caso il fattore cache (supposto da me inizialmente) potrebbe essere ininfluente.

La gestione della latenza nella risposta puoi gestirla comunque proseguendo il ciclo attraverso un setTimeout (come hai fatto nel primo caso) proseguendo il ciclo solo ad avvenuta risposta.

Tuttalpiù dovrai includere una gestione degli errori per le chiamate ajax (qualsiasi sia il metodo usato). Cioè se la chiamata restituisce un errore, dal server o perché non viene proprio eseguita, allora il ciclo dovrebbe continuare anche in tale situazione (magari impostando un tot di tentativi dopo cui mostrare una qualche avvertenza).

Ma meglio andare per gradi, per questo ti suggerisco di verificare quanto indicato.
 

Emanuele85

Utente Attivo
30 Gen 2021
117
0
16
Non pensare sia molto differente dalla prima. Il metodo load() di jQuery non è altro che una scorciatoia del metodo ajax(), così come lo stai impostando ora.


Nel load() hai impostato una funzione di callback che equivale esattamente alla funzione che hai definito per la proprietà success. Entrambe sono richiamate quando si riceve una risposta positiva dal server.

Puoi quindi gestire la cosa così come hai già fatto con il load(). Se in quel caso non ti funziona, è presumibile che il problema non dipenda specificatamente dal metodo ajax usato ma piuttosto da qualche altro fattore.

L'unica differenza sostanziale che noto è il fatto che nella prima soluzione stai chiamando la funzione refreshTable() nel ready, quindi il load() viene eseguito appena il DOM è pronto, quindi ripeti la funzione dopo 5 secondi dal momento che avviene il success , mentre nella seconda soluzione stai eseguendo la chiamata ajax dopo i 5 secondi attraverso il setInterval nel ready, e quindi la chiamata viene ripetuta ogni 5 secondi a prescindere dall'esito ricevuto.

Infatti nel primo caso hai usato un setTimeout che viene eseguito solo dopo l'avvenuta del success (sempre se la chiamata è stata lanciata*)
Nel secondo caso invece stai usando un setInterval che lancia la chiamata comunque dopo ogni 5 secondi.

* ATTENZIONE: Il metodo load() lancia la chiamata ajax solo se il selettore jQuery, a cui è applicato il metodo, restituisce un qualche elemento.

Questo mi lascia pensare che il selettore $('#tableHolder') non sta trovando inizialmente l'elemento con id "tableHolder"; può essere che sia creato successivamente o che sia stato scritto male il valore dell'id, o chissà cos'altro.

In tal caso, con la prima soluzione, il ciclo di chiamate non inizierà per niente.

Mentre non è così nella seconda soluzione, perché stai già ritardando la prima chiamata (che avverrà solo dopo i primi 5 secondi), inoltre il lancio delle successive chiamate prescinde appunto dal fatto che sia stata ricevuta una qualche risposta.

Ti chiedo quindi, è possibile che l'elemento #tableHolder sia creato dopo o comunque non venga trovato per qualche motivo in un primo momento?

Puoi verificare con un console.log()?

Ad esempio metti una cosa del genere all'inizio del ready:
Codice:
$(document).ready(function () {
console.log($('#tableHolder')[0]); // l'output dovrebbe darti il riferimento a quell'elemento se esiste, altrimenti undefined
// resto dello script
}

Fai questa verifica e fai sapere.

Ho fatto il test con log, e in effetti se verifico da console vedo esattamente la tabella, quindi esito OK. Ma non capisco per quale assurdo motivo non funziona se lo metto on line!! E' come se aggiorna la prima volta e poi basta!!! Quindi, in locale funziona e su hosting no. Invece il secondo caso (chiamata onsuccess) funziona perfettamente sia in locale che on line.

Misteri (almeno per noi comuni mortali :) ).
 

WmbertSea

Moderatore
Membro dello Staff
MOD
28 Nov 2014
432
73
28
Bisognerebbe fare qualche verifica per capire cosa sta avvenendo.
Puoi postare il link alla pagina o ad un esempio?
 

Emanuele85

Utente Attivo
30 Gen 2021
117
0
16
Posso inviarti quello che vuoi, ma dovrei darti le credenziali di accesso. mi dai il tuo ind. mail?
 
Discussioni simili
Autore Titolo Forum Risposte Data
S [PHP] aggiornamento table tramite select senza ricaricare la pagina PHP 5
Y [PHP] Aggiornamento sito PHP 8
D [WordPress] Aggiornamento a php 5.6 causa blackout del sito WordPress 2
alessandroz Select ... where... AND... aggiornamento PHP non funziona PHP 9
M [PHP] Far rimanere biffata checkbox dopo aggiornamento pagina PHP 24
M alert dopo aggiornamento automatico pagina php PHP 4
crealatualista [PHP] Aggiornamento data e ora PHP 2
V [PHP] aggiornamento automatico immagini sito web PHP 3
P [PHP] Loop WHILE aggiornamento campi e tabelle. PHP 2
M Aggiornamento pagina php con ajax Ajax 2
F Aggiornamento variabili php PHP 1
B Auto-aggiornamento DIV con php+ayax PHP 1
lab php e html - inserimento di dati in database e aggiornamento della pagina html PHP 2
EffeElle Problema per una query di aggiornamento record php PHP 35
M Aggiornamento librerie php da versione 4. a versione 5. PHP 2
A Ajax php mysql - problema aggiornamento dati Ajax 2
F Cerco Hosting con VECCHIE versioni di php Hosting 0
Cosina Captcha php PHP 1
S passare un valore da un form a un file .php con metodo post PHP 4
N php msyql PHP 6
N php problemi a visualizzare video PHP 3
A menu a tendina php PHP 1
D protezione cartelle: blocco visualizzazione/scaricamento contenuto, ma abilitazione utilizzo dati da parte di file .php presenti sul sito Web Server 1
F Php date_diff PHP 1
K [PHP] Aggiungere caratteri ad una stringa in base alla lunghezza della stessa PHP 2
C Wp-admin a file php WordPress 5
Lino80 [Retribuito] Cerco programmatore php per modifica/inserimento funzione/valori da un plugin importer wordpress Offerte e Richieste di Lavoro e/o Collaborazione 0
csi Inviare file jpg in locale alla stampante con php PHP 0
M Passaggio variabili array php su un tasto jq PHP 3
G phpmailer e php 8.1 con estensione mysqli PHP 6
M Invio dati database via email php PHP 0
K [php] Problema con inner join PHP 4
K [php]form invio dati PHP 0
P Codifica caratteri speciali mysql php PHP 0
K [PHP] Problema con variabili concatenate. PHP 1
E Stampante termica escpos-php PHP 6
JeiMax Modifica codice php personalizzato PHP 2
G Come modificare un pdf in php PHP 1
U Link a doppio file PHP PHP 0
E PHP & jQuery PHP 8
N Passare array da php a javascript PHP 5
F Applicazione PHP/MySQL per prenotazioni: limitare il numero massimo di posti prenotabili PHP 20
L tipo boolean non funzionante su mariadb (mysql). E codice php 7.4. PHP 0
U PHP creare un file excel dopo ricerca nel DB PHP 0
M PHP/MySQL - Estrarre valori min e max di ogni gruppo PHP 5
F Php e fatturazione elettronica PHP 0
P lanciare script asp (o php) da jquery Javascript 1
Couting95 inserire dati da un file di testo in una tabella in php PHP 1
P Data scraping in PHP non funziona PHP 4
C Calcoli matematici in php PHP 5

Discussioni simili