Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Konstruktor inicjujący połączenie z bazą
Forum PHP.pl > Forum > Przedszkole
pjamorski
Witam,

Próbuje pisać swoją klasę na której chcę popracować z bazą danych. Oto ona:
  1. class MySQL_class
  2. {
  3. // fields
  4. var $server;
  5. var $username;
  6. var $password;
  7.  
  8. /* Database fields */
  9. var $db_name;
  10. var $db_connection;
  11. var $db;
  12. var $row;
  13.  
  14. /* Table user fields */
  15. var $nick;
  16. var $passwd;
  17.  
  18. // constructor
  19. function _construct()
  20. {
  21. $this->server="localhost";
  22. $this->username="root";
  23. $this->password="krasnal";
  24. $this->db_connection = mysql_connect($this->server,$this->username,$this->password) or die("Connection failed");
  25. $this->db = mysql_select_db("baza") or die("Database selection failed");
  26. }
  27. // properties SET / GET
  28. function Set_nick($nickname)
  29. {
  30. $this->nick = $nickname;
  31. }
  32. function Set_password($password)
  33. {
  34. $this->passwd = $password;
  35. }
  36. function Get_nick()
  37. {
  38. return $this->nick;
  39. }
  40. function Get_password()
  41. {
  42. return $this->passwd;
  43. }
  44.  
  45. // functions
  46. function Login()
  47. {
  48.  
  49.  
  50. $nick = $this->nick;
  51. $haslo = $this->passwd;
  52. $tmp1;
  53. $tmp2;
  54. $querry = "SELECT *FROM users WHERE nick='$nick' AND passwd='$haslo'";
  55. $equal = mysql_query($querry) or die("Error DB querry");
  56. while($this->row = mysql_fetch_array($equal))
  57. {
  58. $tmp1[] = $this->row['nick'];
  59. $tmp2[] = $this->row['passwd'];
  60. $licznik++;
  61. }
  62. if($nick && $haslo)
  63. {
  64. for($i=0;$i<$licznik;$i++)
  65. {
  66. echo '<br>'.$tmp1[$i].' '.$tmp2[$i];
  67. echo '<br> JESTES ZALOGOWANY';
  68. echo '<a href="table.html"> start </a>';
  69. }
  70. echo '<br><b>Wszystkie operacje identyfikacji zostały zakończone: </b>'.$licznik;
  71. }
  72. else
  73. {
  74. echo 'NIE MOZESZ SIE ZALOGOWAC';
  75. }
  76. }
  77. }


Funkcję Loguj() i jakieś watości, obiekt uruchamiam tak, w osobnym pliku "loguj.php":

  1. <?php
  2. require_once('sql_class.php');
  3. $object = new MySQL_class();
  4. $object->Set_nick("user");
  5. $object->Set_password('dddd');
  6. $object->Login();
  7. ?>


Zadada wydaje mi się jest ok, ale konstruktor nie inicjuje mi tych rzęczy które ma inicjować, przez to mam problem z pracą na bazie, wiadomo jak nie ma z nią połączenia to nic się nie zrobi. Jak zrobię kopiuj w klej zawartość konstruktora do funcji Loguj() to działa normalnie. Jak w PHP powinno w moim przypadku wyglądać ciało konstruktora?

dzięki z góry
mortus
Nie _construct, ale __construct (dwa znaki podkreślenia). Wydaje mi się, że do logowania powinna służyć jednak inna klasa, której możemy przekazać instancję obiektu obsługującego bazę danych.

Poza tym takie dane jak host, nazwa użytkownika, hasło i może jeszcze nazwę bazy danych powinniśmy raczej przekazać jako parametry w konstruktorze. Dlaczego? Ano dlatego, że każdy może mieć inny host, inną nazwę użytkownika i inne hasło, a dane może przechowywać w innej tabeli.
pjamorski
Też nie wykonuje swojej funkcji właściwie. W dalszym ciągu ten sam problem. Wywala mi komunikat
  1. $equal = mysql_query($querry) or die("Error DB querry");
