Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Export ostatnich rekordów z kilku tabel do pliku csv
Forum PHP.pl > Forum > Przedszkole
brzanek
Witam potrzebna mi pomoc w eksportowanie ostatnich rekordów z kilkunastu tabel do pliku csv.
W bazie danych mam kilka tabel z miejscowościami i temperaturami np:
Tabela szczecin
id tempmax tempmin
25 2,1 -4

Tabela koszalin
id tempmax tempmin
27 3,1 -2.1
To jest ostatni rekord z tej tabeli. Tak samo wyglądają inne tabele dla innych miejscowości. Jak mogę zapisać ostatnie rekordy z tych tabel do pliku csv przez php.
Format jaki powinien być w pliku csv powinien wyglądać tak:
tempmax tempmin miejscowosc
2.1; -4; szczecin
3.1; -2.1; koszalin
itd.
trueblue
Jeśli id jest autonumerem i ostatni rekord ma najwyższe id, to:

  1. SELECT tempmax,tempmin,'szczecin' FROM szczecin ORDER BY id DESC LIMIT 0,1
  2. UNION
  3. SELECT tempmax,tempmin,'koszalin' FROM koszalin ORDER BY id DESC LIMIT 0,1
  4. UNION
  5. ....


Możesz do te generacji tego zapytania użyć pętli w php.

P.S. A przy okazji, nie możesz zmienić struktury bazy i przechowywać danych w jednej tabeli?
brzanek
Wiem jak pobrać te dane z bazy ale teraz jak zapisać je do pliku csv na komputerze w takiej formie jak podałem.
Nie chcę zmieniać już struktury bazy danych.
brzanek
Cytat(trueblue @ 14.02.2016, 10:10:52 ) *

Nie bardzo to rozumiem.
Zrobiłem coś takiego ale nie działa
  1. <?php
  2. if (!defined("IN_FUSION")) { die("Access Denied"); }
  3. $con=mysql_connect('localhost','login','pass');
  4. mysql_select_db("nazwa_bazy_danych", $con);
  5. mysql_query("SET CHARSET utf8");
  6.  
  7. $query = "
  8. (SELECT CONCAT('Białogard'), tempmax,tempmin,data FROM bialogard ORDER BY id DESC LIMIT 0,1)
  9. UNION
  10. (SELECT CONCAT('Chojna'), tempmax,tempmin,data FROM chojna ORDER BY id DESC LIMIT 0,1)
  11. UNION
  12. (SELECT CONCAT('Darłówek'), tempmax,tempmin,data FROM darlowek ORDER BY id DESC LIMIT 0,1)
  13. UNION
  14. (SELECT CONCAT('Drawsko'), tempmax,tempmin,data FROM drawsko ORDER BY id DESC LIMIT 0,1)
  15. UNION
  16. (SELECT CONCAT('Gryfice'), tempmax,tempmin,data FROM gryfice ORDER BY id DESC LIMIT 0,1)
  17. UNION
  18. (SELECT CONCAT('Gryfino'), tempmax,tempmin,data FROM gryfino ORDER BY id DESC LIMIT 0,1)
  19. UNION
  20. (SELECT CONCAT('Kamień'), tempmax,tempmin,data FROM kamien ORDER BY id DESC LIMIT 0,1)
  21. UNION
  22. (SELECT CONCAT('Kołobrzeg'), tempmax,tempmin,data FROM kolobrzeg ORDER BY id DESC LIMIT 0,1)
  23. UNION
  24. (SELECT CONCAT('Szczecin'), tempmax,tempmin,data FROM szczecin ORDER BY id DESC LIMIT 0,1)
  25. UNION
  26. (SELECT CONCAT('Choszczno'), tempmax,tempmin,data FROM choszczno ORDER BY id DESC LIMIT 0,1)";
  27. $result = mysql_query($query) or die(mysql_error());
  28. while($row = mysql_fetch_array($result)){
  29. $list = array
  30. (
  31. echo "".$row['tempmax'].";".$row['tempmin'].";".$row['0'].";";
  32. );
  33. }
  34. $file = fopen("contacts.csv";"w");
  35.  
  36. foreach ($list as $line)
  37. {
  38. fputcsv($file,explode(';',$line));
  39. }
  40.  
  41. fclose($file);
  42. ?>
trueblue
W tablicy robisz echo?

i tu błąd:
  1. $file = fopen("contacts.csv";"w");


