Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Klasa do połączeń i zapytań SQL
Zagiewa
post
Post #1





Grupa: Zarejestrowani
Postów: 84
Pomógł: 0
Dołączył: 12.08.2009

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


Witam. Chcę stworzyć klasę do połączenia SQL w której będą też metody do zapytań jednak zależy mi na stworzeniu bardzo wydajnej klasy, a co więcej, żeby cały kod był dobrej jakości dlatego też ja mam pomysł i jakiś zalążek wiedzy, wy za to duże doświadczenie więc liczę, że mi trochę pomożecie (IMG:style_emoticons/default/smile.gif) Głównym motywem na chwile obecną jest stworzenie metod, które będą generowane w zależności od tego co będziemy chcieli osiągnąć. Poniżej zamieszczę kod, który do tej pory napisałem, a pod nim pytania.

  1. <?php
  2.  
  3. class connection {
  4.  
  5. private $DB;
  6.  
  7. function __construct($DB_in) {
  8.  
  9. $this->DB = $DB_in;
  10. }
  11.  
  12. public function SQL_connect() {
  13.  
  14. include('static.php');
  15.  
  16. $sql = mysql_connect(SQL_HOST, SQL_USER, SQL_PASS) or
  17. die("Sprawdź połączenie z serwerem! " . mysql_error());
  18. mysql_query("SET NAMES 'utf8'");
  19.  
  20. mysql_select_db($this->DB, $sql) or
  21. die("Sprawdź bazę! " . mysql_error());
  22. }
  23.  
  24. public function select_table($what_in, $from_in) {
  25.  
  26. $pobierz = "SELECT $what_in FROM $from_in";
  27. $result = mysql_query($pobierz) or
  28. die("Sprawdź rezultat! " . mysql_error());
  29.  
  30. while($row = mysql_fetch_array($result)) {
  31.  
  32. $a = $row[$what_in];
  33. echo $a. "<br />";
  34. }
  35. }
  36. }
  37.  
  38. ?>

  1. <?php
  2.  
  3. include('class.php');
  4. $connect = new connection("nazwa_bazy");
  5. $connect->SQL_connect();
  6. $connect->select_table("id", "nazwa_tabeli");
  7.  
  8. ?>

1. Chciałem aby można było za pomocą jednej metody łączyć się z różnymi bazami dlatego zanim wywołamy metodę SQL_connect() dzięki konstruktorowi podajemy, która baza nas interesuje. Teraz pytanie czy rozwiązanie to jest dobre? Czy może lepiej było by usunąć konstruktor i nazwę bazy podać bezpośrednio do metody czyli: SQL_connect("nazwa_bazy")?
2. Jak wiadomo zanim wykonamy jakiekolwiek operacje na tabelach w bazie trzeba się połączyć z bazą więc łączenie z SQL MUSI się odbyć prawda? więc zastanawiam się czy by nie zrezygnować z metody SQL_connect() i całość kodu wstawić w konstruktor wyglądało by to tak:
  1. function __construct($DB_in) {
  2.  
  3. $this->DB = $DB_in;
  4.  
  5. include('static.php');
  6.  
  7. $sql = mysql_connect(SQL_HOST, SQL_USER, SQL_PASS) or
  8. die("Sprawdź połączenie z serwerem! " . mysql_error());
  9. mysql_query("SET NAMES 'utf8'");
  10.  
  11. mysql_select_db($this->DB, $sql) or
  12. die("Sprawdź bazę! " . mysql_error());
  13. }

