Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP] Własna funkcja w warunku while
o2w5n778
post 25.04.2012, 18:48:25
Post #1





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 10.12.2009

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


Witam!
Chciałbym umieścić w warunku funkcji while stworzoną wcześniej funkcję, zawiera ona zapytania i zwraca mysql_fetch_array. Niestety nie działa mi to.
  1. <form method="post" action="#">
  2. <input type="text" name="ala" /><input type="submit" />
  3. </form>
  4. <?php
  5. mysql_connect('localhost', 'root', '');
  6. mysql_select_db('project1');
  7.  
  8. function loop(){
  9. $query = mysql_query("SELECT * FROM pr_pages WHERE page_id=".$_POST['ala']."");
  10. $sas = mysql_fetch_array($query);
  11. return $sas;
  12. }
  13.  
  14. while(loop()){
  15. $sas['page_id'];
  16. }
  17.  
  18.  
  19. ?>

W czym problem?


--------------------
Go to the top of the page
+Quote Post
nospor
post 25.04.2012, 19:18:53
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Przecież loop zawsze zwraca pierwszy rekord wiec ci się petla while zapętla. A teraz zadanie dla ciebie: zastanów się dlaczego loop() zawsze zwraca pierwszy rekord. To nie jest pytanie podchwytliwe.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
o2w5n778
post 26.04.2012, 06:20:09
Post #3





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 10.12.2009

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


Chcę stworzyć funkcję, którą będzie się podawało w pętli do wyświetlania artykułów (w szablonie), tylko w szablonie nie będę pisał zapytań itd. więc potrzebuję funkcji.

Co do pytania to odpowiem wprost, niestety, nie wiem.
Liczę na jakieś wskazówki.

Ten post edytował o2w5n778 26.04.2012, 06:20:20


--------------------
Go to the top of the page
+Quote Post
viking
post 26.04.2012, 06:46:16
Post #4





Grupa: Zarejestrowani
Postów: 6 378
Pomógł: 1116
Dołączył: 30.08.2006

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


Po pierwsze sql injection (mysql_real_escape_string dla danych POST). Po drugie, poczytaj w dokumentacji (return dla funkcji, jest przykład z opisem) o zasięgu zmiennych bo możesz zapomnieć że $sas będzie dostępne poza funkcją. A po trzecie w dokumentacji mysql_fetch_array masz przykłady jak to zrobić. Pierwsze zdanie tej samej strony dokumentacji opisuje Ci to o czym nospor pisał.

Ten post edytował viking 26.04.2012, 06:47:54


--------------------
Go to the top of the page
+Quote Post
o2w5n778
post 26.04.2012, 11:41:41
Post #5





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 10.12.2009

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


Nie ma przykładu jak to zrobić w manualu funkcji mysql_fetch_array.


--------------------
Go to the top of the page
+Quote Post
markonix
post 26.04.2012, 11:58:39
Post #6





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


POD i fetchAll albo musisz w ciele funkcji utworzyć tymczasową tablicę i ją zwrócić.
Funkcja będzie zwracać tablicę (asocjacyjną) i sobie ładnie będziesz ładnie wyświetlał listy za pomocą foreach.


--------------------
Go to the top of the page
+Quote Post
ethann
post 26.04.2012, 12:14:59
Post #7





Grupa: Zarejestrowani
Postów: 56
Pomógł: 18
Dołączył: 7.04.2012

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


@markonix
Tak, jest to dobre rozwiązanie ale dwukrotnie użyjesz pętli, przez co czas wykonywania kodu się minimalnie zwiększy.

  1. <form method="post" action="#">
  2. <input type="text" name="ala" /><input type="submit" />
  3. </form>
  4. <?php
  5. mysql_connect('localhost', 'root', '');
  6. mysql_select_db('project1');
  7.  
  8. $query = mysql_query("SELECT * FROM pr_pages WHERE page_id=".intval($_POST['ala']));
  9. while($sas = mysql_fetch_array($query)){
  10. echo $sas['page_id']."<br />";
  11. }
  12. ?>


Jak pisał viking - bezpieczeństwo jest ważne, chyba że projekt polega na ukazaniu słabości. Stąd umieszczenie funkcji intval() - skoro page_id to pomyślałem że to liczba wink.gif.
I wygląda to niemal jak przykład z php.net.

Jeśli koniecznie chcesz użyć własnej funkcji to wykonaj wcześniej mysql_query() i przekaż jego wynik jako argument Twojej funkcji.

Ten post edytował ethann 26.04.2012, 12:19:26
Go to the top of the page
+Quote Post
o2w5n778
post 26.04.2012, 12:26:49
Post #8





Grupa: Zarejestrowani
Postów: 235
Pomógł: 0
Dołączył: 10.12.2009

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


Chyba troszkę źle się wyraziłem lub mnie nie zrozumieliście smile.gif
Chcę zrobić w moim systemie tak, abym mógł w szablonie za pomocą pętli wyświetlać dane. Niestety niezbyt będzie to optymalne jeżeli w pliku szablonu będę tworzył zapytania itd.
Mój problem polega na tym że nie mogę stworzyć funkcji, którą będę mógł umieścić we warunku pętli while/foreach (obojętnie) i ma ona zawierać zapytanie itd. A w szablonie za pomocą tablicy będę wyświetlał dane.

Prościej mówiąc rozwiązanie wordpress'owe wink.gif

Ten post edytował o2w5n778 26.04.2012, 12:27:39


--------------------
Go to the top of the page
+Quote Post
ethann
post 26.04.2012, 12:35:04
Post #9





Grupa: Zarejestrowani
Postów: 56
Pomógł: 18
Dołączył: 7.04.2012

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


To tak jak pisał markonix. Tylko Jego pomysłem było użycie do tego PDO.

  1. <?php
  2. [... connect ...]
  3.  
  4. function foo() {
  5. $q = mysql_query("SELECT * FROM pr_pages WHERE page_id=".intval($_POST['ala']));
  6. $ret = array();
  7. while($r = mysql_fetch_assoc($q)) $ret[] = $r;
  8.  
  9. return $ret;
  10. }
  11.  
  12. foreach(foo() as $value) {
  13. echo $value['pr_pages'];
  14. }
  15.  
  16. ?>


Ten post edytował ethann 26.04.2012, 12:35:42
Go to the top of the page
+Quote Post
markonix
post 26.04.2012, 13:18:45
Post #10





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


Funkcja może zwracać resurce mysql a potem w "widoku" można zrobić pętle mysql_fetch_assoc czy inną.
Wtedy jednak brzydko to wygląda (funkcja mysql wmieszana w HTML) dlatego tymczasowa tablica to chyba jedyna opcja.
PDO i fetchAll pewnie też na tej zasadzie działa tylko szybciej.


--------------------
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: 16.06.2025 - 21:39