Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Funkcja pgp - Zapytanie do bazy danych
Forum PHP.pl > Forum > PHP
tarzinio
Witam serdecznie. Chce sobie ułatwić sprawę odnośnie zapytań do bazy danych. Stworzyłem wiec funkcję, jednak przeglądarka wyrzuca mi błąd. Gdy ciało funkcji wyrzucę poza funkcję to wszystko jest ok. Co może być nie tak?

Funkcja:
  1. function db_select($zap){
  2. $z = $mysqli->query($zap);
  3. // zapisujemy wynik zapytania do tablicy asocjacyjnej
  4. $z = $z->fetch_assoc();
  5. //return $z;
  6. // zwalniamy pamięć z wyniku
  7. $z->free();
  8. }


Wywołanie funkcji
  1. $a = db_select("SELECT * FROM `tarzinio`");


Błąd jaki wyrzuca
  1. Fatal error: Call to a member function query() on a non-object in <TU ŚCIEŻKA> on line 26
  2. W LINI 66 ZNAJDUJE SIĘ $z = $mysqli->query($zap);


Powie mi ktoś co jest nie tak?sad.gif

Pozdrawiam smile.gif
kayman
w funkcji nie ma deklaracji klasy mysqli
tarzinio
Bo jest ona zdeklarowana wcześniej. A skoro mówię, że gdy wyrzuciłem ciało funkcji poza funkcję i w zmienną $zap dałem zapytanie to wszystko działało, to logiczne, że musiało być wcześniej zdeklarowana zmienna smile.gif
kayman
poczytaj o przestrzeniach nazw
tarzinio
Jakoś mi to nie działa. Dałem przykład z http://blog.wilgucki.pl/2011/01/przestrzenie-nazw-w-php.html i lipa wywala błąd , ze nie jest pierwszą instrukcją, a dałem to na samą górę pliku.

Powie ktoś dokładniej co mogę zrobić by zaradzić temu?
kayman
źle napisałem późno jest smile.gif

zasięg zmiennych

  1.  
  2. $mysqli = new mysqli('localhost', 'login', 'haslo', 'nazwa_bazy');
  3.  
  4. function db_select($zap, $mysqli){
  5. $z = $mysqli->query($zap);
  6. // zapisujemy wynik zapytania do tablicy asocjacyjnej
  7. $z = $z->fetch_assoc();
  8. //return $z;
  9. // zwalniamy pamięć z wyniku
  10. $z->free();
  11. }
  12.  
  13. $a = db_select("SELECT * FROM `tarzinio`", $mysqli);
  14.  
tarzinio
Oo teraz rozumiem tongue.gif, a gdybym dał $mysqli jak zmienną globalną? Musiałbym wtedy dawać w funkcji drugą zmienną tą $mysqli?
rad11
Możesz do tego użyć prosty wzorze singleton nie będziesz musiał za każdym razem tworzyć obiektu do łączenia się z baza danych.
tarzinio
Powiesz mi kolego jak to zrobić?smile.gif Bo chciałbym by działało samo funkcja(zapytanie); Bez podawania drugiej zmiennej. tongue.gif
tarzinio
Nigdy nie operowałem na klasach. Nie wiem co i jak.
nospor
Użyj poprostu global i nie cuduj
tarzinio
  1. function db_select($zap){
  2. global $mysqli;
  3. $z = $mysqli->query($zap);
  4. // zapisujemy wynik zapytania do tablicy asocjacyjnej
  5. $z = $z->fetch_assoc();
  6. return $z;
  7. // zwalniamy pamięć z wyniku
  8. //$z->free();
  9. }

Takie rozwiązanie działa. Dziękuje bardzo za pomoc smile.gif Na pewno wgryzę się w klasy i ogarnę pomysł kolegi smile.gif Dziękuje wam smile.gif

W sumie teraz mam inny problem. Funkcja
  1. function db_select($zap){
  2. global $mysqli;
  3. $z = $mysqli->query($zap);
  4. // zapisujemy wynik zapytania do tablicy asocjacyjnej
  5. $z = $z->fetch_array(MYSQLI_ASSOC);
  6. return $z;
  7. // zwalniamy pamięć z wyniku
  8. $z->free();
  9. unset($zap,$z);
  10. }


zwraca mi zawsze jedną wartość. Jak zorbić by zwracało mi całą tablice wyciągniętą z bazy? Tak mogę usunąć $z = $z->fetch_array(MYSQLI_ASSOC) ale wtedy mój print zwraca
  1. [current_field] => 0
  2. [field_count] => 1
  3. [lengths] =>
  4. [num_rows] => 32
  5. [type] => 0


zamiast pięknego array sad.gif

Zrobiłem coś takiego:
  1. function db_select($zap){
  2. global $mysqli;
  3. $z = $mysqli->query($zap);
  4. // zapisujemy wynik zapytania do tablicy asocjacyjnej
  5. //$z = $z->fetch_array(MYSQLI_ASSOC); //- wyciąga jedną zmienną
  6. $wynik = array();
  7. $num = 0;
  8. while ($wyn = $z->fetch_assoc()) {
  9. $wynik[$num]= $wyn;
  10. $num ++;
  11. }
  12. return $wynik;
  13.  
  14.  
  15. // zwalniamy pamięć z wyniku
  16. $z->free();
  17. unset($zap,$z, $wynik);
  18. }


Jednak pytanko. Da się to ładniej, schludniej napisać?
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.