Operacja między klasami

0

Hej, posiadam poniższy kod. Jak mogę zrobić, aby w register.php w 26 linii, gdzie wyskakuje mi błąd, poprawnie dodawało rekordy do bazy?

register.php

<?php
require_once('var/database.php');
?>
<html>
  <head>
    <title> GAME </title>
  </head>
  <body>
    <form action="#" method= "post">
    LOGIN: <input type = "text" name= "login">
    HASLO: <input type = "password" name = "password">
           <input type = "submit" value="REJESTRUJ">
    </form>
  </body>
</html>

Database.php
<?php
class Register{

private $login;
private $password;
private $_add;

  function __construct()
  {
    $this->_connection = query("INSERT INTO players VALUES ('$login', '$haslo')") or die (mysql_error());
  }
private function AddUser(){
  return $this->_add;
}
}

$add = new Register();
$add->AddUser();

?>
 

Oraz

<?php
/**
 *
 */
class Database{
private  $host = 'localhost';
private  $user = 'root';
private  $password = '';
private  $dbname = 'webdev';
private $_connection;

function __construct(){
    $this->_connection = new mysqli($this->host, $this->user, $this->password, $this->dbname);

if (mysqli_connect_error()){
  echo 'blad polaczenia z baza' . mysql_connect_error();
}
}
private function __clone(){}


public function getConnection(){
  return $this->_connection;
}
}

$connect = new Database();
$connect->getConnection();

?>
 

Błąd - Call to undefined function query() in C:\wamp\www\webdev\register.php on line 26

1

O nie nie nie nie nopenopenopenopenopebardzonope.

Błąd masz choćby w tym, że tutaj INSERT INTO players VALUES ('$login', '$haslo') próbujesz odnieść się do zmiennych lokalnych (zamiast pól klasy), ale generalnie coś mi tutaj nie styka.

  1. Dlaczego wrzuciłeś to insert into do konstruktora?
  2. Do czego odnosi się $this->_connection w konstruktorze?
  3. Wiesz, do czego służy konstruktor?
  4. Co to za pole _add?
  5. Kiedy ustawiasz pola login oraz password? (protip: one się nie ustawiają same tylko dlatego, że masz takie inputy w formularzu)
0
Patryk27 napisał(a):

O nie nie nie nie nopenopenopenopenopebardzonope.

Błąd masz choćby w tym, że tutaj INSERT INTO players VALUES ('$login', '$haslo') próbujesz odnieść się do zmiennych lokalnych (zamiast pól klasy), ale generalnie coś mi tutaj nie styka.

  1. Dlaczego wrzuciłeś to insert into do konstruktora?
  2. Do czego odnosi się $this->_connection w konstruktorze?
  3. Wiesz, do czego służy konstruktor?
  4. Co to za pole _add?
  5. Kiedy ustawiasz pola login oraz password? (protip: one się nie ustawiają same tylko dlatego, że masz takie inputy w formularzu)

Powiem tak, wdrażam się dopiero w OOP PHP i próbuję coś tworzyć, żeby się tego nauczyć bo te tutoriale na necie typu klasa to coś, a obiekt to takie auto mi nic nie daje.

$this->_connection fakt, to nie ma sensu w ogóle.
Pole _add to ma być funkcja dodająca rekord do bazy, ale nie wiem czy dobrze zaczynam.

Mógłbyś mi to jakoś bardziej na kodzie z teorią wytłumaczyć? Byłbym wdzięczny. @Patryk27

2

Pole _add to ma być funkcja
Nie widzisz sprzeczności w tym zdaniu?
Pole ma być funkcją?

Rozpatrzmy następujący kod:

class SomeClass {

	/**
	 * @var int
	 */
	private $id;
	
	/**
	 * Ustawia indeks na wskazaną wartość.
	 * @param int $v
	 * @return $this
	 * @throws Exception
	 */
	public function setId($v) {
		if (!ctype_digit($v)) {
			throw new Exception('Oczekiwano indeksu w formie liczby.');
		}
		
		$this->id = $v;
		return $this;
	}
	
	/**
	 * Zwraca ustawiony indeks.
	 * @return int
	 */
	public function getId() {
		return $this->id;
	}

}

Sporo się tutaj dzieje, więc na początek:

  1. id to pole (dodatkowo prywatne - pola generalnie powinny być prywatne, patrz: hermetyzacja, kapsułkowanie). Niektórzy lubią takie prywatne pola nazywać z przedrostkiem _, np. _id, ale kto co lubi.
  2. setId oraz getId to metody.

