Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zmienne globalne
tmk
post
Post #1





Grupa: Zarejestrowani
Postów: 135
Pomógł: 0
Dołączył: 15.04.2004
Skąd: w-wa

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


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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
tomekp
post
Post #2





Grupa: Zarejestrowani
Postów: 171
Pomógł: 0
Dołączył: 17.12.2003
Skąd: Krakół

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


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


--------------------
escape from the execution is futile.
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #3





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




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)


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
tomekp
post
Post #4





Grupa: Zarejestrowani
Postów: 171
Pomógł: 0
Dołączył: 17.12.2003
Skąd: Krakół

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


Dlaczego unikać zmiennych globalnych jak ognia?


--------------------
escape from the execution is futile.
Go to the top of the page
+Quote Post
Prph
post
Post #5





Grupa: Zarejestrowani
Postów: 338
Pomógł: 2
Dołączył: 4.03.2006
Skąd: Łódź

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


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.
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #6





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




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


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
tomekp
post
Post #7





Grupa: Zarejestrowani
Postów: 171
Pomógł: 0
Dołączył: 17.12.2003
Skąd: Krakół

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


Użycie stałych wygląda rzeczywiście dobrze, a co to są te singletony?


--------------------
escape from the execution is futile.
Go to the top of the page
+Quote Post
Prph
post
Post #8





Grupa: Zarejestrowani
Postów: 338
Pomógł: 2
Dołączył: 4.03.2006
Skąd: Łódź

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


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.

Ten post edytował Prph 24.05.2006, 17:35:35
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 Aktualny czas: 19.08.2025 - 11:34