Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]obiektowe połaczenie z bazą
Forum PHP.pl > Forum > Przedszkole
pablo_83
witam,
jestem początkujący w obiektowym programowaniu i za bardzo nie chce mi to do głowy wejść.
Próbuję się połączyć obiektowo z bazą i napisałem poniższy kod

  1. <?php
  2. require_once ('hasla.php');
  3. ?>
  4.  
  5. <?php
  6.  
  7. class DataAccess
  8. {
  9. var $DataBase;
  10.  
  11. function BaseConnect ($host, $user, $password, $db)
  12. {$this->db = mysql_connect ($host, $user, $password) or die ('Nie mogę nawiązać połączenia');
  13. mysql_select_db ($db,$this->db);
  14. mysql_query("Set Names 'utf8'");
  15. mysql_query("Set collation_connection = utf8_polish_ci");
  16. }
  17.  
  18. function BaseClose ()
  19. {$this->BaseConnect;
  20. $close = $this->db;
  21. mysql_close($close);
  22. }
  23. }
  24.  
  25.  
  26. $DataBase = new DataAccess();
  27. /*if (!$DataBase) {echo 'niepołączony';}
  28.   else {echo 'połączony';}*/
  29. ?>


Moje pytanie brzmi, czy ten kod jest poprawny?
Jak w prosty sposób mogę sprawdzić połączenie z bazą ( czy mogę zrobić coś takiego jak w wykomentowaniu).
Proszę o pomoc w rozwiązaniu, chce zrozumieć w końcu tą obiektowość, czytałem sporo ale jakoś w teorii nie wchodzi mi to głowy
może na własnych błędach i swoim przykładzie uda mi się to zrozumieć.

Składnia kodu powinna być ok bo żadne błędy nie wyskakują.
matiit
Czemu nie tworzysz konstruktora?

Będziesz musiał samemu wykonywać DataAccess->BaseConnect($args) itd
erix
Cytat
Składnia kodu powinna być ok bo żadne błędy nie wyskakują.

  1. czemu nie podajesz kontekstu połączenia?
  2. czemu korzystasz z var, które od PHP5 nie ma sensu?
  3. czemu w baseClose wywołujesz zmienną, nie metodę?
  4. skoro robisz klasę abstrakcji, to czemu nazewnictwo prefiksujesz zawsze base*?
  5. czemu nie używasz wyjątków?
  6. o konstruktorze już wspomniano
pablo_83
Poprawiłem trochę kod myślę że teraz będzie lepiej.
Jeśli nie to proszę o uwagi co źle i dlaczego. Co do var, raczej musi zostać na serwerze wywala mi błąd składni gdy zamieniam na public.
Hasła i dane do połączenia ładuje przez require_once - czy to w tym przypadku będzie działało?
podkreślam że raczkuje w tematyce OOP.

  1. <?php
  2. require_once ('hasla.php');
  3. ?>
  4.  
  5. <?php
  6.  
  7. class DataAccess
  8. {
  9. var $MyDataBase;
  10.  
  11. function __construct ($host, $user, $password, $db)
  12. {$this->MyDataBase = mysql_connect ($host, $user, $password) or die ('Nie mogę nawiązać połączenia:'.mysql_error());
  13. mysql_select_db ($db) or die ('nie mogę wybrać bazy:'.mysql_error());
  14. mysql_query("Set Names 'utf8'");
  15. mysql_query("Set collation_connection = utf8_polish_ci");
  16. }
  17.  
  18. function __destruct()
  19. {mysql_close($this->MyDataBase);
  20. }
  21. }
  22.  
  23.  
  24. $MyDataBase = new DataAccess();
  25.  
  26. ?>
wookieb
Cytat(pablo_83 @ 5.09.2009, 15:20:37 ) *
Jak w prosty sposób mogę sprawdzić połączenie z bazą ( czy mogę zrobić coś takiego jak w wykomentowaniu)

Pójść do serwerowni z ciasteczkami i marchewką i zapytać się serwera Mysql czy się połączył.
A bardziej serio (jakie komunikat w die napisałeś?)

W dodatku nazewnictwo zmiennych/właściwości
mysql_connect zwraca ci "Twoją bazę danych?". Jest to bardzo ważne dla innych osób, które będą czytały kod. W manualu pisze co zwraca funkcja mysql_connect. Zastosuj do tego odpowiednią nazwę.

Nazwa klasy. "DataAccess"? Dostęp do danych? A nie raczej "DatabaseConnection"? ablo DbConnection?