Tutaj fachowo setId to setter (jako że jedynie ustawia wartość pola), a getId to getter (jako że jedynie zwraca wartość pola).
Każde pole, które ma być modyfikowalne z zewnątrz klasy, powinno mieć swój odpowiadający prosty setter oraz getter. "Prosty", czyli że setter nie powinien robić nic więcej poza ewentualną walidacją oraz zmianą wartości danego pola, a getter powinien jedynie zwracać wartość pola.

Ponadto wykonując return $this; w setterze umożliwiłem method chaining, czyli że gdyby było w moim obiekcie więcej setterów, można by było z mety napisać:

$obj->
	setFirstName('Jan')->
	setLastName('Kowalski')->
	setPrivatePartSize(30)->
	save();

Zamiast:

$obj->setFirstName('Jan');
$obj->setLastName('Kowalski');
$obj->setPrivatePartSize(30);
$obj->save();

Jest to bardzo popularna technika, z którą jeśli jeszcze się nie spotykasz, to zaczniesz na co dzień np. w Zendzie oraz innych frameworkach/kodach.

Dodatkowo dla smaczku pododawałem do każdej metody oraz pola komentarze PHPDoc, czyli opisy zwiększające czytelność kodu oraz umożliwiające środowisku sensowne podpowiadanie. Może akurat tutaj niewiele pomagają (w końcu setId jest dosyć jednoznaczne - ale czasem są niezbędne, np. jakieś setLength, gdzie w komentarzu do metody wypadałoby sprecyzować, czy metoda przyjmuje centymetry, metry czy kilometry).
Jako początkujący niekoniecznie musisz okomentowywać wszystko czy też odnajdywać się w tych wszystkich tagach dokumentatora, natomiast warto wiedzieć, że coś takiego istnieje.

^ tutaj masz przedstawione sporo wiedzy, która powinna Ci pomóc w pisaniu bardziej przejrzystego kodu - na spokojnie sobie wszystko przetwórz i zadawaj pytania, jeśli czegoś nie rozumiesz ;)


W Twoim konkretnym przypadku optowałbym za utworzeniem klasy `Player` z prywatnymi polami `login`, `password`, ich getterami+setterami oraz metodą `save`, która to dopiero wykonywałaby zapytanie do bazy danych. Wtedy wszystko byłoby jednoznaczne oraz ładnie łączyło w całość :-)

Plus dodatkowo statyczna klasa Database, dzięki której mógłbyś wykonywać zapytania na zasadzie Database::prepareQuery('SELECT ...');.
W związku z bazami danych, poczytaj o PDO - ułatwisz życie sobie oraz innym, jednocześnie zabezpieczając swój kod przed atakami typu sql injection.

2

Patryk27 - fajnie żeś napisał :)
Ja ogólnie od siebie dodam:

  1. Zacznij może od poćwiczenia samych klas/obiektów zanim weźmiesz się za bazę danych. Jak zrozumiesz to, to będziesz miał problemy potem tylko z jedną rzeczą, a nie jak tutaj sam nie do końca wiesz z czym. Także po kolei.
  2. Patryk27 napisał o dodawaniu znaku "_" na początku prywatnych pól/metod. Oczywiście jest to stosowane przez niektóre osoby (sam kiedyś stosowałem), ale zasady PSR (które też fajnie żebyś poznał z czasem) raczej odradzają takie podejście. Więc póki przyzwyczajeń nie masz, nie ucz się stosować podkreślników w tym konktekście.
0
jarekosm napisał(a):

Patryk27 - fajnie żeś napisał :)
Ja ogólnie od siebie dodam:

  1. Zacznij może od poćwiczenia samych klas/obiektów zanim weźmiesz się za bazę danych.

Co możesz polecić do ćwiczenia właśnie tego? Może jakieś materiały masz? @jarekosm

0

Dobrym początkiem jest minitutorial który napisał dla Ciebie @Patryk27 :) Ogólnie pomyśl nad jakąś uproszczoną bazą danych (nie mówię o zapisie do bazy danych, a o bazie danych jako ogólnym pojęciu). Na przykład zrób sobie bazę osób. Np. spróbuj zrobić klasę, na której działałby poniższy kod:

$people = new People();
$people->add('Jan', 'Kowalski');
$people->add('Ignacy', 'Nowak');
$info = $people->getInfoAboutAllPeople();
echo $info;

Oczywiście tego typu przykładów możesz sobie wymyślać wiele. Ćwiczenia czynią mistrza.

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