Visualizzazione dei risultati da 1 a 7 su 7

Discussione: PHP, Array e Json

  1. #1

    PHP, Array e Json

    Buonasera a tutti, cerco la soluzione ad un problema che mi affligge da alcuni giorni. Vengo subito al cuore del problema:

    Ho un database, con all'interno una tabella ove sono registrati tutti i comuni d'Italia, oltre 7.900 record.

    Tramite Json devo interrogare da una pagina HTML, il database per recuperare i record da inserire in una select.

    La funzione di recupero scritta in javascript, mediante una richiesta ajax ad un file PHP, interroga il database. E' possibile impostare una variabile per limitare, o meno, la risposta ad una sola provincia o, con 0 (zero), tutta l'Italia.

    La risposta data dallo script PHP, mentre per una richiesta "limitata" non ha problemi, quando richiedo l'elenco di tutti i comuni, non restituisce nulla. Non fornisce errori, semplicemente la risposta Json è vuota.

    A questo punto mi sembra evidente che sia un problema di spazio di memoria, probabilmente 7900 record sono tanti da memorizzare in un array. Ho provato ad aumentare la memoria destinata al PHP, passando da 128Mb a 512Mb senza successo.

    Cosa potrebbe essere? Grazie

  2. #2
    Per completezza, allego la parte di codice in PHP:
    Codice PHP:
        if($id == 0){
            
    $query="SELECT * FROM comuni ORDER BY comune";
        }else{
            
    $query="SELECT * FROM comuni WHERE provincia = " $id " ORDER BY comune";
        }
        
    $result $connessione->query($query);


        
    $indice 0;


        while(
    $row1 $result->fetch_array(MYSQLI_ASSOC))
        {
            
    $testo[$indice] = $row1['comune'];    
            
    $valore[$indice] = $row1['id'];
            
    $indice $indice 1;
        } 


        
    $indice $indice 1;


        
    $arr = array('indice' => $indice,
                     
    'elenco' => array('testo' => $testo
                     
    'valore' => $valore)); 


        
    $data json_encode($arr); 
        echo 
    $data
    Ultima modifica di bruno.reale; 13-03-2021 a 22:18

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    192
    Codice PHP:
    error_reporting(-1);
    ini_set('display_startup_errors''1');
    ini_set('display_errors''1');
    $mmusage memory_get_usage();
    //se da fonte esterna $_GET, $_POST
    $id null;
    if(isset(
    $_GET['id']) && is_string($_GET['id'])) {
    if(
    strlen($_GET['id']) && trim($_GET['id'], '0123456789') === '' && (($id = (int) $_GET['id']) < || $id 7901)) {
    $id null;
    }
    }

    if(
    $id !== null) {
    if(
    $id == 0){
    //ovviamente dovrò inizializzare solo se id è diverso da null, qui va anche la connessione al database
    //altrimenti nulla
            
    $query="SELECT * FROM comuni ORDER BY comune";
        }else{
            
    $query="SELECT * FROM comuni WHERE provincia = '" $id "'" ' ORDER BY comune';
        }
        
    $result $connessione->query($query);


        
    $indice 0;


        while(
    $row1 $result->fetch_array(MYSQLI_ASSOC))
        {
            
    $testo[$indice] = $row1['comune'];    
            
    $valore[$indice] = $row1['id'];
            
    $indice $indice 1;
        } 


        
    $indice $indice 1;


        
    $arr = array('indice' => $indice,
                     
    'elenco' => array('testo' => $testo
                     
    'valore' => $valore)); 


        
    $data json_encode($arr); 
        
    $testo null;
        
    $valore null;
        
    $row1 null;
        
    $arr null;
        unset(
    $testo$valore$row1$arr);
        echo 
    strlen($data) . "\n";
        echo 
    $indice  "\n";
        echo 
    errors_get_last() . "\n";
        echo 
    json_last_error() . "\n";
        echo 
    $mmusage "\n";
        echo 
    memory_get_usage();

    Che output produce?
    Disattiva Opcache se abilitato.
    Dovresti anche considerare di impostare error_reporting = -1 nel tuo php.ini e display_errors = On con display_startup_errors = On se sei in modalità di sviluppo per vedere tutti gli errori fatali / di analisi o impostare error_log sul file desiderato per registrare gli errori invece di display_errors in produzione (questo richiede log_errors da accendere).
    Mentre sul server di produzione via lato server (inteso script php) potrai impostare error_reporting(0); e opzionalmente ini_set.
    Ultima modifica di darbula; 14-03-2021 a 02:17

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    192
    Prova anche a liberare memoria e chiudere la connessione al database https://www.php.net/mysqli_free_result

  5. #5
    Ciao e grazie della risposta. Se imposto manualmente $id=10, ad esempio, e richiamo lo script direttamente da browser, mi compare l'array con i comuni selezionati. Se, invece, imposto $id=0, la pagina risulta completamente vuota.
    Immagini allegate Immagini allegate
    Ultima modifica di bruno.reale; 14-03-2021 a 14:19

  6. #6
    Di seguito gli errori generati dal tuo script
    Allegato 30160

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    192
    Non vedo l'allegato con gli errori.
    Prova il mio script non devi stampare il json altrimenti occupi inutilmente memoria ma limitati alla funzione strlen come da codice per il test, quando risolvi lo modifichi nel tuo caso d'uso.
    Codice PHP:
    error_reporting(-1);
    ini_set('display_startup_errors''1');
    ini_set('display_errors''1');
    $mmusage memory_get_usage();
    //se da fonte esterna $_GET, $_POST
    $id null;
    if(isset(
    $_GET['id']) && is_string($_GET['id'])) {
    if(
    strlen($_GET['id']) && trim($_GET['id'], '0123456789') === '' && (($id = (int) $_GET['id']) < || $id 7901)) {
    $id null;
    }
    }

    //ovviamente se non esiste  $_GET['id'] sarà null $id senza impostare esplicitamente $id, il successivo esempio imposta a 0 $id manualmente.
    $id 0;
    if(
    $id !== null) {
    if(
    $id == 0){
    //ovviamente dovrò inizializzare solo se id è diverso da null, qui va anche la connessione al database
    //altrimenti nulla
            
    $query="SELECT * FROM comuni ORDER BY comune";
        }else{
            
    $query="SELECT * FROM comuni WHERE provincia = '" $id "'" ' ORDER BY comune';
        }
        
    $result $connessione->query($query);


        
    $indice 0;


        while(
    $row1 $result->fetch_array(MYSQLI_ASSOC))
        {
            
    $testo[$indice] = $row1['comune'];    
            
    $valore[$indice] = $row1['id'];
            
    $indice $indice 1;
        } 
        
    /* free result set */
        
    $result->close();

        
    /* close connection */
       //$connessione->close();


        
    $indice $indice 1;


        
    $arr = array('indice' => $indice,
                     
    'elenco' => array('testo' => $testo
                     
    'valore' => $valore)); 


        
    $data json_encode($arr); 
        
    $testo null;
        
    $valore null;
        
    $row1 null;
        
    $arr null;
        unset(
    $testo$valore$row1$arr);
        echo 
    strlen($data) . "\n";
        echo 
    $indice  "\n";
        echo 
    errors_get_last() . "\n";
        echo 
    json_last_error() . "\n";
        echo 
    $mmusage "\n";
        echo 
    memory_get_usage();

    Probabilmente il messaggio d'errore con $id 0 ti indica errore , vuole il parametro LIMIT per l'istruzione SQL SELECT, generalmente la migliore pratica è recuperare un tot per pagina "paginazione" per non appesantire la propria applicazione se non necessario.
    Se imposti $id = 10, recupera solo la provincia 10 mentre esiste la possibilità di usare range anche con SQL (questo in seguito , prima devi risolvere il problema).
    Ultima modifica di darbula; 14-03-2021 a 15:36

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.