. Jak zawartośc konstruktora jest w funkcji dziaął poprawnie.
mortus
To zastąp tę linię
  1. $equal = mysql_query($querry) or die("Error DB querry");
w funkcji Login() na:
  1. $equal = mysql_query($querry) or die(mysql_error());
bo wygląda na to, że zapytanie się nie wykonuje, a tak dowiemy się, jaka jest przyczyna.
pjamorski
Nie ma żadnego error'a. Właśnie nie wiem co jest grane.
luck
  1. SELECT * [brak spacji] FROM
pjamorski
Tutaj mam dobrze.

Konstruktor z parametrami też zrobiłem:
/
  1. / constructor
  2. function __construct($server, $username, $password)
  3. {
  4. $server="localhost";
  5. $username="root";
  6. $password="krasnal";
  7. $this->db_connection = mysql_connect($server,$username,$password) or die("Connection failed") or die(mysql_error());
  8. $this->db = mysql_select_db("baza") or die("Database selection failed") or die(mysql_error());
  9. }


Tak go uruchamiam i tą funkcję i w dalszym ciągu to samo:

  1. require_once('sql_class.php');
  2. $object = new MySQL_class("localhost","root","krasnal");
  3. $object->Login();


Jak zrobię tak to jest dobrze:

  1. function Login()
  2. {
  3. $server="localhost";
  4. $username="root";
  5. $password="krasnal";
  6. $this->db_connection = mysql_connect($server,$username,$password) or die("Connection failed") or die(mysql_error());
  7. $this->db = mysql_select_db("baza") or die("Database selection failed") or die(mysql_error());
  8. $nick = $this->nick;
  9. $haslo = $this->passwd;
  10. $tmp1;
  11. $tmp2;
  12. $querry = "SELECT * FROM users WHERE nick='$nick' AND passwd='$haslo'";
  13. $equal = mysql_query($querry) or die("Error DB querry") or die(mysql_error());
  14. while($this->row = mysql_fetch_array($equal))
  15. {
  16. $tmp1[] = $this->row['nick'];
  17. $tmp2[] = $this->row['passwd'];
  18. $licznik++;
  19. }
  20. if($nick && $haslo)
  21. {
  22. for($i=0;$i<$licznik;$i++)
  23. {
  24. echo '<br>'.$tmp1[$i].' '.$tmp2[$i];
  25. echo '<br> JESTES ZALOGOWANY';
  26. echo '<a href="table.html"> start </a>';
  27. }
  28. echo '<br><b>Wszystkie operacje identyfikacji zostały zakończone: </b>'.$licznik;
  29. }
  30. else
  31. {
  32. echo 'NIE MOZESZ SIE ZALOGOWAC';
  33. }
  34. }

Normalnie zgupłem sciana.gif
MateuszS
Ale zobacz, po co przekazujesz parametry konstruktorowi skoro potem w konstruktorze na nowo przypisujesz dane do bazy? Poza tym jeszcze

  1. $this->db = mysql_select_db("baza", $this->db_connection) or die("Database selection failed") or die(mysql_error());


może się przydać

No i przed wywołaniem metody logującej, ustaw parametry.
pjamorski
  1. // constructor
  2. function __construct($server, $username, $password)
  3. {
  4. $this->db_connection = mysql_connect($server,$username,$password) or die("Connection failed") or die(mysql_error());
  5. $this->db = mysql_select_db("itworld_cba_pl",$this->db_connection) or die("Database selection failed") or die(mysql_error());
  6. }
  7. //


Niestety dalej to samo, czyli nic.
Jak powinien wyglądać konstruktor inicjujący połączenie z baząquestionmark.gif?
luck
A tak:
  1. mysql_query($querry, $this->db_connection)
albo i
  1. mysql_query($querry, $this->db)

