Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php] 2 klasy, błąd przy obiekcie
Lejto
post
Post #1





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 48
Dołączył: 23.05.2007

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


index.php
  1. <?php
  2. include_once("db.class.php");
  3. $db = new mysql();
  4. global $db;
  5.  
  6. include("login.class.php");
  7. $log = new Auth();
  8.  
  9. include("upload.class.php");
  10. $up = new upload();
  11. global $up;
  12. ?>

db.class.php
  1. <?php
  2. class mysql
  3. {
  4.   public $_lacz;
  5.  
  6.   public function __construct()
  7.   {
  8.       $this->_lacz = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
  9.   }
  10.  
  11. }
  12. ?>

wywołuje funkcje dodaj z klasy upload
klasa
  1. <?php
  2. class upload extends mysql {
  3. ..[...]
  4.    public function dodaj($n)
  5.    {
  6.        
  7.        
  8.        $result = $this->_lacz->query('zapytanie');    
  9.      
  10.        
  11.        }
  12.        fclose($uchwyt);
  13.    }
  14. }
  15. ?>

i otrzymuje że funkcja query nie ma obiektu ;/ co nie tak?

Pozdrawiam
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
WebCM
post
Post #2





Grupa: Zarejestrowani
Postów: 375
Pomógł: 20
Dołączył: 28.07.2006

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


Pokaż wszystkie linijki kodu. Źle to robisz. Jeżeli klasa mysql jest nadrzędna dla upload:
  1. <?php
  2. $result = parent :: $_lacz -> query('zapytanie')
  3. ?>
Nie widzę potrzeby istnienia klasy mysql, jeżeli ma oferować te same funkcje, co MySQLi. Jeśli już chcesz ja deklarować, niech będzie podrzędną dla MySQLi. Wtedy w konstruktorze tej klasy napisz:
  1. <?php
  2. parent :: __construct(parametry)
  3. ?>
Go to the top of the page
+Quote Post
Lejto
post
Post #3





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 48
Dołączył: 23.05.2007

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


nic nie dało ;/
klasa upload
  1. <?
  2. class upload extends mysql {
  3.    
  4.    public function upload()
  5.    {
  6.        if($_SESSION['login'])
  7.        {
  8.        $nazwa = $_FILES['plik']['name'];
  9.  
  10.        if(move_uploaded_file($_FILES['plik']['tmp_name'],"./csv/".$nazwa))
  11.            {
  12.                ?>
  13.                <div id=good>
  14.                        <p>Plik wysłany pomyślnie</p>
  15.                        <a href=java script:history.back(-1);>Wstecz</a>
  16.                </div>
  17.                
  18.                
  19.                <?
  20.                $this->dodaj($nazwa);
  21.            }
  22.            else
  23.                {
  24.                    switch($_FILES['plik']['error'])
  25.                    {
  26.                        case 1: echo ('<span id=bad>Przesłany plik jest większy niż zezwala konfiguracja serwera.</span>');
  27.                            break;
  28.                        case 2: echo ('<span id=bad>Przesłany plik jest wiekszy niż zezwala formularz.</span>');
  29.                            break;
  30.                        case 3: echo ('<span id=bad>Przesłano tylko część pliku.</span>');
  31.                            break;
  32.                        case 4: echo ('<span id=bad>Plik nie został przesłany.</span>');
  33.                            break;
  34.                    }
  35.                }
  36.        }
  37.    }
  38.    public function formularz()
  39.    {
  40.        ?>
  41.        <div id=good>Wyślij plik</div>
  42.            <form action=?akcja=upload enctype=multipart/form-data method=post>
  43.            <table>
  44.            <tr><td>Ścieżka pliku: </td><td>
  45.            <input type=file name=plik />
  46.            </td></tr>
  47.            <input type=submit value=Wyślij zdjęcie/>
  48.            </td></tr></table>
  49.            </div>
  50.            <?
  51.    }
  52.    public function dodaj($n)
  53.    {
  54.        
  55.        $row = 1;
  56.        $uchwyt = fopen("csv/".$n,r);
  57.  
  58.  
  59.        while (($data = fgetcsv($uchwyt, 1000, ";")) !== FALSE)
  60.        {
  61.        $num = count($data);
  62.         $row;
  63.        
  64.        $result = $this->_lacz->query('INSERT INTO `probid_auctions` (
  65.  
  66.        `name`, `description`, `quantity`, `auction_type`, `start_price`,
  67.        `buyout_price`,`duration`, `shipping_method`, `shipping_int`,
  68.        `payment_methods`, `category_id`,  `hpfeat`, `catfeat`, `bold`,
  69.        `hl`, `postage_amount`, `insurance_amount`, `type_service`,
  70.        `list_in`, `approved`,
  71.        `auto_relist_nb`,`is_relisted_item`,`start_time`,`start_time_type`,
  72.        `is_draft`,`start_on_bid`,`additional_rows_titles`,`additional_rows_values`
  73.    
  74.        )
  75.        VALUES (
  76.        '.$data[3].', '.$data[12].','.$data[13].','.$data[2].','.$data[14].',                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 '.$data[17].','.$data[23].','.$data[30].','.$data[31].','.$data[37].',
  77.        '.$data[1].','.$data[19].','.$data[20].','.$data[17].','.$data[18].',
  78.        '.$data[32].','.$data[33].','.$data[35].', '.$data[0].','.$data[38].',
  79.        '.$data[29].','.$data[28].','.$data[21].','.$data[21].','.$data[40].',
  80.        '.$data[22].','.$data[4].','.$data[5].')');    
  81.      
  82.        
  83.        }
  84.        fclose($uchwyt);
  85.    }
  86. }
