• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Klasa Oferta, PHP problem ze zrozumieniem

Object Storage Arubacloud
0 głosów
118 wizyt
pytanie zadane 25 maja 2017 w PHP przez Justyna Obywatel (1,210 p.)

Cześć, nie rozumiem zbytnio jak używać obiektowości, chce zrobić dodawanie ofert(name, price) do bazy

Zrobiłam coś takiego ale jest źle i nie wiem jak powinno być, (drugi dzień w obiektowości i dlatego mam z tym problem)

Wytłumaczy mi ktoś jak to ma wyglądać ? Wstępnie zrobiłam coś takiego:

<?php
	require 'database.php';
	
	class offert {
		public $name;
		public $price;
		
		public function __construct($name, $price) {
			$this->name = $name;
			$this->price = $price;
		}
	}
	
		$attr = new offert("lol", 1333);
		echo $attr-> name;
	
	
		function addPost(){
			$pdo = Database::connect();
			$sql = "INSERT INTO offert(id, name, price) values("."NULL, :name, :price)";
			$q = $pdo->prepare($sql);
			$q->bindValue(':name', $name, PDO::PARAM_STR);
			$q->bindValue(':price', $price, PDO::PARAM_INT);
			$q->execute();		
		}
	
	
	$attr -> addPost();
	        
	
	
	
	

 

1 odpowiedź

0 głosów
odpowiedź 25 maja 2017 przez CzikaCarry Szeryf (75,340 p.)

Tworzenie klasy która jest tylko i wyłącznie nośnikiem danych i nie ma żadnych metod wykonujących jakieś czynności (oprócz konstruktora który ustawia wartość pól w klasie) ma rację bytu tylko w dwóch przypadkach:

  • Kiedy jest bardzo dużo danych do przeniesienia (dużo pól w klasie)
  • Kiedy klasa dziedziczy pola po jakiejś klasie.

W innych przypadkach tworzenie czegoś takiego nie ma sensu. Widzę, że zapisałeś funkcję dodawania danych do bazy poza klasą, a to powinno się znaleźć w klasie:

<?php
    require 'database.php';
     
    class offert {
        public $name;
        public $price;
         
        public function __construct($name, $price) {
            $this->name = $name;
            $this->price = $price;
        }

       public function addPost(){
            $pdo = Database::connect();
            $sql = "INSERT INTO offert(id, name, price) values("."NULL, :name, :price)";
            $q = $pdo->prepare($sql);
            $q->bindValue(':name', $this -> name, PDO::PARAM_STR);
            $q->bindValue(':price', $this -> price, PDO::PARAM_INT);
            $q->execute();       
        }
    }
     
        $attr = new offert("lol", 1333);
        echo $attr-> name;
        $attr -> addPost();
             
     
     
     
    

Przy okazji poczytaj o setterach i getterach. Istnieje też fajna sztuczka programistyczna zwana fluent interface. Pamiętaj - obiektówka to twój przyjaciel!

Powodzenia w nauce!

komentarz 25 maja 2017 przez Justyna Obywatel (1,210 p.)

Okej dzięki, to co do tego dodawania do bazy, że funkcja powinna się znaleść w klasie. Zrobiłam tak:

<?php
	require 'database.php';
	
	class offert {
		public $name;
		public $price;
		
		public function __construct($name, $price) {
			$this->name = $name;
			$this->price = $price;
		}
		
		function addPost(){
			$pdo = Database::connect();
			$sql = "INSERT INTO offert(id, name, price) values("."NULL, :name, :price)";
			$q = $pdo->prepare($sql);
			$q->bindValue(':name', $name, PDO::PARAM_STR);
			$q->bindValue(':price', $price, PDO::PARAM_INT);
			$q->execute();		
			Database::disconnect();
		}
	
	}
	
		$attr = new offert("lol", 1333);
		$attr-> addPost();
	
	

	
	$attr -> addPost();
	        
	
	
	
Tylko nie wiem jak zrobić by ta funkcją miała zadeklarowane wartości z tego obiektu?

w bind zamiast

            $q->bindValue(':name', $name, PDO::PARAM_STR);
            $q->bindValue(':price', $price, PDO::PARAM_INT);

powinno byc:

            $q->bindValue(':name', $this->price, PDO::PARAM_STR);
            $q->bindValue(':price', $this->price, PDO::PARAM_INT);

 

Coś takiego?

komentarz 25 maja 2017 przez CzikaCarry Szeryf (75,340 p.)
Tak, musisz użyć $this, ponieważ w funkcji addPost() nie istnieją zmienne $name, ani $price, są to pola w obiekcie, a referencją do obiektu na którym pracujesz (siebie) jest $this.
komentarz 25 maja 2017 przez Justyna Obywatel (1,210 p.)

A jeśli robi się serwis i robiąc walidację formularza to waliduje się pola w klasie? np

<?php
	require 'database.php';
	
	class offert {
		public $author;
		public $email;
		public $text;
		        if($text == '') 
            { 
                 echo "blad";
            }
            if(strlen($comment)>255)
            { 
				echo "blad";
			}
		
	//	public function __construct($name, $price) {
	//		$this->name = $name;
	//		$this->price = $price;
	//	}
	
		
		function addPost(){
			$pdo = Database::connect();
			$sql = "INSERT INTO comment(id, author, email, text) values("."NULL, :author, :email, :text)";
			$q = $pdo->prepare($sql);
			$q->bindValue(':name', $this->name, PDO::PARAM_STR);
			$q->bindValue(':email', $this->email, PDO::PARAM_STR);
			$q->bindValue(':text', $this->text, PDO::PARAM_STR);
			$q->execute();		
			Database::disconnect();
			echo "Done";
			               $error = $q->errorInfo();
								if ($error[0]) { var_dump($error); }  
		}
	
	}
	
	
	$komentarz = new offert();
	$komentarz->addPost();
	        
	
	
	
	

 

komentarz 4 czerwca 2017 przez Boshi VIP (100,240 p.)
Waliduje się obiekt a nie klasę. I tym zajmuje się osobny zbiór klas skłądających się na validator.

Podobne pytania

+1 głos
1 odpowiedź 116 wizyt
pytanie zadane 1 listopada 2018 w PHP przez melon210 Nowicjusz (170 p.)
0 głosów
2 odpowiedzi 184 wizyt
pytanie zadane 27 maja 2017 w PHP przez Marduczek Użytkownik (520 p.)
+1 głos
1 odpowiedź 247 wizyt
pytanie zadane 11 kwietnia 2023 w JavaScript przez jasper93 Obywatel (1,310 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...