Lettura DB da file PHP e scrittura MySql

Collapse
X
 
  • Filter
  • Ora
  • Show
Clear All
new posts
  • Sergio
    Administrator
    • May 1999
    • 88049
    • 2,171
    • 2,795
    • United States [US]
    • Florida
    • Send PM

    Lettura DB da file PHP e scrittura MySql

    Questa è tosta (per lo meno per me).

    Devo leggere un DB che mi passa un url : www.sito.com/file.php in formato testo, separato da caratteri particolari, il file è di 2 mega circa con i campi separati da un ";" ed i record separati da un \return.

    Sono partito così :
    Codice PHP:
    $handle fopen("http://www.sito.com/file.php""rb");
    $contents '';
    while (!
    feof($handle))  {
       
    $contents .=fread($handle8192);
      }
       
    $contents .= $data;

    fclose($handle);
    echo
    "$contents"
    Poi pensavo di usare un explode()



  • Sergio
    Administrator
    • May 1999
    • 88049
    • 2,171
    • 2,795
    • United States [US]
    • Florida
    • Send PM

    #2
    Ho trovato uno script interessante che modificherò un pò.
    Codice PHP:
    <?php 
    ################################ 
    ##        CONFIGURAZIONE      ## 
    ################################ 
    //imposta opportunamente le variabili qui sotto 

    $_CFG['file'] = 'file.txt'
    $_CFG['separatore'] = ','
    $_CFG['db_host'] = 'localhost'
    $_CFG['db_user']  = 'root'
    $_CFG['db_pwd']  = 'root'
    $_CFG['db_name'] ='database'
    $_CFG['db_table'] =  'tabella'
    ################################ 
    ##    FINE  CONFIGURAZIONE    ## 
    ################################ 
    //non modificare qui sotto 
    function mysql_table_exists($database$tableName

       
    $tables = array(); 
       
    $tablesResult mysql_query("SHOW TABLES FROM $database;"); 
       while (
    $row mysql_fetch_row($tablesResult)) $tables[] = $row[0]; 
       return(
    in_array($tableName$tables)); 


    ob_start(); 
    if(!
    file_exists($_CFG['file']) || !is_readable($_CFG['file'])) 
     { 
       echo 
    "Impossibile aprire in lettura il file di input ({$_CFG['file']})<br />controllare la configurazione dello script"
       exit; 
     } 
     @
    mysql_connect($_CFG['db_host'],$_CFG['db_user'],$_CFG['db_pwd']) or die("Impossibile connettersi a mysql, verificare host username e password<br />".mysql_error()); 
    @
    mysql_select_db($_CFG['db_name'])or die("Impossibile selezionare il database \"{$_CFG['db_name']}\""); 
    if(!
    mysql_table_exists($_CFG['db_name'],$_CFG['db_table'])) 

       echo 
    "Impossibile trovare la tabella \"{$_CFG['db_table']}\" nel database \"{$_CFG['db_name']}\"<br />controllare la configurazione dello script"
       exit; 


    $righe file($_CFG['file']); 
    $newrighe = array(); 
    foreach (
    $righe as $riga) if(trim($riga) !=''
        
    $newrighe[] = $riga

     echo 
    'Inserimento di '.count($newrighe).' record in corso....<br />'
    flush(); 
    ob_flush(); 
    $ins 0
    foreach (
    $newrighe as $riga

      
    $contenuto explode($_CFG['separatore'],$riga); 
      
    $values=''
      foreach (
    $contenuto as $elem
         
    $values .= "'".mysql_escape_string($elem)."',"
      
    $values substr($values0, -1); 
      
    $sql =  "INSERT INTO `{$_CFG['db_table']}` VALUES ($values);"
      if(!
    mysql_query($sql)) echo "problemi con la query \"$sql\"<br />motivo: <b>".mysql_error().'</b><br /><br />'
      else 
    $ins++; 

    mysql_close(); 
    echo 
    "Inseriti con successo $ins record"
    ?>



    Commenta

    • Albe
      Mental Case
      • Dec 2000
      • 18165
      • 466
      • 178
      • nella mia mente
      • Send PM

      #3
      spiegati meglio, in pratica quello che ricevi è un tracciato record per poter creare una tabella in mysql ?
      Powerlifting instructor level III FIPL/AIF
      Certified Personal Trainer by International Sports Sciences Association
      Master Slim coach by 4move

      CONTATTI: tecalbe@hotmail.it / Facebook
      / Blog personale

      Commenta

      • Sergio
        Administrator
        • May 1999
        • 88049
        • 2,171
        • 2,795
        • United States [US]
        • Florida
        • Send PM

        #4
        Si, è un file di testo in forma sequenziale dove i campi sono separati da appositi "separatori".



        Commenta

        • Albe
          Mental Case
          • Dec 2000
          • 18165
          • 466
          • 178
          • nella mia mente
          • Send PM

          #5
          gli ho dato un occhiata mi sembra corretto lo script..
          il file di testo però deve avere necessarimente tutti i campi della tabella se scrivi cosi la query
          Last edited by Albe; 04-04-2006, 10:20:03.
          Powerlifting instructor level III FIPL/AIF
          Certified Personal Trainer by International Sports Sciences Association
          Master Slim coach by 4move

          CONTATTI: tecalbe@hotmail.it / Facebook
          / Blog personale

          Commenta

          • Sergio
            Administrator
            • May 1999
            • 88049
            • 2,171
            • 2,795
            • United States [US]
            • Florida
            • Send PM

            #6
            Originariamente Scritto da Albe
            gli ho dato un occhiata mi sembra corretto lo script..
            il file di testo però deve avere necessarimente tutti i campi della tabella se scrivi cosi la query
            Difatti mi dava degli errori per quel motivo li... ecco una correzione da potere fare.



            Commenta

            • Ayurvedi77
              Bodyweb Senior
              • Apr 2002
              • 1632
              • 19
              • 6
              • Pisa
              • Send PM

              #7
              Originariamente Scritto da Sergio
              Questa è tosta (per lo meno per me).

              Devo leggere un DB che mi passa un url : www.sito.com/file.php in formato testo, separato da caratteri particolari, il file è di 2 mega circa con i campi separati da un ";" ed i record separati da un \return.

              Sono partito così :
              Codice PHP:
              $handle fopen("http://www.sito.com/file.php""rb");
               
              $contents '';
               while (!
              feof($handle))  {
                  
              $contents .=fread($handle8192);
                 }
                  
              $contents .= $data;
               
               
              fclose($handle);
               echo
              "$contents"
              Poi pensavo di usare un explode()
              Lo script che hai postato successivamente sembra corretto, ma scusa una cosa: questa operazione sul file in questione sarà ripetuta nel tempo o la farai soltanto una volta?
              ___________________


              Codice:
              apt-get remove brain
              apt-get install windows-Vista
              ___________________

              Commenta

              • Sergio
                Administrator
                • May 1999
                • 88049
                • 2,171
                • 2,795
                • United States [US]
                • Florida
                • Send PM

                #8
                Originariamente Scritto da Ayurvedi77
                Lo script che hai postato successivamente sembra corretto, ma scusa una cosa: questa operazione sul file in questione sarà ripetuta nel tempo o la farai soltanto una volta?
                Ripetuta, una volta al giorno od una volta a settimana.



                Commenta

                • Ayurvedi77
                  Bodyweb Senior
                  • Apr 2002
                  • 1632
                  • 19
                  • 6
                  • Pisa
                  • Send PM

                  #9
                  Ah ok
                  Facci sapere come va con quello script!
                  ___________________


                  Codice:
                  apt-get remove brain
                  apt-get install windows-Vista
                  ___________________

                  Commenta

                  • zuperman
                    Zuper Hero
                    • May 2003
                    • 17204
                    • 364
                    • 274
                    • Burundi/usr/bin
                    • Send PM

                    #10
                    Che ne pensi di questo?
                    Codice PHP:
                    <?                     
                       mysql_connect('localhost', 'user', 'pass');   
                       mysql_select_db('nome_database');          
                       mysql_query("LOAD DATA LOCAL INFILE 'marchette.csv' INTO TABLE statistiche_puttanone FIELDS TERMINATED BY "," LINES TERMINATED BY "\\r\\n";');
                    ?>

                    Originariamente Scritto da Sergio
                    Ho trovato uno script interessante che modificherò un pò.
                    Codice PHP:
                    <?php 
                        
                    ################################ 
                        ##        CONFIGURAZIONE      ## 
                        ################################ 
                        //imposta opportunamente le variabili qui sotto 
                        
                        
                    $_CFG['file'] = 'file.txt'
                        
                    $_CFG['separatore'] = ','
                        
                    $_CFG['db_host'] = 'localhost'
                        
                    $_CFG['db_user']  = 'root'
                        
                    $_CFG['db_pwd']  = 'root'
                        
                    $_CFG['db_name'] ='database'
                        
                    $_CFG['db_table'] =  'tabella'
                        
                    ################################ 
                        ##    FINE  CONFIGURAZIONE    ## 
                        ################################ 
                        //non modificare qui sotto 
                        
                    function mysql_table_exists($database$tableName
                        { 
                           
                    $tables = array(); 
                           
                    $tablesResult mysql_query("SHOW TABLES FROM $database;"); 
                           while (
                    $row mysql_fetch_row($tablesResult)) $tables[] = $row[0]; 
                           return(
                    in_array($tableName$tables)); 
                        } 
                        
                        
                    ob_start(); 
                        if(!
                    file_exists($_CFG['file']) || !is_readable($_CFG['file'])) 
                         { 
                           echo 
                    "Impossibile aprire in lettura il file di input ({$_CFG['file']})<br />controllare la configurazione dello script"
                           exit; 
                         } 
                         @
                    mysql_connect($_CFG['db_host'],$_CFG['db_user'],$_CFG['db_pwd']) or die("Impossibile connettersi a mysql, verificare host username e password<br />".mysql_error()); 
                        @
                    mysql_select_db($_CFG['db_name'])or die("Impossibile selezionare il database \"{$_CFG['db_name']}\""); 
                        if(!
                    mysql_table_exists($_CFG['db_name'],$_CFG['db_table'])) 
                        { 
                           echo 
                    "Impossibile trovare la tabella \"{$_CFG['db_table']}\" nel database \"{$_CFG['db_name']}\"<br />controllare la configurazione dello script"
                           exit; 
                        } 
                        
                        
                    $righe file($_CFG['file']); 
                        
                    $newrighe = array(); 
                        foreach (
                    $righe as $riga) if(trim($riga) !=''
                            
                    $newrighe[] = $riga
                        
                         echo 
                    'Inserimento di '.count($newrighe).' record in corso....<br />'
                        
                    flush(); 
                        
                    ob_flush(); 
                        
                    $ins 0
                        foreach (
                    $newrighe as $riga
                        { 
                          
                    $contenuto explode($_CFG['separatore'],$riga); 
                          
                    $values=''
                          foreach (
                    $contenuto as $elem
                             
                    $values .= "'".mysql_escape_string($elem)."',"
                          
                    $values substr($values0, -1); 
                          
                    $sql =  "INSERT INTO `{$_CFG['db_table']}` VALUES ($values);"
                          if(!
                    mysql_query($sql)) echo "problemi con la query \"$sql\"<br />motivo: <b>".mysql_error().'</b><br /><br />'
                          else 
                    $ins++; 
                        } 
                        
                    mysql_close(); 
                        echo 
                    "Inseriti con successo $ins record"
                        
                    ?>
                    Last edited by zuperman; 05-04-2006, 13:14:50.
                    Allenamento e dieta fanno di te un atleta

                    Commenta

                    • Ayurvedi77
                      Bodyweb Senior
                      • Apr 2002
                      • 1632
                      • 19
                      • 6
                      • Pisa
                      • Send PM

                      #11
                      E' sicuramente più stringato, però non dà in output nessun messaggio di eventuali errori. Dipende Sergio come lo userà!
                      ___________________


                      Codice:
                      apt-get remove brain
                      apt-get install windows-Vista
                      ___________________

                      Commenta

                      • Sergio
                        Administrator
                        • May 1999
                        • 88049
                        • 2,171
                        • 2,795
                        • United States [US]
                        • Florida
                        • Send PM

                        #12
                        Originariamente Scritto da zuperman
                        Che ne pensi di questo?
                        Codice PHP:
                        <?                     
                           mysql_connect('localhost', 'user', 'pass');   
                           mysql_select_db('nome_database');          
                           mysql_query("LOAD DATA LOCAL INFILE 'marchette.csv' INTO TABLE statistiche_puttanone FIELDS TERMINATED BY "," LINES TERMINATED BY "\\r\\n";');
                        ?>
                        Ma che è un colpo di genio ?
                        Carica solo file in locale o eissite una funzione per file remoti ?
                        Non che sia un problema, lo scarico e lo scrivo...



                        Commenta

                        • Sergio
                          Administrator
                          • May 1999
                          • 88049
                          • 2,171
                          • 2,795
                          • United States [US]
                          • Florida
                          • Send PM

                          #13
                          Ma esiste la funzione SQL "LOAD DATA LOCAL INFILE"?
                          Io non l'ho trovata nella documentazione del MySql



                          Commenta

                          • Ayurvedi77
                            Bodyweb Senior
                            • Apr 2002
                            • 1632
                            • 19
                            • 6
                            • Pisa
                            • Send PM

                            #14
                            Ok ho fatto una breve ricerca, la funzione come ricordavo esiste ma NON è utilizzabile se non dal prompt di MySQL.
                            In PHP devi NECESSARIAMENTE usare uno script apposito come quello da te postato!
                            Per maggiori info:
                            ___________________


                            Codice:
                            apt-get remove brain
                            apt-get install windows-Vista
                            ___________________

                            Commenta

                            • Sergio
                              Administrator
                              • May 1999
                              • 88049
                              • 2,171
                              • 2,795
                              • United States [US]
                              • Florida
                              • Send PM

                              #15
                              Ottimo... chissà che stasera non riesco a finirlo sto script...

                              Per ora mi segnla degli errori e non importa tutto, credo per via del diverso numero di field in ogni record, al momento dell'inserimento segnala questo errore : "Column count doesn't match value count at row"

                              Poi porca miseria hanno scelto un triplo delimitatore che però all'inizio ed alla fine non vien usato, ";" doppio apice punto e virgola doppio apice, faccio un esempio di una riga (record) :

                              "sergio";"longhi";"via barbiana 7";"Cotignola";"48018";



                              Commenta

                              Working...
                              X