Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Jak zrobić aby zmienna była widziana w funkcjach?
Forum PHP.pl > Forum > Przedszkole
Saki
Witam, mam taki mały problem, funkcje działają ok, ale nie mają połączenia z bazą, choć dodałem połączenie na początku pliku
  1. if (!$db = new SQLite3('baza.db')) {
  2. error("Could not connect to database");
  3. }
  4.  
  5. function funkcja1() {
  6. $result = $db->query();
  7. return $result->fetchSingle($result);
  8. }
  9.  
  10. function funkcja2($id) {
  11. $result = $db->query();
  12. return $result->fetchSingle($result);
  13. }
  14.  
  15. function funkcja3($id) {
  16. $result = $db->query();
  17. return $result->fetchSingle($result);
  18. }


podane funkcje nawet nie widzą zmiennej $db, czemu? jak to naprawić bez dodawania do każdej funkcji global $db?
patryczakowy
Poczytaj o zasięgu zmiennych
Saki
Cytat(patryczakowy @ 8.08.2014, 00:07:48 ) *
Poczytaj o zasięgu zmiennych


Dokładnie, ale jak to zrobić?
Jakiś przykaład do mojego problemu?
Damonsson
Hmm, jak tak bardzo chcesz kombinować to możesz to zrobić np. tak:

  1. $db = Twoje połączenie;
  2.  
  3. if (!$db = new SQLite3('baza.db')) {
  4. error("Could not connect to database");
  5. }
  6.  
  7. function funkcja1($db) {
  8. $result = $db->query();
  9. return $result->fetchSingle($result);
  10. }
  11.  
  12. function funkcja2($db, $id) {
  13. $result = $db->query();
  14. return $result->fetchSingle($result);
  15. }
  16.  
  17. function funkcja3($db, $id) {
  18. $result = $db->query();
  19. return $result->fetchSingle($result);
  20. }
Saki
Cytat(Damonsson @ 8.08.2014, 00:08:43 ) *
Hmm, jak tak bardzo chcesz kombinować to możesz to zrobić np. tak:

  1. $db = Twoje połączenie;


To jest moje połączenie: $db = new SQLite3('baza.db')
patryczakowy
jeśli nie chcesz przekazywać do każdej funkcji i używać global to klasę db zrób jako singleton i pobieraj sobie uchwyt w każdej funkcji np. DB:init();
Damonsson
No to sobie to wpisz zamiast mojego tekstu i voila. withstupidsmiley.gif
Saki
Cytat(Damonsson @ 8.08.2014, 00:11:03 ) *
No to sobie to wpisz zamiast mojego tekstu i voila. withstupidsmiley.gif


Właśnie to nie działa. Dlatego zadałem to pytanie..

Cytat(patryczakowy @ 8.08.2014, 00:10:50 ) *
przekazywać do każdej funkcji


a jak się przekazuje zmienną bez wpisywania do każdej funkcji nowej linijki kodu?
mógłbyś mi pokazać przykład classy singleton do mojego przykładu?
Damonsson
To zrób sobie ten przykład i przeanalizuj, co zrobiłeś źle.

  1. $db = 'Jajko';
  2.  
  3. function funkcja1($db) {
  4. echo $db . '1';
  5. }
  6.  
  7. function funkcja2($db, $id) {
  8. echo $db . '2';
  9. }
  10.  
  11. function funkcja3($db, $id) {
  12. echo $db . '3';
  13. }
  14.  
  15. funkcja1($db);
  16. funkcja2($db, false);
  17. funkcja3($db, false);


Zresztą skoro tak piszesz, to jeden pies czy zrobisz tak, czy użyjesz Global i tak będzie do bani.
Saki
Cytat(Damonsson @ 8.08.2014, 00:16:35 ) *
Zresztą skoro tak piszesz, to jeden pies czy zrobisz tak, czy użyjesz Global i tak będzie do bani.


a jak to poprawnie zrobić?
Damonsson
To jest wykład na kilka godzin wink.gif Np tak jak napisał Ci @patryczakowy

Pisz po swojemu, a przykład z jajkiem musi działać, a więc Twoje połączenie tak samo musi być widoczne w każdej funkcji.
Saki
Cytat(Damonsson @ 8.08.2014, 00:23:19 ) *
To jest wykład na kilka godzin wink.gif Np tak jak napisał Ci @patryczakowy

