Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] INSERT z csv
Forum PHP.pl > Forum > Przedszkole
motor
Zrobiłem skrypt którzy wrzuca mi produkty do bazy , ale niestety nie wykonuje się w całości , plik csv 20 000 produktów łącznie ok 12Mb, wchodzi mi ok 50% produktów , co zrobić czy mój wsad można jakoś zoptymalizować ?
Czy podzielić ?
Proszę o pomoc


  1. <?php
  2. while ($result = fgetcsv ($uchwyt, 8024, ";")) {
  3.  
  4. $liczba_pol = count($result);
  5.    $i=0;
  6.    $a=1;    
  7.   while($i < $liczba_pol){
  8.  
  9.  
  10. $pole = "pole".$a++;
  11.  
  12.      $dat= $result[$i++];
  13.      $datt = $result[$i++];
  14.      $dattt = $result[$i++];
  15.  
  16. $query = "INSERT INTO tabela (product,cena) VALUES ('$dat','$datt')";
  17.  
  18.  
  19. $query = mysql_query ($query);
  20. }
  21. }
  22. ?>
nospor
moze czas na skrypt ci sie skonczyl. ustaw:
  1. <?php
  2. ?>

na poczatku skryptu
motor
Niestety nie pomogło sprawdziłem , na stronie nie wyskakuje żaden błąd o przekroczonym czasie
nospor
no to sprobuj zoptymalizowac ten skrypt. 20tys zapytan do bazy pod rząd to nie jest dobry pomysl.
Tworz zapytanie, ktore dodaje np. po 20 rekordow na raz.
motor
za pomocą jakiej funkcji to zrobić ? , skrypt musiał bym być uruchomiony 1000 razy
nospor
nie, raz.

zamiast: $query = "INSERT INTO tabela (product,cena) VALUES ('$dat','$datt')";
robisz: $query = "INSERT INTO tabela (product,cena) VALUES ('1','1'),('2','2'),....,('20','20')";

Tylko musisz sobie tak budowac to zapytanie i wykonywac dopiero gdy uzbiera sie 20 wartosci smile.gif
motor
Nie wiem czy dobrze zrozumiałem smile.gif , ale raczej nie bo działa jeszcze mniej sprawnie ,co tu się kotłuje ?

  1. <?php
  2. $licz++;
  3. if($licz =='21'){
  4.  
  5.  
  6. $query = "INSERT INTO tabela (id,produkt,cena) VALUES ('$dat','$datt','$datttt'),('$dat','$datt','$datttt'),('$dat','$datt','$datttt'),('$dat','$datt','$datttt'),('$dat','$datt','$datttt'),('$dat','$datt','$datttt'),('$dat','$datt','$datttt'),('$dat','$datt','$datttt'),('$dat','$datt','$datttt'),('$dat','$datt','$datttt'),('$dat','$datt','$datttt'),('$dat','$datt','$datttt'),('$dat','$datt','$datttt'),('$dat','$datt','$datttt'),('$dat','$datt','$datttt'),('$dat','$datt','$datttt'),('$dat','$datt','$datttt'),('$dat','$datt','$datttt'),('$dat','$datt','$datttt'),('$dat','$datt','$datttt')";
  7. //mysql_query("set names utf8");
  8.  
  9. $query = mysql_query ($query);
  10.  
  11.  
  12.  
  13. $licz='1';
  14. }
  15. ?>
nospor
przeciez do zapytania wkladasz te same dane.

Rozwiązanie jest banalne, moze ktos inny cie na kieruje, bo ja nie mam sily winksmiley.jpg
Pilsener
A nie możesz po prostu użyć LOAD DATA INFILE i wrzucić od razu całego pliku do bazy?
motor
To ciekawe rozwiązanie ale dla mnie czarna magia nie wiem gdzie wpisać pola do tabel nigdy nie robiłem takiego zapytania czy ktoś może mi pomóc mi napisać to zapytanie LOAD Data

chce dodać rekordy do bazy , w pliku txt są 2 wartości oddzielone tabulatorem

cukier -TAB 35
kawa -TAB 12


