Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Własna funkcja w warunku while
Forum PHP.pl > Forum > Przedszkole
o2w5n778
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?
nospor
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.
o2w5n778
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.
viking
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ł.
o2w5n778
Nie ma przykładu jak to zrobić w manualu funkcji mysql_fetch_array.
markonix
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.
ethann
@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.
o2w5n778
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
ethann
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. ?>
markonix
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.
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.