Pisz po swojemu, a przykład z jajkiem musi działać, a więc Twoje połączenie tak samo musi być widoczne w każdej funkcji.


może którki przykład?
Damonsson
www.google.com
by_ikar
W tym swoim króciutkim kodzie nigdzie nie wywołujesz żadnej przez siebie stworzonej funkcji, to i nic nie widać - co jest OCZYWISTE. Ja zamiast globala czy przekazywania jako parametr proponuje stworzyć inną funkcję która będzie zwracać połączenie z bazą danych:

  1. <?php
  2.  
  3.  
  4. /** @return SQLite3 **/
  5. function database()
  6. {
  7. static $db;
  8.  
  9. if(null == $db)
  10. {
  11. if (!$db = new SQLite3('baza.db'))
  12. {
  13. die('Could not connect to database');
  14. }
  15. }
  16.  
  17. return $db;
  18. }
  19.  
  20. /** @return array **/
  21. function funkcja1()
  22. {
  23. $result = database()->query();
  24.  
  25. return $result->fetchSingle($result);
  26. }
  27.  
  28. /** @return array **/
  29. function funkcja2($id)
  30. {
  31. $result = database()->query();
  32.  
  33. return $result->fetchSingle($result);
  34. }
  35.  
  36. /** @return array **/
  37. function funkcja3($id)
  38. {
  39. $result = database()->query();
  40.  
  41. return $result->fetchSingle($result);
  42. }
  43.  
  44.  
  45. var_dump(funkcja1(), funkcja2('something'), funkcja3('something else'));


Jak piszesz że nie działa, to napisz co dokładnie się dzieje, bo może nie masz sqlite dostępnego w php, czy coś. Nie jesteśmy wróżkami, a próbujesz rozmawiać z nami jak z debilami:
Kod
<ty> nie działa
<my> ale co ci nie działa?
<ty> przecież mówię że nie działa


Pamiętaj, nikt tutaj wróżbiarstwem się nie zajmuje, jeżeli chcesz jakiś racjonalnych odpowiedzi, to racjonalnie odpowiadaj. Jeżeli nie potrafisz, to tak jak kolega wcześniej napisał, google i się doucz sam.
nospor
@by_ikar z całym szacunkiem, ale żeś mu doradził że lepiej by wyszedl wpadając pod samochod.... tongue.gif
Przeciez Twoj kod, za każdym razem tworzy nowe połączenie. Teraz koles odpali funkcję 10 razy w czasie jednego żądania i ma 10 razy tworzone na nowo połączenie... No jak juz pomagasz, to rob to jak nalezy a nie tak rzeczy wypisujesz. To juz o wiele lepszy bylby tutaj GLOBAL.

@Saki tu masz napisane o zasiegu zmiennych (GLOBAL)
http://pl1.php.net/manual/en/language.variables.scope.php
Zajrzyj tu wkoncu a nie tylko ciagle "jak to zrobic, jak to zrobic....". Tak sie nie korzysta z forum... dostajesz materialy i probujesz to wdrozyc. Jak sie nie udaje, to pokazujesz kod ze zmianami, piszesz, co nie dziala i idziemy dalej. To są podstawy komunikacji forumowej
by_ikar
@up w sumie po czasie pomyślałem że faktycznie, taka funkcja będzie tworzyć instancje połączenia za każdym razem.. Dodałem static do zmiennej do której jest przypisywane połączenie. Teraz jest już chyba lepiej.. biggrin.gif
nospor
W twoim kodzie wystaczy dodac statyczną zmienną $db w funkcji database() i już by było git.
Jak chcesz sie zrehabilitować to popraw to smile.gif
by_ikar
Tak poprawiłem to już, zanim napisałeś posta, i nawet poprawiłem poprawkę biggrin.gif ojj dawno się nie musiałem zmagać z proceduralnymi "problemami"..
nospor
No nadal źle..... Nadal robisz połączenie... połączenie masz robic tylko wtedy, gdy $db is null
by_ikar
Widzę że nie dasz mi doczytać do końca rss'a.. biggrin.gif

EDIT: tyle że ten static pewnie można by zastąpić global i wyszło by na to samo.. Tzn chodzi mi o to że można by tylko w tej jednej funkcji dopisać global i nie trzeba by wypisywać wszędzie - czyli to czego chciał uniknąć autor..
nospor
Jakbys od razu napial porzadnie to bys mial swiet spokoj wink.gif

Ok, teraz jest juz lepiej smile.gif
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.