[ Ekonomist30 @ 21.06.2012. 11:37 ] @
Pozdrav svima

Pitanje je sljedece - csv fajl se uploaduje u root servera.
Sada podatke iz tog csv fajla treba preko php skripte, ajde nazovimo je import.php importovati u MySQL tabelu.

Ono za sta mi treba pomoc je sljedece: Ja imam skriptu koja koristi upload formu za upload csv fajla i onda ga importuje u bazu; ali interesuje me da li se neko od vas susretao sa potrebom, odnosno kako da importujem preko PHPa u bazu csv fajl koji je VEC NA SERVERU?

Zamislio sam to ovako - uploadujem csv, cron pokrene import.php, on prepozna da li je csv datoteka na serveru i ako jeste napravi import.

Hvala vam na pomoci, svaka je dobrodosla.

Ovo je neki okvirni kod koji sam zamislio, pa bih molio da mi pomognete, jer sve sto dobijem je da mi obrise podatke iz tabele a zatim ne insertuje zapise iz csv fajla??!!!

Code:
<?php 

//Definisanje konekcije na bazu//

define('DB_SERVER', 'localhost');
define('DB_USER', 'database-username');
define('DB_PASSWORD', 'password');
define('DB_NAME', 'database-name');
 
@$conn = mysql_connect (DB_SERVER, DB_USER, DB_PASSWORD);
mysql_select_db (DB_NAME,$conn);
if(!$conn){
    die( "Ne mogu se konektovati na bazu.");
}
     
    // tabele u koje importujem podatke iz CSV fajla 
    $table = array( 
                    'tabela1', 
                    'tabela2', 
                    'tabela3', 
                    'tabela4', 
                    'tabela5', 
            ); 
             
    // ako je prva kolona u csv fajlu predstavlja nazive polja onda: 
    // $columnheadings=1 
    // a ako ne predstavlja onda: 
    // $columnheadings=0 
    $columnheadings = 0; 

    // email adresa na koju se salju rezultati 
    $emailaddress = "[email protected]"; 

    // naziv email poruke 
    $subject = "CSV Import u bazu"; 

    // email adresa za polje FROM:
    $emailfrom = "[email protected]"; 
     
    //izvodjenje operacija za sve array tebele
    foreach ($table as $tablename) { 
         
        //praznjenje tabele; po potrebi;// 
        $deleterecords = "TRUNCATE TABLE `$tablename`"; 
        mysql_query($deleterecords); 
         
        //brojaci uspjesnog i neuspjesnog importa 
        $pass = 0; 
        $fail = 0; 
         
        //csv fajl ima isti naziv kao tabela
        //delimiter je zarez, sa sitim rasporedom kao i tabela u bazi 
        //nalazi se u istom direktoriju kao i ova skripta
        $filecontents = file ("$tablename.csv"); # .csv je dodat uz naziv tabele radi provjere imena 
         
        // svaki zapis iz csv-a ce biti dodat u tabelu osim ako ne dodje do greske pri uvozu
        for($i=$columnheadings; $i<sizeof($filecontents); $i++) { 
            $insertrecord = "Insert Into `$tablename` Values ($filecontents[$i])"; 
            mysql_query($insertrecord); 
            if(mysql_error()) { 
                $fail += 1;     //povecava se ako dodje do greske pri uvozu
            } 
            else 
            { 
                $pass += 1;        //povecava se ako je uvoz uspio 
            } 
        } 
         
        // dodaje linije uz email poruku o tome kako je import izvrsen 
        // te koliko je zapisa imalo gresku 
        $message .= "Table $tablename: Success=$pass  Failure=$fail \n"; 
    } 

    //vrijeme pokretanja skripte
    $runtime = (date("d M Y H:i")); 
     
    //vrijeme cron posla 
    $message .= "\nTime of the message: $runtime (server time zone)\n\n"; 
     
    //slanje email poruke 
    mail($emailaddress, $subject, $message, "From: '$emailfrom'"); 

?>


[Ovu poruku je menjao Ekonomist30 dana 21.06.2012. u 13:13 GMT+1]

[Ovu poruku je menjao Ekonomist30 dana 21.06.2012. u 13:14 GMT+1]

[Ovu poruku je menjao Ekonomist30 dana 21.06.2012. u 13:37 GMT+1]
[ kiklop74 @ 21.06.2012. 19:00 ] @
Komplikuješ bez potrebe. MySQL može direktno da importuje CSV.

http://dev.mysql.com/doc/refman/5.0/en/load-data.html
[ Ekonomist30 @ 21.06.2012. 21:39 ] @
Ne komplikujem ja nista, mislim stvarno :)
Jel vidis ti kod? I onda mi dajes linkove koji vide na objasnjenje kako se importuje direktno u MySQL. Ma nemoj me zezati? Eto, hvala ti, stvarno
[ kiklop74 @ 21.06.2012. 22:31 ] @
:) OK nisi shvatio poruku.

