PROBLEMA Php e mysql non carica i dati all'aperura della pagina

jonni

Nuovo Utente
11
1
Ciao a tutti,

ho un problema con un sito web che sto scrivendo, in poche parole all'apertura della pagina uno script php deve recuperare tutti i dati degli utenti presenti al momento e fare una lista, in alternativa dovrebbe far vedere un messaggio in cui dice che non c'è nessuno presente.



Codice:
$mysqli = new mysqli('localhost', 'sito_prenotazione', 'prova', 'aule_studenti');
if ($mysqli->connect_error) {
    echo '<div class="alert alert-danger mt-5 mx-auto col-md-5" role="alert">
    Spiacenti non è stato possibile contattare il server.</br> Preghiamo di riprovare più tardi. </br>
    Se il problema dovesse persistere si prega di contattare aulestudenti@gmail.com
  </div>'; }

  $now = new DateTime();
  $giorno = $now->format('Y-m-d');
  $ora = $now->format('H:i');







 
    $lista = $mysqli -> query("SELECT nome, cognome, tesserati.tessera, volontario, pagamento  FROM tesserati JOIN presenza  ON tesserati.tessera = presenza.tessera WHERE '$ora' > ora_inizio AND '$ora' < ora_fine AND data = '$giorno' ");
    if($lista -> num_rows > 0){
        echo '<div class="accordion col-md-8 mx-auto mt-5" id="accordionPanelsStayOpenExample">';
        while($row = $lista->fetch_array(MYSQLI_ASSOC)){
             // default su si perchè viene modificato solamente in caso di pagamento non effettuato
            echo '
            <div class="accordion-item">
            <h2 class="accordion-header" id="panelsStayOpen-heading'.$row["tessera"].'">
              <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#panelsStayOpen-collapse'.$row["tessera"].'" aria-expanded="true" aria-controls="panelsStayOpen-collapse'.$row["tessera"].'">'
                .$row["nome"]. '  '.$row["cognome"];
                if($row["volontario"] != 0){
                    echo '<span class=" badge rounded-pill bg-success ms-2">volontario</span>';
                }
               if(!$row["pagamento"]){
                    echo '<span class=" badge rounded-pill bg-danger ms-2">Pagamento</span>';
                }

                echo '
              </button>
            </h2>
            <div id="panelsStayOpen-collapse'.$row["tessera"].'" class="accordion-collapse collapse " aria-labelledby="panelsStayOpen-heading'.$row["tessera"].'">
              <div class="accordion-body">
                <ul class="list-group">
                <li class="list-group-item"> Tessera:  '.$row["tessera"].'</li>
              </ul>
              </div>
            </div>
          </div>
            ';
        }

        echo '</div>';

   

    }else{
        echo '<div class="alert alert-danger mt-5 mx-auto col-md-5" role="alert" >
              Nessuno presente.
               </div>';
    }

Fino a quando testo il sito in locale funziona (anche se magari devo refreshare un paio di volte prima di vedere la pagina. Ma quando lo provo su siteground vedo solo il messaggio che dice che nessuno è presente. In una altra pagina molto simile ho lo stesso identico problema solo che in quel caso c'è anche un form che quando viene inviato fa funzionare anche tutto il resto e non so perchè dato che non dovrebbero essere collegate le due cose.

Premetto che non conosco bene il php quindi se doveste avere qualunque altro consiglio sarò ben felice di acettarlo
 

Moffetta88

Moderatore
Staff Forum
Utente Èlite
20,465
12,880
CPU
i5-4690
Dissipatore
DEEPCOOL CAPTAIN 240EX
Scheda Madre
MSI Z97 U3 PLUS
HDD
KINGSTON SSD KC400 240GB
RAM
24GB BALLISTIX SPORT @2133MHz
GPU
STRIX GTX980 DC2OC
Audio
INTEGRATA
Monitor
AOC G2590VXQ
PSU
BEQUIET! System Power 7 500W
Case
DEEPCOOL MATREXX 55
Periferiche
NESSUNA
Net
EOLO 100
OS
UBUNTU/WINDOWS11
Odio le query in php fatte così, non hai controllo sugli errori...
Inoltre non vedo da nessuna parte un eventuale $mysqli -> close();
Per fare un debug e vedere dove sta il problema, dovresti fare una cosa del genere
PHP:
if (!$mysqli->query("QUERY CHE VUOI FARE")) {
    printf("ERRORE: %s\n", $mysqli->error);
}
Facendo così ti stampa l'errore nel caso in cui ci siano dei problemi
 

jonni

Nuovo Utente
11
1
c'era fino a quando lo testavo su localhost in realtà, magari provo a riintrodurlo per vedere se da qualche errore sul server.

In realtà non avevo visto da nessuna parte $mysqli -> close(). è necessario chiudere il collegamento con il database?
 

Ibernato

Utente Èlite
4,328
2,047
OS
Windows 10 Pro / Ubuntu 22.04
c'era fino a quando lo testavo su localhost in realtà, magari provo a riintrodurlo per vedere se da qualche errore sul server.

In realtà non avevo visto da nessuna parte $mysqli -> close(). è necessario chiudere il collegamento con il database?
È utile per rilasciare le risorse, soprattutto in ambienti concorrenti dove possono accedere molti utenti.
 

jonni

Nuovo Utente
11
1
ah ok grazie mille, allora lo inserirò subito nelle pagine

per quanto riguarda il problema che si verifica invece hai in mente da cosa possa dipendere? non mi da nessun errore.
credo però possa essere un problema di cache perchè se cancello la cache dinamica da siteground aggiorna subito dopo. non c'è un modo per cancellarla tutte le volte che apro la pagina?
 
Ultima modifica:

Ibernato

Utente Èlite
4,328
2,047
OS
Windows 10 Pro / Ubuntu 22.04
ah ok grazie mille, allora lo inserirò subito nelle pagine

per quanto riguarda il problema che si verifica invece hai in mente da cosa possa dipendere? non mi da nessun errore.
credo però possa essere un problema di cache perchè se cancello la cache dinamica da siteground aggiorna subito dopo. non c'è un modo per cancellarla tutte le volte che apro la pagina?
Altro suggerimento utile:
Non fare tante query in tante pagine. Piuttosto, creati una classe Database dove dentro inserisci i dati per connetterti al DB e nel costruttore inizializzi l'oggetto. Poi ti crei i metodi connect e disconnect, oltre ai metodi per fare le query.
Così hai un codice in un unico file PHP ed è più pulito :)
P.S: come suggerito da @Moffetta88 gestisci gli errori delle query per segnalare i messaggi opportuni a chi visita il sito.
 

jonni

Nuovo Utente
11
1
Ok
Altro suggerimento utile:
Non fare tante query in tante pagine. Piuttosto, creati una classe Database dove dentro inserisci i dati per connetterti al DB e nel costruttore inizializzi l'oggetto. Poi ti crei i metodi connect e disconnect, oltre ai metodi per fare le query.
Così hai un codice in un unico file PHP ed è più pulito :)
P.S: come suggerito da @Moffetta88 gestisci gli errori delle query per segnalare i messaggi opportuni a chi visita il sito.