Choć to drugie to tak na słowo honoru - nie pamiętam czy działało
MateuszS
Najlepiej napisz do obsługi db osobną klasę lub skorzystaj z Mysqli (gotowa klasa). Ewentualnie, masz tu taki prosty przykład
  1. <?
  2.  
  3. class mysql
  4. {
  5. protected $dbHost;
  6. protected $dbUsername;
  7. protected $dbPassword;
  8. protected $dbBasename;
  9.  
  10. public function __construct($dbHost, $dbUsername, $dbPassword, $dbBasename)
  11. {
  12. $connect = mysql_connect($dbHost, $dbUsername, $dbPassword) or die(mysql_error());
  13. $db = mysql_select_db($dbBasename, $connect) or die(mysql_error());
  14. }
  15. }
  16.  
  17. $obMysql = new mysql("localhost", "root", "pass", "baza");
  18.  
  19. ?>
  20.  
  21.  


mortus
Spróbuj jeszcze tak:
  1. class MySQL_class {
  2. // fields
  3. var $server;
  4. var $username;
  5. var $password;
  6.  
  7. /* Database fields */
  8. var $db_name;
  9. var $db_connection;
  10. var $db;
  11. var $row;
  12.  
  13. /* Table user fields */
  14. var $nick;
  15. var $passwd;
  16.  
  17. // constructor
  18. function __construct($host, $username, $password) {
  19. $this->server = $host;
  20. $this->username = $username;
  21. $this->password = $password;
  22. $this->db_connection = mysql_connect($this->server, $this->username, $this->password) or die("Connection failed. Error: " . mysql_error());
  23. $this->db = mysql_select_db("baza") or die("Database selection failed. Error " . mysql_error());
  24. }
  25. // properties SET / GET
  26. function Set_nick($nickname) {
  27. $this->nick = $nickname;
  28. }
  29. function Set_password($password) {
  30. $this->passwd = $password;
  31. }
  32. function Get_nick() {
  33. return $this->nick;
  34. }
  35. function Get_password() {
  36. return $this->passwd;
  37. }
  38.  
  39. // functions
  40. function Login() {
  41.  
  42.  
  43. $nick = $this->nick;
  44. $haslo = $this->passwd;
  45. $tmp1;
  46. $tmp2;
  47. $querry = "SELECT * FROM users WHERE nick='$nick' AND passwd='$haslo'";
  48. $equal = mysql_query($querry) or die("Error DB querry. Error: " . mysql_error());
  49. while ($this->row = mysql_fetch_array($equal)) {
  50. $tmp1[] = $this->row['nick'];
  51. $tmp2[] = $this->row['passwd'];
  52. $licznik++;
  53. }
  54. if ($nick && $haslo) {
  55. for ($i = 0; $i < $licznik; $i++) {
  56. echo '<br>'.$tmp1[$i].' '.$tmp2[$i];
  57. echo '<br> JESTES ZALOGOWANY';
  58. echo '<a href="table.html"> start </a>';
  59. }
  60. echo '<br><b>Wszystkie operacje identyfikacji zosta�y zako�czone: </b>'.$licznik;
  61. } else {
  62. echo 'NIE MOZESZ SIE ZALOGOWAC';
  63. }
  64. }
  65. }
luck
Ja bym do klasy Mateusza dołożył jeszcze coś takiego i powinno zagadać:
  1. class Login {
  2. private $db;
  3.  
  4. public function __construct($objMysql) {
  5. $this->db = $objMysql;
  6. }
  7.  
  8. /* reszta metod logowania */
  9. }
pjamorski
Teraz wywala

  1. Error DB querry. Error: Nie wybrano żadnej bazy danych


