Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SQL][PHP]Dzielenie rekordów sql na paczki po 100
niko841
post
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 11.04.2010

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


Witajcie jestem nowy i na forum i w programowaniu. Bawię się ze skryptami w ramach ćwiczeń (IMG:style_emoticons/default/smile.gif) (samouk) (IMG:style_emoticons/default/smile.gif) (IMG:style_emoticons/default/smile.gif)

Mam problem z takim skryptem.
Chcę wyświetlić wszystkie rekordy sql na stronie - to umiem (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/smile.gif)

Dziękuję za pomoc.

Ten post edytował niko841 29.10.2011, 07:53:40
Go to the top of the page
+Quote Post
piotr.kazmiercza...
post
Post #2





Grupa: Zarejestrowani
Postów: 47
Pomógł: 10
Dołączył: 1.03.2010
Skąd: Warszawa

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


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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
niko841
post
Post #3





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 11.04.2010

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


Ok, dziękuję bardzo za pomoc.
Go to the top of the page
+Quote Post
Prym
post
Post #4





Grupa: Zarejestrowani
Postów: 100
Pomógł: 11
Dołączył: 20.05.2007
Skąd: z fotela :)

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


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ę) (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
niko841
post
Post #5





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 11.04.2010

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


Dziś usiadłem do tego z sercem i dopiero przeanalizowałem wszystko dokładnie.

Załamka, jakie rozwiązanie mojego problemu było proste ... (IMG:style_emoticons/default/smile.gif)

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

Go to the top of the page
+Quote Post
croc
post
Post #6





Grupa: Zarejestrowani
Postów: 706
Pomógł: 108
Dołączył: 12.03.2010

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


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. }


Ten post edytował croc 31.10.2011, 00:45:56
Go to the top of the page
+Quote Post
niko841
post
Post #7





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 11.04.2010

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


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 (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/smile.gif)

Mam nadzieję, że nie dostanę bana od admina za wklejenie całego skryptu.
Swoją drogą pozdrawiam Administratorów.

Ten post edytował niko841 31.10.2011, 15:15:07
Go to the top of the page
+Quote Post
croc
post
Post #8





Grupa: Zarejestrowani
Postów: 706
Pomógł: 108
Dołączył: 12.03.2010

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


W pierwszej wersji wykonujesz otwarcie pliku dla każdego wiersza, to chyba nie jest najlepszy pomysł. (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

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: 8.10.2025 - 06:30