Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zmienne globalne
Forum PHP.pl > Forum > PHP
tmk
Witam wszystkich

robie serwis skladający się z wieleu pod stron, w jednym pliku definiuję sobie zmienne przechowujące dane takie jak: nazwa bazy danych, login, hasło, użytkownik bazy itp.
Żeby te dane były dostepnę w funkcjach, potrzebuję zmiennych globalnych. I teraz pytanie, czy byłoby bezpieczne zrobienie tych wszystlich zmiennych jako global? Chodzi mi o
  1. <?php
  2. global $baza, $username, $user_pass ...;
  3. ?>

jakie z tego moga wynikać zagrożenia?
tomekp
Rozumiem, że chcesz wykorzystać zmienne globalne tylko do przerzucenia danych logowania do bazy, wydaje mi się, że nie ma w tym nic niebezpiecznego.
Ja mam takie dwie funkcje do łączenia z bazą i wykonywania zapytania:
  1. <?php
  2. function connection() {
  3. global $conn;
  4. global $cfg;
  5. if ($conn) {
  6. return $conn;
  7. } else {
  8. $conn = mysql_connect($cfg['mysql']['host'],$cfg['mysql']['login'],$cfg['mysql']['pass']);
  9.  
  10. if (!$conn || !mysql_select_db($cfg['mysql']['db'],$conn)) {
  11. echo("Połączenie z bazą jest niemożliwe, skontaktuj się z Administratorem.");
  12. } else {
  13. return $conn;
  14. }
  15. }
  16. }
  17.  
  18. function sql($query) {
  19. if(!($conn = connection())) {
  20. echo("Połączenie z bazą jest niemożliwe, skontaktuj się z Administratorem.");
  21. } else {
  22. $result = mysql_query($query,$conn);
  23. if(!$result) {
  24. echo("<b>Zapytanie :</b><br>['$query']<br>");
  25. echo("<hr color='black'><b>Błąd :</b><br>[".mysql_error()."]");
  26. echo("<hr color='black'>");
  27. } else {
  28. return $result;
  29. }
  30. }
  31. }
  32. ?>
Cysiaczek
Unikaj zmiennych globalnych jak ognia exclamation.gif!
Jeśli już potrzebujesz takich informacji, to najlepiej zainteresuj się obiektami i czymś, co nazywa się wzorcem 'singleton'
To trochę bezpieczniejsza forma zmiennych globalnych (nawet, jeśli nie chcesz projektowa i programowa obiektowo)
tomekp
Dlaczego unikać zmiennych globalnych jak ognia?
Prph
A dlaczego zmienne a nie stale?
Rzeczy takie jak nazwa bazy, haslo itp to raczej stale:

  1. <?php
  2. define('_DB_HOST', 'localhost');
  3. ...
  4.  
  5. mysql_connect(_DB_HOST, .., .., ..);
  6. ?>


W ogole jak na to spojrzec bardziej profesjonalnie, to sa to dane konfiguracyjne. Warto wiec napisac Klase np. Registry i uzywac:

  1. <?php
  2. mysql_connect(Registry::getEntry('db_host'));
  3. ?>


Pozdrawiam.
Cysiaczek
Należy ich unikac, bo są niebezpieczne dla zdrowia twoich aplikacji (możesz je np. przypadkowo nadpisac i będziesz miał problem).
Prph ma rację - dużo lepszym wyjściem jest użycie stałych lub ja mówiłem singletonów
tomekp
Użycie stałych wygląda rzeczywiście dobrze, a co to są te singletony?
Prph
Singleton to sposob na stworzenie klasy takiej, aby w aplikacji mozna bylo utowrzyc jej tylko jeden obiekt.

Co to znaczy? Ano nie zrobisz $obiekt = new MojaKlasa();

A dlaczego?

1. Kontruktor klasy powinien byc prywatny (powinien, bo jak uzywasz php4, to nie mozesz tego okreslic).
2. Obiekty tworzysz za pomoca innej metody, najczesniej nazwanej getInstance.

Przyklad:

  1. <?php
  2. class Klasa
  3. {
  4. private static $_oInstance;
  5.  
  6. private function __construct()
  7. {
  8. // tu robisz to co w normalnym konstruktorze chcialbys zrobic.
  9. }
  10.  
  11. public function getInstance()
  12. {
  13. if(!isset(self::$_oInstance))
  14. {
  15. $sClassName = __CLASS__;
  16. self::$_oInstance = new $sClassName;
  17. }
  18.  
  19. return self::$_oInstance;
  20. }
  21. }
  22. ?>


Jak widzisz getInstace sprawdza czy obiekt juz istnieje. Jezeli nie: tworzy go i zwraca. Jezeli instnieje: zwraca go.

A jak tego uzywac?

  1. <?php
  2. $obiekt = Klasa(); // zwroci blad!
  3.  
  4. $obiekt = Klasa::getInstance(); // tak jest dobrze
  5. ?>



Pamietajac, o tym ,ze klasy sa dostepne w kazdym pliku, poniewaz ich nazwy sa globalne, mozesz utworzyc tzw instancje (egzemplarz klasy - obiekt) w dowolnym miejscu.... Oczywiscie jezeli plik z klasa zostal wczesniej dolaczony.

O singletonie przeczytasz takze na php.net.

PS. Dodam jeszcze, ze ten rodzaj klas stosujesz tak, gdzie nie chcesz aby w aplikacji pojawil sie drugi obiekt tej klasy. Przyklad? Baza danych - jedna baza danych wystarczy w aplikacji. Inny? - cos co steruje aplikacja - jądro - dwa jądra? Hyh tylko u istot zywych winksmiley.jpg

Pozdrawiam.
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.