Ok grazie mille. È un po' più strutturale purtroppo come modifica e mi ci vorrà del tempo la inserirò in future versioni, adesso mi serve qualcosa di funzionante rapidamente purtroppo.

Comunque ho scoperto che il problema era di memoria cache automatica di site ground. Disattivandola ora funziona.

Avete qualche consiglio invece per fare velocemente la sanificazione degli input per impedire SQL ijections? Per ora mi sono limitato a un White listing molto stringente dato che alla fine devo gestire solo nomi cognomi e numeri. Però non vorrei avere problemi a cui non ho pensato
 

Ibernato

Utente Èlite
4,328
2,047
OS
Windows 10 Pro / Ubuntu 22.04
Ok


Ok grazie mille. È un po' più strutturale purtroppo come modifica e mi ci vorrà del tempo la inserirò in future versioni, adesso mi serve qualcosa di funzionante rapidamente purtroppo.

Comunque ho scoperto che il problema era di memoria cache automatica di site ground. Disattivandola ora funziona.

Avete qualche consiglio invece per fare velocemente la sanificazione degli input per impedire SQL ijections? Per ora mi sono limitato a un White listing molto stringente dato che alla fine devo gestire solo nomi cognomi e numeri. Però non vorrei avere problemi a cui non ho pensato
Per la sql injection si usano i prepared statement https://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php
 
  • Mi piace
Reazioni: Moffetta88

Moffetta88

Moderatore
Staff Forum
Utente Èlite
20,465
12,880
CPU
i5-4690
Dissipatore
DEEPCOOL CAPTAIN 240EX
Scheda Madre
MSI Z97 U3 PLUS
HDD
KINGSTON SSD KC400 240GB
RAM
24GB BALLISTIX SPORT @2133MHz
GPU
STRIX GTX980 DC2OC
Audio
INTEGRATA
Monitor
AOC G2590VXQ
PSU
BEQUIET! System Power 7 500W
Case
DEEPCOOL MATREXX 55
Periferiche
NESSUNA
Net
EOLO 100
OS
UBUNTU/WINDOWS11

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili