Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP OOP]Wywoływanie bezpośrednie
Forum PHP.pl > Forum > PHP
Levabul
Tak wiec mam problem. Mam dwie klasy : klasę mysql i klasę session nie są one w żaden sposób dziedziczne ani podpięte do innych klas. kod wygląda mniej więcej tak:

  1. <?php
  2.  
  3. class mysql {
  4. #...
  5. function query ($sql) {
  6.  $this -> sql_query = mysql_query ($sql, $this -> handle);
  7. }
  8. #...
  9.  
  10. class session {
  11. #...
  12. function auth_user () {
  13.  if (!empty($_POST['login']) && !empty($_POST['password'])) {
  14.  $username = $_POST['login'];
  15. $password = md5($_POST['password']);
  16.  mysql::query (&#092;"SELECT user_id FROM lms_users WHERE username = '$username' AND password = '$password'\");;
  17. if (mysql::num_rows() == 1) {
  18.  $row = mysql::fetch_array ();
  19.  $this -> user_id = $row['id'];  
  20.  return true;
  21. }
  22. else 
  23.  return false;
  24.  }
  25.  else
  26. return false;
  27. }
  28. #...
  29. }
  30.  
  31. ?>


Dlaczego gdy wywołuje mysql::query wyskakuje mi błąd:
Kod
Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in c:\usr\krasnal\www\php-lms\databases\mysql.php on line 14


Gdy pomienię mysql::query na mysql_query wszystko działa!

Z góry thx za pomoc.
Nievinny
Bo $this->handle nie jest obiektem połączenia MySQL, naucz się czytać komunikaty.
Levabul
Sry za moją głupotę ale jestem świeżo po nauce OOP (wcześniej pracowałem w strukturalnym. Co na to poradzić (na ten błąd oczywiście)questionmark.gif?
dasko
Eh, ten komunikat jest w tym wypadku nieco mylący. A błąd jest wywalany dlatego, że wywołując metodę poprzez czterokropek(::, T_PAAMAYIM_NEKUDOTAYIM, T_DOUBLE_COLON, czy jak mu tam biggrin.gif), nie można użyć w jej wnętrzu $this - to tak jakby metoda klasy, a nie metoda obiektu. Napisz po prostu tak:
  1. <?php
  2.  
  3. $db = new mysql;
  4. // ...
  5. // i tutaj wykonujesz zapytanie
  6. $db->query(&#092;"SELECT user_id FROM lms_users WHERE username = '$username' AND password = '$password'\");
  7. // ...
  8.  
  9. ?>

Powinno działać smile.gif
Levabul
niestety na powyższe rozwiązanie nie moge sobie pozwolić :/

a jeżeli mysql::query przerobiłbym na :
  1. <?php
  2.  
  3. function query ($sql, $handle = $this -> handle) {
  4.  $this -> sql_query = mysql_query ($sql, $handle);
  5. }
  6. #i dodal dodatkowa funkcje
  7. function get_handle () {
  8.  return $this -> handle;
  9. }
  10.  
  11. #a zapytanie napisal tak
  12.  mysql::query (&#092;"SELECT user_id FROM lms_users WHERE username = '$username' AND password = '$password'\", mysql::get_handle());
  13.  
  14.  
  15. ?>


To zadziała questionmark.gif?
Ozzy
W gre wchodzi tylko self::$handle lub mysql::$handle, o ile pole jest statyczne
Levabul
ale jeżeli zamiast mysql::get_handle () wpisze mysql::$handle wyświtla mi brak '('
Kod
Parse error: parse error, expecting `'('' in c:\usr\krasnal\www\php-lms\common\session.php on line 22
dasko
Przeciez napisalem ze jak wywolujesz przez :: to nie możesz użyć $this. Nie rozumiem dlaczego nie możesz sobie pozwolić na ten sposób - jedynym problemem moze byc tworzenie dodatkowych obiektów, które łatwo można rozwiązać singletonem.

Odsyłam do manuala -> http://www.php.net/manual/en/language.oop.php - bo z tego co widze, korzystasz z php4.
Levabul
tak niestety korzystam z php 4 :/

a co do twojego sposobu - ja chcę urzywać mysql wewnątrz innych klas a przy takim rozwiązaniu wyskakuje mi błąd o używaniu non-objekt czy coś takiego ...
dasko
Pokaż kod - i dokładnie pokaż błąd.
Levabul
Oto kod:
session.php
  1. <?php
  2. define ('SESSION_TIME', 24*3600);
  3. class session{
  4.  
  5. function session () {
  6.  ob_start();
  7. }
  8. function is_session () {
  9.  if(strlen($_COOKIE['session_id']) == 32) {
  10. $this -> session_id = $_COOKIE['session_id'];
  11.  setcookie ('session_id', $this ->session_id, time()+ SESSION_TIME);
  12.  $this -> sql_session_id = mysql::real_escape_string ($this -> session_id);
  13.  return true;
  14. }
  15. else
  16.  return false;
  17. }
  18. function auth_user () {
  19.  if (!empty($_POST['login']) && !empty($_POST['password'])) {
  20.  $username = $_POST['login'];
  21. $password = md5($_POST['password']);
  22.  mysql::query (&#092;"SELECT user_id FROM lms_users WHERE username = '$username' AND password = '$password'\");
  23. if (mysql::num_rows() == 1) {
  24.  $row = mysql::fetch_array ();
  25.  $this -> user_id = $row['id'];  
  26.  return true;
  27. }
  28. else 
  29.  return false;
  30.  }
  31.  else
  32. return false;
  33. }
  34. function new_session () {
  35.  if(getenv('HTTP_X_FORWARDED_FOR') != '')
  36.  $this -> ip = (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : (!empty($_ENV['HTTP_X_FORWARDED_FOR'])) ? $_ENV['HTTP_X_FORWARDED_FOR'] : $HTTP_X_FORWARDED_FOR;
  37.  else
  38. $this -> ip = (!empty($_SERVER['REMOTE_ADDR'])) ? $_SERVER['REMOTE_ADDR'] : (!empty($_ENV['REMOTE_ADDR'])) ? $_ENV['REMOTE_ADDR'] : $REMOTE_ADDR; 
  39.  $this -> session_id = md5 (uniqid(str_replace (&#092;".\", \"\", $this -> ip).time ()));
  40. if ($this -> auth_user ()) {
  41.  $this -> type = &#092;"human\";
  42. setcookie (&#092;"session_id\", $this -> session_id, time () + SESSION_TIME);
  43. mysql::query (&#092;"INSERT INTO \".$db_prefix.\"sessions (session_id, session_user, session_ip) VALUES ('$this -> session_id', '$this -> user_id', 'this ->ip')\");
  44. }
  45.  else {
  46. $this -> browser = (!empty($_SERVER['HTTP_USER_AGENT'])) ? $_SERVER['HTTP_USER_AGENT'] : $_ENV['HTTP_USER_AGENT'];
  47.  if(preg_match('/(lycos|googlebot|slurp@inktomi|ask jeeves|whatuseek|ia_archiver)/i', $this -> browser))
  48.  $this -> type = &#092;"bot\";
  49. else {
  50. $this -> type = &#092;"guest\";
  51. setcookie (&#092;"session_id\", $this -> session_id, time () + SESSION_TIME);
  52. mysql::query (&#092;"INSERT INTO \".$db_prefix.\"sessions (session_id, session_user, session_ip) VALUES ('$this -> session_id', '0', 'this ->ip')\");
  53. }
  54.  }
  55. }
  56. function load_session () {
  57.  if ($this -> type == &#092;"human\") {
  58.  mysql::query(&#092;"SELECT * FROM \".$db_prefix.\"sessions WHERE session_id = '$_COOKIE[session_id]'\");
  59. $sessiondata = mysql::fetch_array();
  60. $this -> session_id = $sessiondata['session_id'];
  61. $this -> session_user = $sessiondata['session_user'];
  62. $this -> session_ip = $sessiondata['session_ip'];
  63. if ($this -> session_ip !== $this -> ip)
  64.  $this -> type = &#092;"guest\";
  65. else
  66.  $this -> type = &#092;"human\";
  67.  }
  68. }
  69.  
  70. }
  71. ?>


mysql.php
  1. <?php
  2. class mysql {
  3. var $handle;
  4. var $sql_query;
  5. function mysql ($host, $login, $password) {
  6.  $this -> handle = mysql_connect ($host, $login, $password);
  7. }
  8. function select_db ($name) {
  9.  mysql_select_db ($name, $this -> handle);
  10. }
  11. function query ($sql, $handle = $this -> handle) {
  12.  $this -> sql_query = mysql_query ($sql, $handle);
  13. }
  14. function num_rows () {
  15.  return mysql_num_rows ($this -> sql_query, $this -> handle);
  16. }
  17. function real_escape_string ($str) {
  18. }
  19. function fetch_array () {
  20.  return mysql_fetch_array ($this -> sql_query, $this -> handle);
  21. }
  22. function free_result () {
  23.  mysql_free_result ($this -> sql_query, $this -> handle);
  24. }
  25. function close () {
  26.  mysql_close ($this -> handle);
  27. }
  28. }
  29. ?>


przyklad.php
  1. <?php
  2. include ('./config.cfg');
  3. include ('./databases/mysql.php');
  4. include ('./common/session.php');
  5. $db = new mysql (&#092;"localhost\", \"root\", \"krasnal\");
  6. $db -> select_db (&#092;"lms\");
  7. $session = new Session;
  8. if (!empty($_GET['login']) && !empty($_GET['password']))
  9.  $session -> new_session ();
  10. else {
  11. echo 'brak danych';
  12. if ($session -> is_session())
  13.  $session -> load_session();
  14. else
  15. $session -> new_session ();  
  16. }
  17. ?>


Oto i cały kod. A poniżej błędy.

Błędy
Kod
Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in c:\usr\krasnal\www\php-lms\databases\mysql.php on line 14

Warning: Wrong parameter count for mysql_num_rows() in c:\usr\krasnal\www\php-lms\databases\mysql.php on line 17

Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in c:\usr\krasnal\www\php-lms\databases\mysql.php on line 14
Ociu
Singleton ?
Poza tym coś mi się wydaje, że masz błąd w zapytaniu.
Nievinny
  1. <?php
  2.  
  3. //zamiast
  4. mysql::query
  5. //używaj 
  6. $this->link = new mysql(); 
  7. $this->link->query( '...' );
  8.  
  9. ?>
dasko
@Nievinny: patrz kilka postów wyżej - to samo pisałem.

@Levabul: no i co z tego, że w przykładzie zmieniłeś tak jak mówiłem, skoro w klasie session dalej z premedytacją używasz mysql::query, zamiast kulturalnie najpierw stworzyć instancje(tudzież zainicjować połączenie z bazą), a potem wywoływac zapytania. Po drugie mysql_num_rows" title="Zobacz w manualu PHP" target="_manual, przyjmuje jeden argument, a ty na siłe wciskasz mu dwa. Czytaj manuala.

W ogóle sterownik do bazy źle zaprojektowany - cały czas musisz tworzyć nowy obiekt. Przypominam, że w PHP4 też da się zaimplementowac singletony.

Myślę, że najpierw warto troche lepiej poznać podstawy, nauczyć się czytac komunikaty o błędach(podstawowy angielski), a potem zabierać się za CMSa.
Levabul
Spokojnie ten sterownik do bazy jest TYMCZASOWY. We właściwym będzie jeszcze cashowanie, obsługa innych baz itd. Ten został stworzony na szybkiego abym mógł stworzyć inne części jądra (od tak mi się zachciało tongue.gif)

Dzięki za dokładną odpowiedź, poprostu wcześniej nie zrozumiałem twoich rad Dasko smile.gif.

A i tak wszystko rozwiązałem singletonem tongue.gif (thx Ociu)
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.