Go to the top of the page
+Quote Post
Crozin
post
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Przepraszam za mały offtop: "class upload extends mysql" co ma piernik do wiatraka? W jaki sposób klasa upload rozszerza klasę mysql?
Go to the top of the page
+Quote Post
Lejto
post
Post #5





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 48
Dołączył: 23.05.2007

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


ok troche zamotanie, a jak to poprawić?

Ten post edytował Lejto 30.04.2009, 19:56:08
Go to the top of the page
+Quote Post
-=Peter=-
post
Post #6





Grupa: Zarejestrowani
Postów: 304
Pomógł: 51
Dołączył: 4.02.2005
Skąd: Kraków

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


Przekazując obiekt klasy mysql do obiektu klasy upload...

przykładowo:

  1. <?php
  2. class mysql implements Database{}
  3.  
  4.  
  5. class upload{
  6.  private $db;
  7.  
  8.  //ciach  
  9.  
  10.  public function setDb(Database $mysql){
  11.    $this->db = $mysql;
  12.  }
  13.  
  14.  public function getDb(){
  15.    return $this->db;
  16.  }
  17.  
  18.  public function add($v){
  19.    $result = $this->getDb()->query('...');
  20.    //ciach
  21.  }
  22.  
  23. }
  24.  
  25. $upload->setDb($mysql);
  26. $upload->add('blebleble');
  27. ?>


A jeśli chodzi o Twoje konkretne pytanie, to w jakiś cudowny sposób metoda upload (nazwa taka sama jak klasa, a w php4 tak się zwie konstruktor) przysłania konstruktor nadklasy mysql. Zmień nazwę tej metody. Sprawdzałem to teraz i to chyba jest bug, że najpierw jest sprawdzane czy w klasie jest konstruktor o nazwie __construct, jak nie ma to o takiej samej nazwie co klasa, a jak wtedy dopiero nie ma to czy w klasie nadrzędnej jest konstruktor __construct... Wg mnie nieporządane i dziwne działanie, więc kwalifikuję to jako bug (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)

Ten post edytował -=Peter=- 30.04.2009, 22:01:28
Go to the top of the page
+Quote Post
okitoki
post
Post #7





Grupa: Zarejestrowani
Postów: 214
Pomógł: 18
Dołączył: 25.04.2009

Ostrzeżenie: (20%)
X----


poco dziedziczysz po klasie mysql, nie łatwiej stworzyć obiekt mysql i w konstruktorze go przesłać?, w twoim sposobie będziesz generował zbędne połączenia z bazą danych, bo każdy obiekt będzie miał swoje.


nie działa ci to bo zasłoniłeś konstruktora klasy mysql, wszędzie gdzie dziedziczysz po tej klasie w konstruktorze dodaj wpis parent :: __construct()
Go to the top of the page
+Quote Post
Lejto
post
Post #8





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 48
Dołączył: 23.05.2007

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