Ma to sens? Mam jeszcze pytania odnośnie metody select_table() ale to innym razem. Jeśli macie ew. jakieś zastrzeżenia co do tego kodu to piszcie. Z góry dzięki (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Zagiewa
post
Post #2





Grupa: Zarejestrowani
Postów: 84
Pomógł: 0
Dołączył: 12.08.2009

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


I owszem zrobiłem tak zanim napisałem na forum i wszędzie pisze nawet na jednym z tematów na tym forum, że trzeba sprawdzić czy ma się włączoną obsługę extension=php_pdo_mysql.dll - mam. Druga sprawa to czy ma się PHP w wersji co najmniej 5.1 - mam. Czy phpinfo() pokazuje, że mamy włączone PDO - mam. Więc czego może jeszcze brakować? ale OK będę szukał dalej

OK mam. Miałem zakomentowane: extension=php_pdo_mysql.dll Teraz działa.

Ok więc korzystając z PDO udało mi się przekształcić poprzednią klasę na tą poniżej.
  1. <?php
  2.  
  3. class connection {
  4.  
  5. private $DB;
  6. private $what;
  7. private $from;
  8.  
  9. function __construct($DB_in, $what_in, $from_in) {
  10.  
  11. $this->DB = $DB_in;
  12. $this->what = $what_in;
  13. $this->from = $from_in;
  14. }
  15.  
  16. public function select_table() {
  17.  
  18. include('static.php');
  19.  
  20. try {
  21.  
  22. $pdo = new PDO('mysql:host=' .SQL_HOST. ';dbname=' .$this->DB. '', SQL_USER, SQL_PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
  23. $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  24.  
  25. $stmt = $pdo -> query('SELECT ' .$this->what. ' FROM ' .$this->from. '');
  26.  
  27. foreach($stmt as $row) {
  28.  
  29. $a = $row[$this->what];
  30. echo $a. "<br />";
  31. }
  32.  
  33. $stmt -> closeCursor();
  34. }
  35.  
  36. catch(PDOException $e) {
  37.  
  38. echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
  39. }
  40. }
  41. }
  42.  
  43. ?>

  1. <?php
  2.  
  3. include('class.php');
  4. $connect = new connection("nazwa_bazy", "id", "nazwa_tabeli");
  5. $connect->select_table();
  6.  
  7. ?>

Jednak pisząc to zaczęły pojawiać się pytania...
tehaha - do mojej poprzedniej klasy wspomniałeś o luce SQL_Injection i że brakuje mi mysql_real_escape_string() gdy zastosowałem tą funkcję do obecnej klasy dla którejkolwiek zmiennej (DB, what, from) otrzymałem błąd. Co do tego błędu to jeszcze się zajmę nim później ale moje pytanie - czy PDO jest bezpieczne od SQL_injection?
Druga sprawa to czy muszę za każdym razem łączyć się z bazą gdy chcę utworzyć nowe zapytanie? Bo gdy chciałem utworzyć jedną metodę do łączenia się z bazą, a drugą z zapytaniem o konkretną tabelę to nie działało - zrobiłem błąd czy tak ma być?

Ten post edytował Zagiewa 23.02.2011, 00:15:32
Go to the top of the page
+Quote Post

Posty w temacie
- Zagiewa   Klasa do połączeń i zapytań SQL   22.02.2011, 16:41:40
- - tehaha   oprócz zastrzeżeń to nie wiele więcej zostaje, naj...   22.02.2011, 18:45:30
- - Zagiewa   Z tym PDO to już jakiś standard? tzn zawsze się te...   22.02.2011, 22:19:07
- - tehaha   1. PDO po prostu został stworzony do obsługi bazy ...   22.02.2011, 22:34:30
- - Zagiewa   Ad.2 Fakt zapomniałem kompletnie o tym, dzięki Ad....   22.02.2011, 22:52:42
- - tehaha   dam Ci jedną radę jak pojawia Ci się jakiś błąd i ...   22.02.2011, 23:04:10
- - Zagiewa   I owszem zrobiłem tak zanim napisałem na forum i w...   22.02.2011, 23:09:06
- - mg2   Obiekt $pdo jest połączeniem do bazy. Rozłącz...   23.02.2011, 01:51:40
- - darko   Dziedzicz po klasie PDO dodając jakieś pożądane fu...   23.02.2011, 01:59:13
- - Zagiewa   Dziś już jestem zbyt zmęczony na dalsze pisanie ko...   23.02.2011, 02:22:29
- - d3ut3r   PDO to właśnie klasa której powinieneś używać, nie...   23.02.2011, 02:51:25
- - Zagiewa   d3ut3r - dokładnie o to mi chodzi. Chcę aby PDO by...   23.02.2011, 17:17:51
- - greycoffey   Tak, szukałeś, ja tu widzę rozwianie.. Kliknij...   23.02.2011, 19:22:00
- - Zagiewa   greycoffey - piękna animacja, podoba mi się jednak...   23.02.2011, 19:30:45
- - darko   Zdaje się, że ta linia [PHP] pobierz, plaintext $s...   24.02.2011, 04:05:59
- - Zagiewa   darko dobrze kombinujesz i też tak próbowałem... j...   24.02.2011, 12:16:41
- - darko   Racja oczywiście nie wolno parametryzować nazw tab...   24.02.2011, 13:55:55
- - Zagiewa   OK zgodzę się z tym, że bindowanie ma na celu zabe...   24.02.2011, 14:13:23
- - darko   Efekt, o który pytasz uzyskuje się za pomocą metod...   24.02.2011, 14:22:13
- - Zagiewa   Więc twierdzisz, że się da stworzyć taki schemat? ...   24.02.2011, 14:33:47
- - darko   Mam wrażenie, że sam sobie nieco utrudniasz życie....   24.02.2011, 15:59:50
- - Zagiewa   darko masz racje można wstawić w zapytanie zmienne...   24.02.2011, 16:41:44


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 6.10.2025 - 03:12