Uwierz. Potworzysz w projekcie parę takich klas z dziwacznymi nazwami to po roku nie załapiesz o co chodziło.
230005
Jak może działać, skoro konstruktor przyjmuje argumenty, a nie przekazujesz ich do niego? Var to przestarzała konstrukcja - jeśli na serwerze dostajesz błąd składni, to może serv śmiga na php4 (są takie jeszcze?) - zmień serwer. No i zmienne klasy deklaruje się raczej jako private niż public, chyba że jest ku temu sensowny powód. Swoją drogą, do nauki równie dobrze mógłbyś działać na localhoście, używając choćby tego: http://www.apachefriends.org/en/xampp.html - zero konfiguracji, instalujesz i śmiga smile.gif.
Rookie
A nie powinno być zamiast:
  1. var $MyDataBase;

to:
  1. private $MyDataBase;

Żeby już pod php5 było.
Zamiast funkcji destrukcyjnej zrób funkcję np. zamknij().
I wtedy:
  1. $MyDataBase = new DataAccess(localhost, uzytkownik, haslo, nazwa_bazy_danych);
  2. //operacje na bazie
  3. $MyDataBase->zamknij();

Nie sprawdzałem, ale powinno być ok.
PS. Sam zaczynam z OOP ale już siedzę w tym niecały tydzień smile.gif
Pozdrawiam.
viking
Skoro chcesz obiektowo to zamiast cudować z własną klasą użyj mysqli albo PDO.
pablo_83
teraz kod wyświetla zawartość tabeli.
Mam pytanie czy jest on poprawny jeśli nie to co należałoby zmienić, mam pytanie dotyczące konstruktora jak to powinno wyglądać żeby najpierw zdefiniować konstruktor a potem metodę połączenia z bazą.
Nie mogę tego zczaić kompletnie proszę o rady.

  1. <?php
  2. //require_once ('hasla.php');
  3. ?>
  4.  
  5. <?php
  6.  
  7. class Connecting
  8. {
  9. private $baza;
  10.  
  11.  
  12. function __construct ($host, $user,$password, $baza)
  13. {$this->baza = mysql_connect (localhost, root, haslo, Serwis ) or die ('Nie mogę nawiązać połączenia:'.mysql_error());
  14. mysql_select_db (Serwis) or die ('nie mogę wybrać bazy:'.mysql_error());
  15. mysql_query("Set Names 'utf8'");
  16. mysql_query("Set collation_connection = utf8_polish_ci");
  17. }
  18.  
  19. private function DB_close()
  20. {$this->DB_connect();
  21. $close = $this->MyDataBase;
  22. mysql_close($close);
  23. }
  24. }
  25.  
  26.  
  27. $baza = new Connecting($host, $user, $password, $baza);
  28.  
  29. $zapytanie = ("SELECT * FROM Klient");
  30. $wynik = mysql_query($zapytanie) or die (mysql_error());
  31. echo '<form action="index.php" method="post"><table >';
  32. echo '<tr><td><select name="id">';
  33. while ($row = mysql_fetch_array($wynik)){
  34.  
  35. echo'<option value="'.$row['IdKlienta'].'">'.$row['Nazwisko']. '</option>';}
  36. echo '</select></td></tr>';
  37. echo '<tr><td><input type="submit" value="Pokaż Klienta"/></td></tr>';
  38. echo '</table></form>' ;
  39.  
  40. if (!isset($_POST['id']))
  41. {}
  42. else {
  43. $nazwisko = $_POST['id'];
  44.  
  45. $zapytanie = "SELECT * FROM Klient WHERE IdKlienta = '$nazwisko' ORDER By Nazwisko ASC";
  46. $wynik = mysql_query($zapytanie);
  47. $row = mysql_fetch_array($wynik);
  48.  
  49. '<table >
  50. <tr>
  51. <td>Nazwisko</td><td>-</td><td>'.$row['Nazwisko'].'</td></tr>
  52. <tr>
  53. <td>Imię</td><td>-</td><td>'.$row['Imie'].'</td></tr>
  54. <tr>
  55. <td>IdKlienta</td><td>-</td><td>'.$row['IdKlienta'].'</td></tr>
  56. <tr>
  57. <td>Telefon</td><td>-</td><td>'.$row['Telefon'].'</td></tr>
  58. </table>'; }
  59.  
  60. ?>


Jak zrobić żeby hasło i loginy były ładowane z osobnego pliku, jak wykorzystać require lub include??
raczkuje w tematyce obiektowości więc proszę o wyrozumiałość nawet jeśli moje pytania mogą się wydawać głupie lub banalne.
potreb
Panie pablo, nie jestem biegły czy średni w obiektówce, ale twoja klasa byłą pisana tysiąc razy i więcej, zobacz sobie przykłady u wujka google jak powinien wyglądać model twojej klasy
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.