Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php][mysql] Funkcja w pętli, potrzebny jakiś cache
Coolmax
post
Post #1





Grupa: Zarejestrowani
Postów: 168
Pomógł: 0
Dołączył: 12.11.2005
Skąd: Bulowice nearby Wadowice (E), Oświęcim (W)

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


Właśnie zauważyłem bezsensowność mojego kodu. Nie mam pomysłu jak go poprawić:
  1. <?php
  2. function data($column, $no) {
  3. connection();
  4. $query = "SELECT * FROM ksiazki where active = 1";
  5. $result = mysql_query($query);
  6. $row = mysql_num_rows($result);
  7. mysql_data_seek($result, $no);
  8. $r = mysql_fetch_assoc($result);
  9. print_r($r[$column]);
  10. }
  11. ?>
Podając nazwę kolumny i numer wiersza, zwraca wynik. Miała mi uprościć życie, bo podaje ją w pętli. Dopiero jak dałem ją do pętli, która pobiera całość (ok. 9 kolumn, 21 rekordów [9*21= 189 zapytań]) to zauważyłem, że znacznie spadła wydajność skryptu. Podejrzewm, że wrzucając zapytanie do osobnej funkcji, również bedzie się wykonywała tyle razy ile jest iteracji w pętli. Jest jakieś rozwiązanie tego problemu? (Nie chodzi mi o takie, jakie jest kilka topiców niżej w temacie "cache", pliki odpadają)
Go to the top of the page
+Quote Post
kossa
post
Post #2





Grupa: Zarejestrowani
Postów: 1 165
Pomógł: 9
Dołączył: 9.04.2002
Skąd: Toruń

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


Nie wiem czy dobrze Ciebie zrozumiałem...


Za każdym razem łączysz się z bazą i zamykasz połączenie - bez sensu - strata wydajności.
Aby pobrać rekordy raz połącz się z bazą i dane wyciągaj w pętli

  1. <?php
  2. connection();
  3. $query = "SELECT * FROM ksiazki where active = 1";
  4. $result = mysql_query($query);
  5. while($row = mysql_num_rows($result))
  6. {
  7.  echo $row[0]; //itd...
  8. }
  9. ?>


Łukasz

EDIT
a jeśli już musisz wykontywać coś takiego w pętli to połącz się z bazą i rozłączaj poza funkcją którą wykonujesz w pętli

Ten post edytował kossa 31.08.2006, 18:07:12
Go to the top of the page
+Quote Post
Coolmax
post
Post #3





Grupa: Zarejestrowani
Postów: 168
Pomógł: 0
Dołączył: 12.11.2005
Skąd: Bulowice nearby Wadowice (E), Oświęcim (W)

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


Zrobię, tak jak pisałeś. Żebyś lepiej mnie zrozumiał podam ci przykład do powyższej funkcji:
  1. <?php
  2. <form action="./<?=basename($_SERVER['PHP_SELF']);?>?site=aukcje" method="post">
  3. <select name="book" onchange="submit(this);">
  4. for($i = 0; $i < rows(); $i++){
  5. echo "<option value="$i" >";
  6. data('id', $i);
  7. echo ". ";
  8. data('authors', $i);
  9. echo " - ";
  10. data('title', $i);
  11. echo "</option>n";
  12. }
  13. </select>
  14. </form>
  15. ?>

Teraz funkcja zwracana np. kolumnę authors, o podanym numerze $i, ale co z tego jak za każdym razem, jest wykonywane zapytanie do MySQL'a, a przecież można wykonać (chyba) 1x zapytanie, a potem operować w pętli tylko na zwróconym przez zapytanie "zasobie". Tylko właśnie nie potrafie czegoś takiego wymyślić.

Ten post edytował Coolmax 31.08.2006, 22:22:01
Go to the top of the page
+Quote Post
kossa
post
Post #4





Grupa: Zarejestrowani
Postów: 1 165
Pomógł: 9
Dołączył: 9.04.2002
Skąd: Toruń

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


Cytat
Teraz funkcja zwracana np. kolumnę authors, o podanym numerze $i, ale co z tego jak za każdym razem, jest wykonywane zapytanie do MySQL'a, a przecież można wykonać (chyba) 1x zapytanie, a potem operować w pętli tylko na zwróconym przez zapytanie "zasobie". Tylko właśnie nie potrafie czegoś takiego wymyślić.


Przyznam się, że wciąż nie rozumiem... albo napisałeś znowu niezbyt jasno albo ja już po całym dniu klepania w klawiaturę nie kojarzę zbyt dobrze.

Mając $i możesz tylko raz pobrać z bazy potrzebny rekord

  1. SELECT kolumna_1,kolumna_n FROM tabela WHERE kolumna_x=$i


Nie rozumiem, co masz na myśli aby później coś w pętli wykonywać.
Mając zwrócony rekord możesz już z nim zrobić wszystko. Co chcesz zrobić - napisz jaśniej.


Łukasz
Go to the top of the page
+Quote Post
Coolmax
post
Post #5





Grupa: Zarejestrowani
Postów: 168
Pomógł: 0
Dołączył: 12.11.2005
Skąd: Bulowice nearby Wadowice (E), Oświęcim (W)

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


Mi chodzi tylko o to aby w funkcji data:
  1. <?php
  2. function data($column, $no) {
  3. connection();
  4. $query = "SELECT * FROM ksiazki where active = 1";
  5. $result = mysql_query($query);
  6. mysql_data_seek($result, $no);
  7. $r = mysql_fetch_assoc($result);
  8. print_r($r[$column]);
  9. }
  10. ?>

używanej za każdym razem w pętli, nie trzeba było wysyłać zapytania za każdym razem, czyli w $reslut, są wszystkie rekordy, które w kolumnie active mają wartość 1. To zapytanie chciałem, żeby było wykonanywane tylko raz, bo w nim jest już wszystko to, czego potrzebuję, następnie funkcją data operować na tych danych.

Ten post edytował Coolmax 1.09.2006, 10:48:00
Go to the top of the page
+Quote Post
kossa
post
Post #6





Grupa: Zarejestrowani
Postów: 1 165
Pomógł: 9
Dołączył: 9.04.2002
Skąd: Toruń

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


  1. <?php
  2. connection();
  3. $query = "SELECT * FROM ksiazki where active = 1";
  4. $result = mysql_query($query);
  5. while($row = mysql_num_rows($result))
  6. {
  7.  echo $row[0]; //itd...
  8. }
  9. ?>


pisałem Tobie wcześniej tu co jest tu powyżej - wszystko raz wybierasz i w $result masz wszystko

Łukasz
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: 23.12.2025 - 07:15