Tu masz mniej kombinowany przykład: http://php.net/manual/en/function.fputcsv.php wystarczy, że zmienisz kolejność pól w select.
brzanek
Z tego przykładu to już nic nie rozumiem.
Coś mi nie wychodzi.

Poprawiłem trochę kod
  1. <?php
  2. $con=mysql_connect('localhost','login','pass');
  3. mysql_select_db("nazwa_bazy", $con);
  4. mysql_query("SET CHARSET utf8");
  5.  
  6. $query = "
  7. (SELECT CONCAT('Białogard'), tempmax,tempmin,data FROM bialogard ORDER BY id DESC LIMIT 0,1)
  8. UNION
  9. (SELECT CONCAT('Chojna'), tempmax,tempmin,data FROM chojna ORDER BY id DESC LIMIT 0,1)
  10. UNION
  11. (SELECT CONCAT('Darłówek'), tempmax,tempmin,data FROM darlowek ORDER BY id DESC LIMIT 0,1)
  12. UNION
  13. (SELECT CONCAT('Drawsko'), tempmax,tempmin,data FROM drawsko ORDER BY id DESC LIMIT 0,1)
  14. UNION
  15. (SELECT CONCAT('Gryfice'), tempmax,tempmin,data FROM gryfice ORDER BY id DESC LIMIT 0,1)
  16. UNION
  17. (SELECT CONCAT('Gryfino'), tempmax,tempmin,data FROM gryfino ORDER BY id DESC LIMIT 0,1)
  18. UNION
  19. (SELECT CONCAT('Kamień'), tempmax,tempmin,data FROM kamien ORDER BY id DESC LIMIT 0,1)
  20. UNION
  21. (SELECT CONCAT('Kołobrzeg'), tempmax,tempmin,data FROM kolobrzeg ORDER BY id DESC LIMIT 0,1)
  22. UNION
  23. (SELECT CONCAT('Szczecin'), tempmax,tempmin,data FROM szczecin ORDER BY id DESC LIMIT 0,1)
  24. UNION
  25. (SELECT CONCAT('Choszczno'), tempmax,tempmin,data FROM choszczno ORDER BY id DESC LIMIT 0,1)";
  26.  
  27. $result = mysql_query($query) or die(mysql_error());
  28. while($row = mysql_fetch_array($result)){
  29. $list = array
  30. (
  31. "".$row['tempmax'].",".$row['tempmin'].",".$row['0']."",
  32. );
  33. }
  34. $file = fopen("contacts.csv","w");
  35. foreach ($list as $line)
  36. {
  37. fputcsv($file,explode(',',$line));
  38. }
  39. fclose($file);
  40. ?>

Powstaje plik na serwerze csv ale tylko z ostatnim wynikiem czyli z tabeli choszczno. Powinny być pozostałe najnowsze wyniki z innych tabel. Jeszcze jedno jak zamienić ,(przecinek) na ; (średnik) w pliku csv i jak automatycznie zapisywać ten plik nie na serwerze tylko na moim komputerze (oczywiście po wywołaniu pliku z przeglądarki)
trueblue
Zmienną $list nadpisujesz za każdym razem w pętli.
http://php.net/manual/en/function.array-push.php (tu są pokazane 2 sposoby zaraz na początku).

http://php.net/manual/en/function.fputcsv.php (opis parametrów funkcji)

http://stackoverflow.com/questions/7263923...wnload-with-php (jak wymusić download)
brzanek
Za dużo tego już nic minie wychodzi. Kombinuję jak tylko mogę ale bez rezultatu. Jak ma ktoś gotowe rozwiązanie to poproszę. Z tej dokumentacji nie wiele mogę wywnioskować bo nie do końca się na tym znam.
trueblue
Odnoszę wrażenie, że albo nie czytasz dokładnie, albo nie próbujesz wdrażać zmian.

Dodawanie elementu do tablicy (z przykładów z linku, który podałem):
Kod
$list[]=array(.....);
lub
array_push($list,array(....));


Separator (trzeci parametr), również z linku, który podałem:
Kod
fputcsv(resource $handle , array $fields [, string $delimiter = ","
brzanek
Czyli tak?
  1. $list = array
  2. (
  3. $row = array("tempmax", "tempmin", "0");
  4. print_r($row);
  5. );

Takie rozwiązanie chyba nie działa poprawnie.

Czy ktoś jest w stanie mi pomóc?
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.