Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> CSV import do MySQL
hettmix
post
Post #1





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 10.03.2012

Ostrzeżenie: (0%)
-----


Witam.

Tak szukam, szukam i nie mogę znaleźć odpowiedniego rozwiązania. Może ktoś mnie naprowadzi na właściwe tory. Dodam, że nie zajmuję się programowaniem zawodowo - raczej z doskoku.
Więc tak, mam kod, który pobiera wiersze z pliku csv:
  1. $target_path = "tmp/";
  2. $target_path = $target_path . basename( $_FILES['dane_file']['name']);
  3.  
  4. if ($_FILES['dane_file']['error']=='0') {
  5. if (move_uploaded_file($_FILES['dane_file']['tmp_name'], $target_path)) {
  6. print "Załadowano plik:&nbsp;<b>".$_FILES['dane_file']['name']."</b></br></br>";
  7.  
  8. echo "<table style=\"text-align: left; font-size: 10px; border: 3px double #aaaaaa; border-collapse: collapse;\">";
  9. $row = 0;
  10.  
  11. if (($handle = fopen("$target_path", "r")) !== FALSE) {
  12. while (($data = fgetcsv($handle, 2000, ';', '"', '\\')) !== FALSE) {
  13. if ($row == 0) {
  14. $num = count($data);
  15. echo "<thead><tr>";
  16. $row++;
  17. echo "<th style=\"padding: 7px; background: grey; border: 3px double #aaaaaa;\">".Lp."</th>";
  18. for ($c=0; $c < $num; $c++) {
  19. echo "<th style=\"padding: 7px; background: grey; border: 3px double #aaaaaa;\">" . $data[$c] . "</th>";
  20. }
  21. echo "</tr></thead>";
  22. } else {
  23. $num = count($data);
  24. echo "<tr>";
  25. $row++;
  26. $i++;
  27. echo "<td style=\"padding: 7px; border: 3px double #aaaaaa;\">" .$i. "</td>";
  28. for ($c=0; $c < $num; $c++) {
  29. $data[$c] = str_replace('""', '', $data[$c]);
  30. echo "<td style=\"padding: 7px; border: 3px double #aaaaaa;\">" . $data[$c] . "</td>";
  31. }
  32. echo "</tr>";
  33. }
  34. }
  35.  
  36. fclose($handle);
  37. echo "</table>";


Wszystko ładnie działa, poszczególne wiersze wskakują do sformatowanej tabelki i teraz chciałbym załadować te dane do tabeli w bazie MySQL. Kombinuję od jakiegoś czasu z LOAD DATA INFILE ale nie mogę tego poprawnie rozwiązać. Może jakieś sugestie ?.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
mortus
post
Post #2





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


Straszny misz-masz, jednocześnie wyświetlasz i dodajesz do bazy, co zdecydowanie utrudnia zrozumienie tego kodu. Tak naprawdę do kodu, którego zadaniem jest wyświetlić dane z pliku csv wystarczy dopisać 9 linijek (z uwzględnieniem nawiasów zamykających), aby te dane jednocześnie dodawać do bazy danych. Zastanowiłbym się jednak nad odseparowaniem tych dwóch funkcjonalności. Niestety w tej chwili skrypt nie ma prawa działać prawidłowo, bo w miejscu, w którym generujesz zapytanie SQL nie masz dostępu do informacji o nazwach poszczególnych kolumn tabeli w bazie danych - tablica $data jest tablicą jednowymiarową i zawiera dane pochodzące z aktualnie przetwarzanego wiersza pliku csv, Ty tymczasem używasz jej jako tablicy dwuwymiarowej (gdzieś tam w kodzie masz $data[0][0]). Proponowałbym najpierw wykonać import danych, tzn. przepisać dane z pliku do bazy danych, a później wyświetlić dane, ale już "te" pobrane z bazy. Żeby nie "zarżnąć" skryptu warto skorzystać z zapytania MULTI-INSERT i wykonywać je co np. 50 rekordów (to ze wzglądów na ograniczenia MULTI-INSERTA).
Go to the top of the page
+Quote Post
hettmix
post
Post #3





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 10.03.2012

Ostrzeżenie: (0%)
-----


Cytat(mortus @ 11.03.2012, 22:23:39 ) *
Straszny misz-masz, jednocześnie wyświetlasz i dodajesz do bazy, co zdecydowanie utrudnia zrozumienie tego kodu. Tak naprawdę do kodu, którego zadaniem jest wyświetlić dane z pliku csv wystarczy dopisać 9 linijek (z uwzględnieniem nawiasów zamykających), aby te dane jednocześnie dodawać do bazy danych. Zastanowiłbym się jednak nad odseparowaniem tych dwóch funkcjonalności. Niestety w tej chwili skrypt nie ma prawa działać prawidłowo, bo w miejscu, w którym generujesz zapytanie SQL nie masz dostępu do informacji o nazwach poszczególnych kolumn tabeli w bazie danych - tablica $data jest tablicą jednowymiarową i zawiera dane pochodzące z aktualnie przetwarzanego wiersza pliku csv, Ty tymczasem używasz jej jako tablicy dwuwymiarowej (gdzieś tam w kodzie masz $data[0][0]). Proponowałbym najpierw wykonać import danych, tzn. przepisać dane z pliku do bazy danych, a później wyświetlić dane, ale już "te" pobrane z bazy. Żeby nie "zarżnąć" skryptu warto skorzystać z zapytania MULTI-INSERT i wykonywać je co np. 50 rekordów (to ze wzglądów na ograniczenia MULTI-INSERTA).

Dzięki za uwagi, ale potrzebuję poprawnego fragmentu kodu - jak utworzyć tablicę $data dwuwymiarową, by później dostać się do konkretnych pól w odpowiednich wierszach ?.

Ok - rozwiązałem problem innym sposobem. Szkoda, że nie doczekałem się jakiejś konkretnej pomocy ze strony tego forum. Dzięki za wszelkie chęci (IMG:style_emoticons/default/wink.gif) . Zamykam temat.
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 9.10.2025 - 09:10