Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zmienna nazwa zwracanej wartości
Wieloryb
post
Post #1





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 20.12.2007
Skąd: Radom

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


A więć, mam sobie taką prostą funkcję
  1. public function sql($q) {
  2. $this->res = mysql_query ($q);
  3. return $this->res;
  4. }


tylko teraz, zalozmy ze w skrypcie chcialbym wywolac w petli inne zapytanie z petla czyli
  1. $s->sql("zapytanie");
  2.  
  3. while($row = my..fe..as($s->res)) {
  4.  
  5. $s->sql("zapytanie2");
  6.  
  7. while($row = my..fe..as($s->res)) {
  8.  
  9. }
  10. }


To 2 wyniki z SQLa myli i sie gubi. Chcialem dodac identyfikacje do zapytania czyli
  1. public function sql($q, $id="") {
  2.  
  3. $this->res.$id = mysql_query ($q);
  4.  
  5. return $this->res.$id;
  6. }


i przy wywolywaniu odpowiednio to nazywac sobie np
  1. $s->sql("zapytanie", 1);
  2.  
  3. while($row = my..fe..as($s->res1)) {
  4.  
  5. $s->sql("zapytanie2", 2);
  6.  
  7. while($row = my..fe..as($s->res2)) {
  8.  
  9. }
  10. }


Ale dostaje blad
Cytat
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /users/modasu/htdocs/_sites/pg3/class/class.sites.php on line 12


Czy mój pomysł jest w ogóle dobry i ma sens ? Co jest nie tak ?

Z góry dzieki
Pozdrawiam

Ten post edytował Wieloryb 22.04.2010, 20:58:55
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
mdco
post
Post #2





Grupa: Zarejestrowani
Postów: 324
Pomógł: 5
Dołączył: 14.12.2004

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


parameter id jest nie potrzebny, problem masz w sekwencji:
  1. while($row = my..fe..as($s->res)) {
  2. $s->sql("zapytanie2");
  3. while($row = my..fe..as($s->res)) {
  4. }
  5. }


zmienną $row z pierwszego zapytania nadpisujesz zmienną $row z drugiego zapytania, poza tym nadpisujesz sobie zmienną $s->res w podpętli,
na mój gust powinno to wyglądać tak:

  1.  
  2. class S {
  3. public var $res;
  4. public __construct() {
  5. //......
  6. }
  7. public function sql($q) {
  8. $this->res = mysql_query ($q);
  9. }
  10.  
  11. }
  12.  
  13. $s = new S();
  14. $s->sql("zapytanie1");
  15. while($row1 = my..fe..as($s->res)) {
  16. $s = new S();
  17. $s->sql("zapytanie2");
  18. while($row2 = my..fe..as($s->res)) {
  19. }
  20. }


--------------------
zmoderowano - rozmiar
Go to the top of the page
+Quote Post
mortus
post
Post #3





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Drugi parametr funkcji rzeczywiście jest niepotrzebny. Natomiast nadpisywanie zmiennej $row nie ma tutaj nic do rzeczy, choć to zależy od tego, czy w drugiej pętli while (lub w ogóle po nadpisaniu zmiennej $row) wykorzystujesz (chcesz wykorzystać) dane pobrane za pomocą pierwszego zapytania. Niewątpliwie problemem jest nadpisywanie obiektu $s, gdyż obiekt ten przechowuje odpowiedni zasób zwrócony przez zapytanie SQL. Kiedy pierwsza pętla while wykona już jeden przebieg, to próbuje uzyskać dostęp do zmiennej $res obiektu $s, aby pobrać następny rekord. Jednak obiekt ten został nadpisany i nie zawiera już wyników pierwszego zapytania, a zawiera wyniki zapytania drugiego (tutaj się gubi, ale nie druga pętla, tylko pierwsza). Wyjaśnię dobitniej w komentarzach do kodu:
  1. // tworzymy obiekt $s
  2. $s->sql("zapytanie"); // wykonujemy zapytanie, a identyfikator zasobu zapisujemy w zmiennej $res obiektu $s
  3.  
  4. while($row = my..fe..as($s->res)) { // pobieramy wiersz z zasobu przypisanego do zmiennej $res obiektu $s
  5.  
  6. // tutaj możemy wykorzystać dane pobrane z pierwszego zapytania i zapisane w zmiennej $row
  7.  
  8. $s->sql("zapytanie2"); // wykonujemy zapytanie, a identyfikator zasobu zapisujemy w zmiennej $res obiektu $s
  9. // i tutaj pojawia się problem, ponieważ pierwsza pętla while nie będzie się poruszać po zasobie zwróconym
  10. // przez pierwsze zapytanie, gdyż został on nadpisany, a będzie się poruszać po zasobie zwróconym przez drugie zapytanie
  11.  
  12.  
  13. while($row = my..fe..as($s->res)) {
  14.  
  15. // tutaj już nie możemy wykorzystać danych pobrany z pierwszego zapytania, gdyż teraz w zmiennej $row znajdują się dane pobrane z drugiego zapytania
  16.  
  17. // wykorzystanie tutaj drugiej pętli while w praktyce oznacza, że pierwsza pętla while kończy działanie, już po pierwszym przebiegu, ponieważ ukryty wskaźnik wyniku został przesunięty do końca zasobu zwróconego przez drugie zapytanie, po którym to zasobie teraz porusza się również pierwsza pętla
  18.  
  19. }
  20. // tutaj również nie możemy wykorzystać danych pobranych z pierwszego zapytania, ponieważ w zmiennej $row mamy w tej chwili dane z ostatniego wiersza zwróconego przez drugie zapytanie
  21. }

Jeszcze słowo odnośnie rozwiązania z identyfikatorem wyniku. W praktyce nie stosuje się takiego czegoś. Zazwyczaj jeden obiekt przechowuje wyniki jednego zapytania, a inny obiekt wyniki innego zapytania. Jednak nie jest to niewykonalne. Kwestią do rozstrzygnięcia jest odpowiednia budowa klasy.

@mdco: piszesz o nadpisywaniu i sam nadpisujesz
  1. class S {
  2. public var $res;
  3. public __construct() {
  4. //......
  5. }
  6. public function sql($q) {
  7. $this->res = mysql_query ($q);
  8. }
  9.  
  10. }
  11.  
  12. $s = new S();
  13. $s->sql("zapytanie1");
  14. while($row1 = my..fe..as($s->res)) {
  15. $s = new S();
  16. $s->sql("zapytanie2");
  17. while($row2 = my..fe..as($s->res)) {
  18. }
  19. }
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 Aktualny czas: 22.08.2025 - 09:04