odwolanie sie do obiektu,ktory nie jest obiektem

0

Witam

<?php
class Pozdrowienia     
{
      

      public $db ; // uchwyt do bazy danych
      

      public function dodaj($imie,$tresc)
      {
        $sql = "insert into pozdro values ('','".$imie."','".$tresc."')";
        $wynik = $db->query($sql);
        echo "pozdrowienie dodane";


      }
      
      
      public function usun($id)
      {                      echo"usuwam..." ;

      }
      public function wyswietl()
      {
          $sql = "select * from pozdro"     ;
          $wynik = $db->query($sql);
          $znalezione = $wynik->num_rows;
          for($i=0; $i<$znalezione; $i++)
          {
              $wiersz = $wynik->fetch_assoc();
              echo $wiesz['imie'];
              echo "<br>" ;
              echo $wiesz['tresc'] ;
          }
          
      }






}

$baza = new mysqli('localhost', 'root','','radio');
$a = new Pozdrowienia($baza);
$imie = "mateusz";
$tresc = "pierwsze pozdro";
$a->dodaj($nazwa,$dane);



?>

Wywala mi błąd : Call to a member function query() on a non-object...

Czyli tak jakby php nie rozpoznawało, że $db jest obiektem mysqli... Co zrobić aby jednak było inaczej?

z góry dzięki ;)

dopiero zaczynam swoją przygodę z obiektowym php także wyrozumiałość wskazana;)

0

Bo $db nie jest obiektem mysqli. Gdzie przypisujesz jakąś wartość składowej $db?

0

przypisuje jej wartość dopiero wtedy kiedy powstaje jakiś egzemplarz tej klasy, u mnie $a i uchwyt $baza ;)

czyli muszę się połączyć z bazą danych w konstruktorze tak? a jak będę miał jeszcze inną klasę np. newsy to przecież nie będę się znowu łączył z baza skoro jest już połączenie ?:)

0

Nigdzie nie przypisujesz wartości dla zmiennej $db będącej składową klasy Pozdrowienia. Wywołujesz konstruktor podając jeden argument, tylko gdzie ten konstruktor? Ten argument jest ignorowany, bo konstruktora nie stworzyłeś, a więc nie istnieje.

function __construct($baza) {
   $this->db = $baza;
}

Wtedy to ma jakiś sens.

0

dopiero teraz zauważyłem że wkleiłem wersje bez konstruktora... ;)

właśnie jak myślałem dlaczego nie działa zrobiłem konstruktor, teraz poprawiłem wersję z i nadal nie otrzymuje wyników, ciągle ten sam komunikat ;)

0

Ah! Tak! Przegapiłem coś jeszcze.

$wynik = $db->query($sql);

Odwołujesz się do lokalnej zmiennej $db, nie do pola klasy. Odwołać się do pola klasy możesz via $this->db. Poprawna wersja:

$wynik = $this->db->query($sql);

1 użytkowników online, w tym zalogowanych: 0, gości: 1