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

Czy takie rozwiązanie jest dopuszczalne?

Object Storage Arubacloud
0 głosów
225 wizyt
pytanie zadane 23 października 2017 w PHP przez `Krzychuu Stary wyjadacz (13,940 p.)

Witam

Uczę się programowania obiektowago, czy takie coś co stworzyłem do tej pory jest dobre?

 

<?php

class Config
{
	private $db_connect;
	
	static public function getConnection($db_connect = "test")
	{
		$db_connect = @new mysqli("localhost", "root", "", "$db_connect");
		
		if($db_connect->connect_errno)
		{
			throw new Exception("$db_connect->connect_errno");
		}
		else
		{
			return $db_connect;
		}

	}
}

?>

 

<?php

class AuthC
{		
	public function login()
	{
		if(isset($_POST['login']) && isset($_POST['password']))
		{
			try
			{
				mysqli_report(MYSQLI_REPORT_ERROR);
				$connect = Config::getConnection("tests");
			}	
			catch (Exception $e)
			{
?>
				<div class="message-block error">
					<p><span class="icon-cancel"></span><?php echo 'Błąd przy połączeniu z bazą danych: { '.$e->getMessage()." }"; ?></p>
				</div>
<?php 
			} 
		}
	}
}

?>

 

2 odpowiedzi

+1 głos
odpowiedź 23 października 2017 przez CzikaCarry Szeryf (75,340 p.)
W funkcji getConnection za każdym razem tworzysz połączenie. Dla czego? Funkcja getConnection powinna tylko zwracać połączenie i nic więcej, a inicjować to połączenie powinieneś inicjować gdzie indziej, i tylko raz. Pozdrawiam
komentarz 23 października 2017 przez `Krzychuu Stary wyjadacz (13,940 p.)

a jakbym zrobił to w __construct samo połączenie a w getConnection bym dodał ten kod?

        if($db_connect->connect_errno)
        {
            throw new Exception("$db_connect->connect_errno");
        }
        else
        {
            return $db_connect;
        }

 

1
komentarz 24 października 2017 przez CzikaCarry Szeryf (75,340 p.)
Nie wsadzałbym tego do konstruktora, bo wtedy musisz, tworzyć obiekt klasy, aby utworzyć połączenie, potem ten obiekt sobie siedzi w pamięci i nic nie robi, trochę to nieeleganckie. Możesz za to tworzenie połączenia umieścić w jakiejś metodzie statycznej i w pliku PHP który najpierw się wykonuje (np. Plik z routerem czy po prostu plik PHP do którego odwołujemy się w przeglądarce) ją wywołać.
komentarz 24 października 2017 przez `Krzychuu Stary wyjadacz (13,940 p.)

po głębszym zastanowieniu się przypomniała mi się lekcja z kursu gdzie nauczyciel mówił, że trzeba tworzyć set'ery i get'ery i stworzyłem taki kod:

class Config
{
	private static $db_host = "localhost";
	private static $db_user = "root";
	private static $db_password = "";
	private static $db_db_name;
	private static $db_connect;
	
	static public function setConnection($db_name = "test")
	{
		$db_connect = @new mysqli(self::$db_host, self::$db_user, self::$db_password, "$db_name");
		self::$db_connect = $db_connect;
	}
		
	static public function getConnection()
	{
		if(self::$db_connect->connect_errno)
		{
			throw new Exception(self::$db_connect->connect_errno);
		}
		else
		{
			return self::$db_connect;
		}
	}
}

 

SESSION_START();

class AuthC
{		
	public function login()
	{
		if(isset($_POST['login']) && isset($_POST['password']))
		{
			try
			{
				mysqli_report(MYSQLI_REPORT_ERROR);
				Config::setConnection("test");
				$db_connect = Config::getConnection();
				$query = $db_connect->query("SELECT * FROM users");
				echo $query->num_rows;
			}	
			catch (Exception $e)
			{
				$_SESSION['exceptionLogin'] = $e->getMessage(); 
			} 
		}
	}
}

 

1
komentarz 24 października 2017 przez CzikaCarry Szeryf (75,340 p.)
Powinno być spoko, ale wywołanie settera wywalilbym gdzieś na początek strukturalnego kodu wykonywanego (np. Index.php, jakiś router czy coś) lub wsadził to do konstruktora klasy AuthC
komentarz 24 października 2017 przez `Krzychuu Stary wyjadacz (13,940 p.)
sprawdzanie czy udało się nawiązać połączenie powinno być w getConnection czy setConnection?
1
komentarz 24 października 2017 przez CzikaCarry Szeryf (75,340 p.)
W setConnection.
komentarz 24 października 2017 przez `Krzychuu Stary wyjadacz (13,940 p.)
a w getConnection dodać tylko return self::$db_connect?
+1 głos
odpowiedź 23 października 2017 przez Marcin Gładkowski Nowicjusz (160 p.)

Utworzone połączenie przypisujesz w metodzie do zmiennej $db_connect, a potem je zwracasz.

Zamiast return $db_connect; przypisz połączenie do atrybutu tego obiektu, czyli 

$db_connect = @new mysqli("localhost", "root", "", "$db_connect");

$this->db_connect = $db_connect;

Specjalnie napisałem to w linii niżej, żebyś to zobaczył.

Oczywiście powinna być również metoda do zamykania połączenia. 

Atrybuty połączenia warto zamieścić w innym pliku konfiguracyjnym, który potem załączysz do projektu.

komentarz 23 października 2017 przez `Krzychuu Stary wyjadacz (13,940 p.)
a co z kodem htmt, może tam być?
1
komentarz 23 października 2017 przez Marcin Gładkowski Nowicjusz (160 p.)
Ogólnie od dawna używam fraeworków i pisząc OOP nie skusiłbym się na HTML w 'kodzie' klasy. Według mnie, nie powinno się tego tak robic. Osobiście zainicjowałbym session i przypisał klucz o nazwie error z wiadomością o błędzie w połączeniu, i zwrócił tą wiadomość użytkownikowi i tam wstawiając tą wiadomość do odpowiedniego kodu. Nie musisz się sugerować, to tylko moje rozważania. Jednak ten kod HTML w klasie mnie trochę odrzuca.

Podobne pytania

0 głosów
3 odpowiedzi 448 wizyt
–1 głos
1 odpowiedź 531 wizyt
pytanie zadane 19 czerwca 2016 w C i C++ przez DragonCoder Nałogowiec (36,500 p.)
0 głosów
1 odpowiedź 82 wizyt

92,631 zapytań

141,498 odpowiedzi

319,869 komentarzy

62,011 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!

...