Funcja . mysql_error()); przynajmniej zadziałała. Nazwa bazy jest poprawna. W dalszym ciągu nie działa.
luck
Wiesz, może wklej jak to teraz u Ciebie wygląda, bo się powoli pogubimy...
pjamorski
Klasa:

  1. <?php
  2. class MySQL_class {
  3.  
  4. // fields
  5. var $server;
  6. var $username;
  7. var $password;
  8.  
  9. /* Database fields */
  10. var $db_name;
  11. var $db_connection;
  12. var $db;
  13. var $row;
  14.  
  15. /* Table user fields */
  16. var $nick;
  17. var $passwd;
  18.  
  19. // constructor
  20. function __construct($host, $username, $password) {
  21. $this->server = $host;
  22. $this->username = $username;
  23. $this->password = $password;
  24. $this->db_connection = mysql_connect($this->server, $this->username, $this->password) or die("Connection failed. Error: " . mysql_error());
  25. $this->db = mysql_select_db("baza") or die("Database selection failed. Error " . mysql_error());
  26. }
  27. // properties SET / GET
  28. function Set_nick($nickname) {
  29. $this->nick = $nickname;
  30. }
  31. function Set_password($password) {
  32. $this->passwd = $password;
  33. }
  34. function Get_nick() {
  35. return $this->nick;
  36. }
  37. function Get_password() {
  38. return $this->passwd;
  39. }
  40.  
  41. // functions
  42. function Login() {
  43. $nick = $this->nick;
  44. $haslo = $this->passwd;
  45. $tmp1;
  46. $tmp2;
  47. $querry = "SELECT * FROM users WHERE nick='$nick' AND passwd='$haslo'";
  48. $equal = mysql_query($querry) or die("Error DB querry. Error: " . mysql_error());
  49. while ($this->row = mysql_fetch_array($equal)) {
  50. $tmp1[] = $this->row['nick'];
  51. $tmp2[] = $this->row['passwd'];
  52. $licznik++;
  53. }
  54. if ($nick && $haslo) {
  55. for ($i = 0; $i < $licznik; $i++) {
  56. echo '<br>'.$tmp1[$i].' '.$tmp2[$i];
  57. echo '<br> JESTES ZALOGOWANY';
  58. echo '<a href="table.html"> start </a>';
  59. }
  60. echo '<br><b>Wszystkie operacje identyfikacji zosta?y zako?czone: </b>'.$licznik;
  61. } else {
  62. echo 'NIE MOZESZ SIE ZALOGOWAC';
  63. }
  64. }
  65. }
  66. ?>



plik loguj.php

  1. <?php
  2. require_once('sql_class.php');
  3. $object = new MySQL_class("localhost","root","krasnal");
  4. $object->Login();
  5. ?>
mortus
Proponuje w funkcji login na samym początku dopisać:
  1. echo '<pre>'; print_r($this); echo '</pre>';
pjamorski
To dostalem w odpowiedzi:
  1. mysql_class Object
  2. (
  3. [server] =>
  4. [username] =>
  5. [password] =>
  6. [db_name] =>
  7. [db_connection] =>
  8. [db] =>
  9. [row] =>
  10. [nick] =>
  11. [passwd] =>
  12. )
  13. Error DB querry. Error: Nie wybrano żadnej bazy danych
mortus
A testujesz to na hostingu, czy na localhoscie? Jeśli na localhoście, to czy na pewno na PHP 5, bo Krasnal Serv może się przełączać pomiędzy PHP4... i PHP5.0.2.

Z wydruku z powyższego postu wnioskuję, że obiekt nie jest w ogóle tworzony, po prostu go nie ma. Dlatego stawiam na to, że masz włączone PHP4.3.9.
pjamorski
Na localhost, PHP 5 mam
luck
Musi być coś z configiem, bo u mnie ta klasa śmiga wzorowo. Proste kopiuj - wklej i zadziałało.
pjamorski
Jak przełączyć wersje PHP?questionmark.gif
mortus
Na pulpicie powinieneś mieć Krasnala, uruchamiasz program i w prawym dolnym rogu ekranu pojawia się narzędzie obsługi Krasnal Serv. Tam szukaj.

Znalazłeś? Pobierz sobie ten plik, wrzuć lokalnie na serwer i zobacz, co wypluwa
[PHP] plik.php - pobierz, plaintext
  1. <?php phpinfo(); ?>
[PHP] plik.php - pobierz, plaintext

PS: Na hostingu Twoja nazwa użytkownika, to nie root.
pjamorski
Kurde narobiłem tyle zamieszania. Chodziło o wersję, miałem PHP 4, wrzuciłem PHP 5 wszystko działa poprawnie.
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.