Manual pomimo prób Wystapil blad w kwerendzie.
  1. <?php
  2. LOAD DATA [LOW_PRIORITY] [LOCAL] INFILE 'nazwa_pliku.txt' [REPLACE | IGNORE]
  3.  INTO TABLE nazwa_tabeli
  4.  [FIELDS
  5.    [TERMINATED BY '\t']
  6.    [[OPTIONALLY] ENCLOSED BY '']
  7.    [ESCAPED BY '' ]
  8.  ]
  9.  [LINES TERMINATED BY '&#092;n']
  10.  [IGNORE n LINES]
  11.  [(nazwa_kolumny,...)]
  12. ?>
magra
Jeśli pola masz oddzielone tabulatorem to powinno wystarczyć takie zapytanie:
  1. LOAD DATA INFILE '/sciezka/do/pliku/nazwa_pliku.txt' INTO TABLE `nazwa_bazy`.`nazwa_tabeli`

ewentualnie będziesz potrzebował określić znaki końca linii, np:
  1. LINES TERMINATED BY '\r\n'
motor
Kurcze cały czas błąd i błąd ścieżka do pliku dobra nazwy tabeli i baz dobre plik txt prawa 777, hasała do bazy dobre
ktoś widzi tu jakiegoś byka ? smile.gif

  1. <?php
  2. $query = "LOAD DATA INFILE '/home/stronak/public_html/stronka/up/plik.txt' INTO TABLE `bazadanych`.`nazwa_tabeli` LINES TERMINATED BY 'r\n' ";
  3.  
  4.  
  5. $wynik = mysql_query($query);
  6. if(!$wynik) {
  7. echo '<br> Wystapil blad w kwerendzie.';
  8. }
  9. ?>
magra
jest
  1. LINES TERMINATED BY 'r\n' ";


powinno być
  1. LINES TERMINATED BY '\r\n' ";

oczywiście jeśli plik ma windowsowe znaki końca linii, jeśli był zapisany pod linuchem to wystarczy '\n'

no a najlepiej to by się przydał komunikat błędu:
  1. <?php
  2. $wynik = mysql_query($query);
  3. if(!$wynik) {
  4. echo '<br> Wystapil blad w kwerendzie.<br>' , mysql_error();
  5. }
  6. ?>
motor
Poszło smile.gif dzięki , no to teraz precyzuje wsad i błąd coś z separatorem ale o co chodziii
  1. <?php
  2. $query = "LOAD DATA LOCAL INFILE '/sciezka/plik.txt' INTO TABLE `baza`.`tabela` FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"(a,b,c) ";
  3. ?>


i

  1. <?php
  2. Field separator argument is not what is expected; check the manual
  3. ?>

przy pliku txt
  1. <?php
  2. 23,&#8217;Piotr’,'Kowalski’
  3. 43,&#8217;Łukasz’,'Podolski’
  4. 21,&#8217;Maria’,'Kuźniecowa’
  5. ?>
magra
chłopie, co ty w Wordzie piszesz, że masz jakieś drukarskie apostrofy winksmiley.jpg
  1. OPTIONALLY ENCLOSED BY '"(a,b,c) ";

'(a,b,c)' co to jest? tutaj powinieneś podać jeden znak, taki, którym zamykasz wartość pól - w twoim przypadku apostrof jeśli dobrze widzę, choć może problemem są właśnie te apostrofy drukarskie...
motor
Fakt skopiowałem fragment ze strony ,mam do d... monitor i nie zauważyłem , dzięki wszystko już działa smile.gif , funkcja faktycznie wydajna plik wchodzi bez problemu polecam wszystkim , prawie można zamknąć temat jeszcze tylko jedna rzecz mi została kodowanie

Robbie tak wyświetlam z bazy treść kodowanie utf8 i zapisuję ją do pliku .txt a później wsadzam plik do bazy LOAD DATA LOCAL INFILE kodowanie w bazie utf8 i krzaki

Czy zapisując do pliku txt murze przekonwertować an inny format ?
erix
A czy użyłeś wyszukiwarki wpisując frazę mysql kodowanie? Było wiele już takich tematów.
motor
jak OpenOfice edytuje plik do wsadu kodowanie utf , wszystkie znaki są czy do funkci
DATA LOCAL INFILE trzeba jeszcze coś dodać ?

dodałem jeszcze to ale nie pomogło

  1. <?php
  2. mysql_query("set names utf8");
  3. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.