Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL][PHP]Dzielenie rekordów sql na paczki po 100
Forum PHP.pl > Forum > Przedszkole
niko841
Witajcie jestem nowy i na forum i w programowaniu. Bawię się ze skryptami w ramach ćwiczeń smile.gif (samouk) smile.gifsmile.gif

Mam problem z takim skryptem.
Chcę wyświetlić wszystkie rekordy sql na stronie - to umiem smile.gif
Później te wszystkie rekordy zapisać do plików txt po 100 wpisów na plik.

czyli jeśli w bazie jest 1000 rekordów to skrypt utworzy mi 10 plików po 100 wpisów.
Chodzi mi tylko o czytanie jednej kolumny z tabeli i jej zapis.
Szukałem też pomocy na forum forum.optymalizacja.com (informuję was tak co by być uczciwym dla was)
Chłopaki proponują tam "limit" tylko nie bardzo rozumiem jak to ma się sprawdzić w przypadku wyświetlania wszystkich rekordów i dzielenia ich na paczki.

Pomocyyyyyy smile.gif

Dziękuję za pomoc.
piotr.kazmierczak
Są dwa rozwiązania:

PHP - czyli zbierasz zapytaniem wszystkie rekordy a później dzielisz je na części:

  1. array_chunk($tablica_z_danymi, 100, true);


Otrzymasz tablice 10 elementową , każda po 100 wierszy.

MySQL - czyli robisz 10 zapytań w pętli for np:

  1. for($i=0; $i<10; $i++){
  2. wykonaj_zapytanie("SELECT columna FROM tabela LIMIT " . ($i*100) . ", 100" );
  3. }


W ten sposób będziesz miał 10 porcji danych 0-100, 100-200 itd..
Sorry za opisowe funkcje ale dawno nie pisałem poza Zendem smile.gif
niko841
Ok, dziękuję bardzo za pomoc.
Prym
Przy większej bazie zapomnij o pierwszym rozwiązaniu (pobranie całej bazy i podział w PHP) bo ci administrator serwera zacznie krzyczeć o zbyt dużym obciążeniu serwera bazy danych (z doświadczenia piszę) smile.gif
niko841
Dziś usiadłem do tego z sercem i dopiero przeanalizowałem wszystko dokładnie.

Załamka, jakie rozwiązanie mojego problemu było proste ... smile.gif

piotr.kazmierczak Bardzo dziękuję Ci za pomoc.

croc
Ja bym powiedział, że oba rozwiązania są do luftu.

Pierwsze jest niepotrzebnie ciężkie. Nie ma co upychać wszystkiego do tablic.

Drugie zakłada, że wiesz ile ma być tych porcji i - co gorsza - wielokrotnie wykonuje zapytania.

Moim zdaniem optymalnie będzie po prostu wykonywać zapytanie w pętli for i sprawdzać resztę z dzielenia:

  1. $rowsPerFile = 100;
  2. $fileID = 0;
  3. for($i = 0; $row = mysql_fetch_assoc($query); ++$i) {
  4. if($i % $rowsPerFile === 0) {
  5. ++$fileID;
  6. $file = fopen($fileID.'.txt', 'w');
  7. }
  8. fwrite($file, 'to co chcesz zapisać z $row');
  9. }
niko841
problem z ilością sobie rozwiązałem licząc ilośc wpisów w tabeli.

Jak na początku wspomniałem jestem początkujący w programowaniu i się uczę samemu więc nie besztajcie mnie bardzo za to co zrobiłem źle ok smile.gif

Mój skrypt wygląda tak:
  1. <?php
  2. $ilosc_na_plik = "5";
  3. $sql_polaczenie = mysql_connect("localhost", "root", "")
  4. or die ('Blad polaczenia z baza danych. ' . mysql_error());
  5.  
  6. mysql_select_db("art") or die('Brak bazy danych. ' . mysql_error());
  7. $sql_count = mysql_query("SELECT count(id) FROM pozycje");
  8. $count = mysql_fetch_array($sql_count);
  9. $countarry = round($count[0]/$ilosc_na_plik, 0);
  10.  
  11. for($i=0; $i<=$countarry; $i++) // tu pętla od Piotra
  12. {
  13. $sql = mysql_query("SELECT nazwa FROM pozycje LIMIT " . ($i*$ilosc_na_plik) . ", $ilosc_na_plik" );
  14. while($wynik = mysql_fetch_array($sql))
  15. {
  16. $nazwy = $wynik['nazwa']."\n";
  17. $plik = "nazwy_".$i.".txt";
  18. $fp = fopen($plik, "a");
  19. flock($fp, 2);
  20. fwrite($fp, $nazwy);
  21. flock($fp, 3);
  22. fclose($fp);
  23.  
  24. }
  25. }
  26. ?>


lub
Pomysł Croc
  1. <?php
  2. $ilosc_na_plik = "5";
  3. $sql_polaczenie = mysql_connect("localhost", "root", "")
  4. or die ('Blad polaczenia z baza danych. ' . mysql_error());
  5.  
  6. mysql_select_db("art") or die('Brak bazy danych. ' . mysql_error());
  7. $sql = mysql_query("SELECT nazwa FROM pozycje");
  8.  
  9. $rowsPerFile = 5;
  10. $fileID = 0;
  11. for($i = 0; $row = mysql_fetch_assoc($sql); ++$i)
  12. {
  13. if($i % $rowsPerFile === 0)
  14. {
  15. ++$fileID;
  16. $file = fopen($fileID.'.txt', 'w');
  17. }
  18. fwrite($file, $row['nazwa']."\n");
  19. }
  20. ?>


Który też działa pięknie.

Mówiłem, że jestem początkujący smile.gif

Mam nadzieję, że nie dostanę bana od admina za wklejenie całego skryptu.
Swoją drogą pozdrawiam Administratorów.
croc
W pierwszej wersji wykonujesz otwarcie pliku dla każdego wiersza, to chyba nie jest najlepszy pomysł. smile.gif
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.