to jak mam sobie klase która ma za zadanie łączenia się z bazą dodaje ją w pliku index.php potem mam 2 klasę która dodaje coś do bazy to żeby nie robić
extends mysql { -,-
to muszę za każdym razem implements Database{}? nie da się inaczej?
@okitoki nie za bardzo cię rozumiem ;/
Go to the top of the page
+Quote Post
marcio
post
Post #9





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Da sie inaczej po co tu w ogole sa potrzebne interfejsy tu masz przyklad jak takie cos zrobic: Temat: user_class__dziedziczenie ostatni post.

A jak nie robisz klase i metody statyczne wtedy nie musisz robic instancji danej klasy jednak jest to zbedne przy klasie dla Mysql bo za kazdym razem bedzie musial tworzyc i zamykac polaczenie.

A jak juz tak bardzo chcesz dziedziczyc to tak jak ci WebCm napisal uzywaj metod z klasy bazowej za pomoca parent::
Go to the top of the page
+Quote Post
Lejto
post
Post #10





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 48
Dołączył: 23.05.2007

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


ok dzięki, jakoś sobie poradzę
Go to the top of the page
+Quote Post
okitoki
post
Post #11





Grupa: Zarejestrowani
Postów: 214
Pomógł: 18
Dołączył: 25.04.2009

Ostrzeżenie: (20%)
X----


Cytat(Lejto @ 6.05.2009, 12:54:44 ) *
to jak mam sobie klase która ma za zadanie łączenia się z bazą dodaje ją w pliku index.php potem mam 2 klasę która dodaje coś do bazy to żeby nie robić
extends mysql { -,-
to muszę za każdym razem implements Database{}? nie da się inaczej?
@okitoki nie za bardzo cię rozumiem ;/


nie musisz za każdym razem implementować database
tworzysz obiekt

$sql = new mysql(); // on już się łączy z bazą ma tam jakąś metode query

jak chcesz to przekazać do innego obiektu to robisz

$inny_obiekt = new inna_klasa($sql)

a klasa wygląda następująco

Kod
class inna_klasa
{
private $sql;
public function __construct($sql)
  {
    $this->sql = $sql;
  }
}


i w ten oto sposób w 2giej klasie masz zaimplementowanego sql-a.
jak zrobisz poprzez dziedziczenie tak jak na twoim przykładzie to klasa gdzie dziedziczysz musi wyglądać następująco


Kod
class upload extends mysql {
   public function __construct()
   {
     parent::__construct()
   }

    public function dodaj($n)
    {
        
        
        $result = $this->_lacz->query('zapytanie');    
      
        
        }
        fclose($uchwyt);
    }
}
Go to the top of the page
+Quote Post
marcio
post
Post #12





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Kod
public function __construct($sql)
  {
    $this->sql = $sql;
  }

Chyba jednak nie tak jak cos to:
Kod
public function __construct(KlasaSql $sql)
  {
    $this -> sql = $sql;
  }
Go to the top of the page
+Quote Post
osl
post
Post #13





Grupa: Zarejestrowani
Postów: 260
Pomógł: 41
Dołączył: 6.04.2009
Skąd: Gdańsk/okolice

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


marcio, a czym różnią się te dwa konstruktory, poza tym że jeden jest bardziej 'strict'?
Działają identycznie przecież...
Go to the top of the page
+Quote Post
marcio
post
Post #14





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Jak moze dzialac skoro nie podajemy klasy z ktorej ma zostac przekazany obiekt?

Jesli dziala to good nie wiedzialem o tym (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) i zwracam honor lecz dziwnie mi to wygladalo.
Go to the top of the page
+Quote Post
okitoki
post
Post #15





Grupa: Zarejestrowani
Postów: 214
Pomógł: 18
Dołączył: 25.04.2009

Ostrzeżenie: (20%)
X----


działają good (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) , jak określisz klase, to tylko obiekt tej klasy będziesz mógł tam przesłać, jeżeli nie określisz klasy, to tworzysz klasy baza_danych1, baza_danych2, ważne by miały metody i pola te same, w ten sposób możesz działać na różnych silnikach bazodanowych i nie tylko
Go to the top of the page
+Quote Post
Lejto
post
Post #16





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 48
Dołączył: 23.05.2007

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


ok dzięki trochę mi się rozjaśniło (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
ndx
post
Post #17





Grupa: Zarejestrowani
Postów: 17
Pomógł: 6
Dołączył: 11.11.2005

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


Cytat(osl @ 6.05.2009, 14:05:28 ) *
marcio, a czym różnią się te dwa konstruktory, poza tym że jeden jest bardziej 'strict'?
Działają identycznie przecież...

Zobacz co sie stanie jak $sql nie bedzie instancja KlasaSql tylko np. stringiem
Go to the top of the page
+Quote Post
osl
post
Post #18





Grupa: Zarejestrowani
Postów: 260
Pomógł: 41
Dołączył: 6.04.2009
Skąd: Gdańsk/okolice

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


@ndx - zgoda, ale to nie jest aż taki znowu błąd - generalnie w przypadku implementacji takiej klasy wszystko zależy od programisty, więc jeśli tam się pojawi cokolwiek innego niż instancja klasy to znaczy tyle, że gdzieś wcześniej jest błąd.

W żadnym przypadku nie twierdze kod KlasaSql $sql jest błędne, ale po prostu w tym przypadku wszystko powinno być na tyle hermetyczne żeby nic innego się nie pojawiło poza instancją odpowiedniej klasy.
Go to the top of the page
+Quote Post
okitoki
post
Post #19





Grupa: Zarejestrowani
Postów: 214
Pomógł: 18
Dołączył: 25.04.2009

Ostrzeżenie: (20%)
X----


Cytat(ndx @ 7.05.2009, 11:19:30 ) *
Zobacz co sie stanie jak $sql nie bedzie instancja KlasaSql tylko np. stringiem


bez znaczenia, czy będzie stricte czy nie będzie błąd jak podepniesz stringa, tyle że na innych liniach i inny błąd (IMG:http://forum.php.pl/style_emoticons/default/exclamation.gif)
Go to the top of the page
+Quote Post
marcio
post
Post #20





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Ale wtedy wiadomo ze trzeba podac instancje klasy i nie trzeba analizowac kodu ani rozmyslac.
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 22.08.2025 - 22:28