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

[PHP] ocena kodu napisanego przy pomocy OOP

VPS Starter Arubacloud
+1 głos
355 wizyt
pytanie zadane 25 października 2017 w PHP przez `Krzychuu Stary wyjadacz (13,940 p.)

Witam

Stworzyłem skrypt logowania przy pomocy OOP, chciałbym żebyście ocenili mój kod, oraz mam pytanie czy Config::closeConnection(); się wykona po użyciu return?

AuthC.php

SESSION_START();

class AuthC
{		
	public function __construct()
	{
		Config::setConnection("workshop");	
	}
	
	public function login()
	{
		if(isset($_POST['login']) || isset($_POST['password']))
		{
			
			if(empty($_POST['login']) || empty($_POST['password']))
			{
				return LOGIN_FAILED;
			}
						
			$login = htmlentities($_POST['login'], ENT_QUOTES, "UTF-8");
			$password = htmlentities($_POST['password'], ENT_QUOTES, "UTF-8");
								
			try
			{
				mysqli_report(MYSQLI_REPORT_ERROR);
				
				$connect = Config::getConnection();
				
				$login = $connect->real_escape_string($login);
				
				$query = $connect->query("SELECT id, login, password FROM users WHERE login = '$login'");
				
				$row = $query->fetch_assoc();
				
				if(password_verify($password, $row['password']))
				{
					$_SESSION['user'] = true;
					return LOGIN_SUCCESS;
				}
				else
				{
					return LOGIN_FAILED;
				}
				
				Config::closeConnection();
			}	
			catch (Exception $e)
			{
				$_SESSION['exceptionLogin'] = $e->getMessage();
				return DATABASE_ERROR;
			}
		}
	}
}

Config.php

<?php

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;
		}
	}
	
	static public function closeConnection()
	{
		self::$db_connect->close(); 
	}
}

?>
komentarz 25 października 2017 przez efiku Szeryf (75,160 p.)

A teraz spróbuj to zrobić bez słów static i ze wzorcem Dependency Injection  

Czołem.

 

PS: Wstyd dawać @ w kodzie ;) Nie rozumiesz co kopiujesz!

komentarz 25 października 2017 przez `Krzychuu Stary wyjadacz (13,940 p.)
wcześniej to dodałem bo za dużo błędów było i zapomniałem usunąć, dzięki zaraz obczaje ten wzorzec

3 odpowiedzi

+1 głos
odpowiedź 25 października 2017 przez marcin99b Szeryf (81,480 p.)
Na start rzucają się za duże ciała if'ów

Jeśli ciało ma więcej linijek niż... myślę że 5 to taka ok ilość, sprawdź odwrotność i wywal return, a kod który wcześniej był w if daj na dół, jako "normalny kod", ewentualnie wyrzuć go do innej metody

Do tego klamrowanie nie zgodne ze standardami PSR, poczytaj o PSR, głównie 1 i 2

Dane dotyczące logowania do bazy wyrzuciłbym do osobnego pliku generowanego przez system, ale to akurat sposób w jaki ja bym to zrobił, nie jest to błąd

Pewnie znalazłoby się więcej błędów gdybym przeszukał, to takie podstawy które wyłapałem na pierwszy rzut oka

Nie rozumiem troche poco ci prywatne zmienne statyczne z danymi do logowania do bazy, ale może ma to jakieś głębsze zastosowanie
komentarz 25 października 2017 przez Boshi VIP (100,240 p.)
akurat klamry ma ok.
1
komentarz 25 października 2017 przez marcin99b Szeryf (81,480 p.)

LINK

Spójrz na if

komentarz 25 października 2017 przez efiku Szeryf (75,160 p.)
On jeszcze nie poznał co to DI.
+1 głos
odpowiedź 25 października 2017 przez Boshi VIP (100,240 p.)
login i password w login powinnny być jako parametry, w końcu wykonujesz akcję logowania na czymś..

metoda login robi za dużo, cała walidacja do innej klasy, do tego co ma łączenie się z bazą do metody login i pobierania danych?

klasa config do wywalenia cała, bezuzyteczna na tę chwilę.
1
komentarz 25 października 2017 przez Boshi VIP (100,240 p.)
przejdź na pdo przede wszystkim, połaczenie jest zamykane automatycznie
komentarz 25 października 2017 przez `Krzychuu Stary wyjadacz (13,940 p.)
tak właśnie myślałem że lepsze będzie pdo, jakbym rozbił metodę login na,

pobranie danych, sprawdzenie czy podane dane są prawidłowe, zalogowanie użytkownika lub wyświetlenie błędu o błędnym haśle lub loginie, jakbym w taki sposób zrobił byłoby dobrze?
komentarz 28 października 2017 przez `Krzychuu Stary wyjadacz (13,940 p.)
@Boshi wzorzec repository jest tylko do bazy danych?
1
komentarz 28 października 2017 przez Boshi VIP (100,240 p.)
komentarz 28 października 2017 przez `Krzychuu Stary wyjadacz (13,940 p.)
dziękuje
0 głosów
odpowiedź 28 października 2017 przez `Krzychuu Stary wyjadacz (13,940 p.)

próbuje opanować wzorzec Dependency Injection, stworzyłem kawałek kodu, czy dobrze jest zrobiony?

DBmanager.php

class DBmanager
{
	private $db_host = "localhost";
	private $db_user = "root";
	private $db_password = "";
	private $db_name;
	private $db_connect;
	
	public function __construct($db_name = "test")
	{
		$this->db_connect = new mysqli($this->db_host, $this->db_user, $this->db_password, "$db_name");
	}
	
	public function checkConnection()
	{
		if($this->db_connect->connect_errno)
		{
			throw new Exception($this->db_connect->connect_errno);
		}
		else
		{
			return $this->db_connect;
		}
	}
}

AuthC.php

SESSION_START();

class AuthC
{		
	private $mysqli;
	
	public function __construct($db_connect)
	{
		$this->mysqli = $db_connect;
	}
	
}

Index.php

require_once('class/DBmanager.php');
require_once('class/AuthC.php');
$DBmanager = new DBmanager();
$AuthC = new AuthC($DBmanager);

 

Podobne pytania

0 głosów
2 odpowiedzi 299 wizyt
pytanie zadane 7 listopada 2017 w PHP przez `Krzychuu Stary wyjadacz (13,940 p.)
0 głosów
3 odpowiedzi 390 wizyt
pytanie zadane 16 stycznia 2019 w Python przez niezalogowany
0 głosów
0 odpowiedzi 97 wizyt
pytanie zadane 26 kwietnia 2020 w PHP przez creend Gaduła (4,700 p.)

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...