Code:


$filename = 'somefile.csv';
$fields = 'field1, field2, field3';
foreach($tables as $table) {
     $query = "LOAD DATA LOCAL INFILE 
                      '{$filename}' 
                      INTO TABLE {$table}
                      CHARACTER SET latin1
                      FIELDS TERMINATED BY ','
                      OPTIONALLY ENCLOSED BY '\"'
                      LINES TERMINATED BY '\n'
                      ({$fields})
                      ";
   mysql_query($query);
}



Ovaj kod radi principijelno isto sto i tvoj samo brze i uz manje koda.
[ Ekonomist30 @ 21.06.2012. 22:47 ] @
Hvala ti u svakom slucaju, ti si se bar potrudio da budes od pomoci.
Istina je da je kod koji si naveo jednostavniji, ali ne sluzi svrsi. Ali evo zavrsio sam svoj kod koji radi, pa mozes pogledati. Hvala ti svakako.

Code:
<?php 
    # Author: Sanel
    # Email: [email protected] 
    
      
    # Skripta za import podataka u MySQL bazu iz .CSV datoteke 
    
    //Definisanje konekcije na bazu//

    define('DB_SERVER', 'host');
    define('DB_USER', 'user baze');
    define('DB_PASSWORD', 'lozinka');
    define('DB_NAME', 'ime_baze_na_koju_se_konektujemo');
 
    @$conn = mysql_connect (DB_SERVER, DB_USER, DB_PASSWORD);
    mysql_select_db (DB_NAME,$conn);
    if(!$conn){
    die( "Ne mogu se konektovati na bazu.");
}
      
    # Definisanje tabele/tabela u koje ce biti izvrsen uvoz - neogranicen broj...
    $table = array( 
                    'tabela1', 
            ); 


    # Email adresa na koju se salju rezultati importa 
    $emailaddress = "[email protected]"; 

    # Naziv email-a 
    $subject = "CSV Import"; 

    # Email adresa sa koje se salju rezultati 
    $emailfrom = "admin adresa na serveru"; 
      
# Kod ispod se ne mjenja 


    # Provjera za svaku tabelu definisanu kao array
    foreach ($table as $tablename) { 
          
        # DROP podataka iz tabele, ali ako se radi samo update, onda komentarisati ovu komandu
        $deleterecords = "TRUNCATE TABLE `$tablename`"; 
        mysql_query($deleterecords); 
          
        # Brojaci importa 
        $pass = 0; 
        $fail = 0; 
          
        # csv datoteka i fajl se trebaju isto zvati, imati isto ime, 
        # delimiter je zarez u CSV fajlu a CSV fajl ima isti rspored kao tabela, 
        # CSV fajlo/ovi i ovaj php fajl se moraju nalaziti u istom folderu
 

        $file_handle = fopen ("$tablename.csv","r");                                    
        while (($row = fgetcsv($file_handle, 1000, ",")) !== false) {                                                        
        echo "<p>tablename is $tablename"; 
         $insertrecord = "Insert Into `$tablename` Values (\"".implode('", "', $row)."\")";
        echo "<p>row is  \"".implode('", "', $row)."\"";  
            mysql_query($insertrecord); 
            if(mysql_error()) { 
                $fail += 1;     # Povecava se sa brojem gresaka pri importu
            } 
            else 
            { 
                $pass += 1;        # Povecavanje pri uspjesnom importu 
            }   
        } 
          
        
        # Dodavanje podataka o importu u email poruku
        $message .= "Import u tabelu $tablename: Uspjelo=$pass  Greska=$fail \n"; 
    } 

    # Vrijeme kad je skripta pokretana 
    $runtime = (date("d M Y H:i")); 
      
    # Vrijeme pokretanja skripte se salje u email poruci 
    $message .= "\nVrijeme poruke: $runtime (server time zone)\n\n"; 
      
    # Send the email message 
    mail($emailaddress, $subject, $message, "Od: '$emailfrom'"); 

?>
[ ivan.a @ 22.06.2012. 06:58 ] @
Možda možeš da unaprediš skriptu (mada ne vidim veliku razliku između tvog koda i onog što je kiklop74 napisao što se tiče insert-a i uvoza CSV-a u bazu).
Glavni problem kod oba koda je što se upiti izvršavaju u okviru petlje, što je generalno loša zamisao.
Bolje je spremiti query i izvršiti van petlje. Ovim se štede resursi i eliminišu greške koje se mogu javiti prilikom unosa velikog broja podataka.
[ kiklop74 @ 22.06.2012. 13:37 ] @
Cilj mog posta je bio da ukažem na bolji metod importovanja podataka ali ne i da rešim sve probleme :)

Što se tiče višestrukih upita u petlji nekad se to ne može izbeći a mogu se poboljšati performanse ako se koristi innodb i transakcije.