Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][mysql] Funkcja w pętli
Forum PHP.pl > Forum > Przedszkole
Coolmax
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ą)
kossa
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
Coolmax
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ć.
kossa
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
Coolmax
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.
kossa
  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
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.