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 29.10.2011, 07:51:33
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ń 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.

Ten post edytował niko841 29.10.2011, 07:53:40
Go to the top of the page
+Quote Post
piotr.kazmiercza...
post 29.10.2011, 08:01:21
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 smile.gif


--------------------
Facead.pl - Social Media Agency
Fishcode.pl - Blog
Go to the top of the page
+Quote Post
niko841
post 29.10.2011, 20:32:54
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 29.10.2011, 20:41:46
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ę) smile.gif
Go to the top of the page
+Quote Post
niko841
post 30.10.2011, 20:23:29
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 ... smile.gif

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

Go to the top of the page
+Quote Post
croc
post 31.10.2011, 00:45:09
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 31.10.2011, 14:56:50
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 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.

Ten post edytował niko841 31.10.2011, 15:15:07
Go to the top of the page
+Quote Post
croc
post 2.11.2011, 18:46:00
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ł. smile.gif
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 27.04.2025 - 06:55