Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: __construct i blad brakujacego argumentu
Forum PHP.pl > Forum > PHP > Object-oriented programming
spandor
witam,

mam taki konstruktor jak ponizej, dlaczego wyzuca mi blad:
Missing argument 1 for authentication::__construct(),
Missing argument 2 for authentication::__construct(),

  1. <?php
  2. class authentication {
  3.    var $mysql = 'dsadsad';
  4.    var $session;
  5.  
  6.    function __construct($mysql, $session) {
  7.       $this->mysql     = $mysql;
  8.       $this->session   = $session;
  9.    }
  10.  
  11.    function authentication() {
  12.    global $smarty, $l;
  13.        $session_var['authentication']  = $this->session->_read('authentication');
  14.        if (empty($session_var)) {
  15.            $smarty->display('inc_login.tpl');
  16.          
  17.            if (!empty($_POST) and empty($_POST['user_username'])) {
  18.                $smarty->assign('error', $l['username_field_left_empty']);
  19.            } else if (!empty($_POST) and empty($_POST['user_password'])) {
  20.                $smarty->assign('error', $l['password_field_left_empty']);
  21.            } else if (!empty($_POST)) {
  22.                $result = $this->mysql->query_one_result("SELECT COUNT(*) FROM `user`
  23.                                                          WHERE `login`='".$this->mysql->escape($_POST['AuthenticationLogin'])."'
  24.                                                          AND `password`='".$this->mysql->escape($this->secure($_POST['AuthenticationPassword']))."';");
  25.                if (empty($result)) {
  26.                    $smarty->assign('error', $l['username_or_password_is_incorrect']);
  27.                } else {
  28.                    $result = $this->mysql->query_one_result("SELECT `user_id` FROM `user`
  29.                                                              WHERE `login`='".$this->mysql->escape($_POST['AuthenticationLogin'])."'
  30.                                                              AND `password`='".$this->mysql->escape($this->secure($_POST['AuthenticationPassword']))."';");
  31.                  
  32.                    $this->session->_write('authentication', $result);
  33.                  
  34.                    header('Location: index.php');
  35.                }
  36.            }
  37.            exit;
  38.        } else if (!empty($session_var['authentication']) and isset($_GET['logout'])) {
  39.            $this->logout();          
  40.        }
  41.    }
  42.  
  43.    function check_authentication() {
  44.        $session_var['authentication']  = $this->session->_read('authentication');
  45.        return (!empty($session_var['authentication'])) ? $session_var['authentication'] : FALSE;
  46.    }
  47.  
  48.    function logout() {
  49.        $this->session->_destroy('authentication');
  50.        header('Location: '.BASE_URL);
  51.    }
  52.  
  53.    // Used so that it would be easier later to change encode method.
  54.    function secure($data) {
  55.        return md5($data);
  56.    }
  57. }
  58. ?>
Foxx
1. Nie wkleiłeś całego kodu.
2. Nie podałeś argumentów konstruktorowi, co jest niejasne?
spandor
Juz wrzucilem caly.
No wlasnie nie wiem o co chodzi, co kolwiek nie podal to ciagle missing.
likemandrake
Cytat(Foxx @ 16.02.2009, 00:51:47 ) *
2. Nie podałeś argumentów konstruktorowi, co jest niejasne?


A konkretnie podczas tworzenia obiektu napisałeś 'new Klasa();', a nie 'new Klasa(arg1, arg2);'.

Pozdro
Foxx
Pokaż jak tworzysz obiekt.
spandor
  1. <?php
  2. $session = session_start();
  3. $mysql = db_connect();
  4. $objekt = new authentication($mysql,$session);
  5. ?>


juz jest OK, nie wyrzuca bledu. (db_connect laczy z baza)
Ale mam prosbe, czy ktos moglby mi wytlumaczyc, jako ze to sa moje poczatki zabawy z OOP i ten skrypt znalazlem na necie.
Czy _read zostal tu dobrze uzyte bo mi wyrzuca blad
  1. <?php
  2. $objekt -> check_authentication();
  3. ?>

Fatal error: Call to a member function _read() on a non-object in /tabaknatie/inc_funkcje.php on line 61
likemandrake
Ten błąd oznacza, że próbujesz wykonać metodę na zmiennej, która nie jest obiektem. Innymi słowy, zmienna $objekt nie jest obiektem (może php obraził się za błędną pisownię tongue.gif )

Nie wiem, jak względem pierwszego kawałka kodu, ma się drugi, ale jeśli napiszesz tak:

  1. <?php
  2. $session = session_start();
  3. $mysql = db_connect();
  4. $objekt = new authentication($mysql,$session);
  5. $objekt -> check_authentication();
  6. ?>


powinno śmignąć smile.gif
spandor
No właśnie przed chwilą miałem identycznie i ciągle wyrzuca ten błąd.
likemandrake
W takim razie na samym początku skryptu trzaśnij taką linijkę:

  1. <?php
  2. error_reporting(E_ALL | E_STRICT);
  3. ?>


Może wywali Ci jakieś dodatkowe komunikaty błędów
spandor
Redefining already defined constructor for class authentication in /tabaknatie/inc_funkcje.php on line 28

taki dodatkowy blad dostalem.
likemandrake
Dobra już wiem

Widzę, że w Twojej klasie mieszasz dwa style - tego z PHP 4 i PHP 5

W PHP 4 konstruktor klasy nazywa się tak samo jak klasa, a widzę, że masz tam metodę o takiej samej nazwie jak Twoja klasa. Dodatkowo definiujesz konstruktor zgodny z PHP 5, czyli __construct(). Stąd Twoje problemy smile.gif

Zdecyduj się na składnię PHP 5, ale tak czy inaczej musisz zmienić nazwę metody o której pisałem smile.gif
spandor
Zmienile nazwe metody. I jest OK.
Jak dodaje teraz
  1. <?php
  2. $objekt -> check_authentication();
  3. ?>

to znow mam ten blad.
Fatal error: Call to a member function _read() on a non-object in /tabaknatie/inc_funkcje.php on line 61
likemandrake
No tak, ponieważ właściwość $session w Twojej klasie nie jest obiektem tylko wartością logiczną smile.gif bo taką wartość zwraca właśnie funkcja session_start();

Przyznam się, że nie analizowałem Twojego kodu smile.gif
spandor
To jak ten problem rozwiazac?
likemandrake
Słyszałeś o tablicy $_SESSION? Chyba nie, no więc poczytaj sobie. I te Twoje "pseudo" funkcje(?), obiekty(?) typu $session->_read(), $session->_write(), no nie wiem z którego kosmosu to masz... Funkcja to funkcja, czyli session_read(), session_write(), po za tym nie używaj ich, bo całym rozwiązaniem jest tu stosowanie właśnie tablicy $_SESSION... W klasie musisz mieć tylko pewność, że sesja została wystartowana, a więc sprawdzasz to powiedzmy w konstruktorze, jak wiesz, że sesja nie została uruchomiona, wywalasz wyjątek. Do konstruktora przekazujesz tylko połączenie z bazą, po za tym wywal te Twoje var $session i pochodne.

php.net chyba Twoim wrogiem jest, wystarczy że poszukasz coś o session_start() i już masz z lewej liste wszystkich funkcji do obsługi sesji, po za tym jak zjedziesz troszkę na dół strony, masz też odwołania i m.in. na liście odwołań pojawiło się magiczne słowo $_SESSION.

Jeżeli jest tak jak piszesz, że skrypt masz z netu, to ja naprawdę nie wiem gdzie ja żyję biggrin.gif
kbsucha
Jak już masz skrypt z internetu, to powinni do niego dolozyc wlasna klase sesji, ktora prawdopodobnie na wlasne potrzeby sobie napisali (np aby przechowywac dane w bazie). Pozostaje ci albo zmodyfikowanie klase authentication tak aby obslugiwala natywne sesje PHP, albo znalesc skrypt autora.

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