Lettura DB da file PHP e scrittura MySql

Collapse
X
 
  • Filter
  • Ora
  • Show
Clear All
new posts
  • Sergio
    Administrator
    • May 1999
    • 88737
    • 2,411
    • 3,367
    • 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($handle, 8192);
      }
       $contents .= $data;
    
    fclose($handle);
    echo"$contents"; 
    
    Poi pensavo di usare un explode()



  • Sergio
    Administrator
    • May 1999
    • 88737
    • 2,411
    • 3,367
    • 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($values, 0, -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
        • 88737
        • 2,411
        • 3,367
        • 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, 09: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
            • 88737
            • 2,411
            • 3,367
            • 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($handle, 8192);
                 }
                  $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
                • 88737
                • 2,411
                • 3,367
                • 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($values, 0, -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, 12: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
                        • 88737
                        • 2,411
                        • 3,367
                        • 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
                          • 88737
                          • 2,411
                          • 3,367
                          • 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
                              • 88737
                              • 2,411
                              • 3,367
                              • 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