Я пытаюсь изучить OOP PHP и PDO, это немного запутанно. Прочитав много статей, я решил создать свой первый проект. И вот мой код.
class db{ private static $instance = NULL; private static $DSN = 'mysql:host=localhost;dbname=firstproject'; private function __construct(){ } public static function getInstance(){ if(!self::$instance){ self::$instance = new PDO(self::$DSN,'root',''); self::$instance->exec('SET NAMES utf8'); } return self::$instance; } public function reg_insert($usr_name,$usr_password){ self::$instance->query("INSERT INTO users VALUES(null,'$usr_name','$usr_password')"); } } class insRegInfo{ private $username; private $password; public function __construct($username,$password){ $dbe = db::getInstance(); db::reg_insert($username,$password); } } if(isset($_POST['register'])){ $reg = new getRegInfo($_POST['username'],$_POST['password']); }
<head> <title>PDO Database Project</title> </head> <body> <form action="" method="post"> <p> <label>User Name</label> <input type="text" name="username"/> </p> <p> <label>Password</label> <input type="password" name="password"/> </p> <p> <input type="submit" name="register" value="Register" /> </p> </form> </body>
Итак, вы видите, что это простая система регистрации. Мой вопрос заключается в том, что вызов класса базы данных в другом классе, как это, является истинным способом или должен ли я переносить функцию вставки в класс базы данных, или, может быть, мне нужно определить класс db как parent и insRegInfo как дочерний с методом extends?
Какой способ лучше или это просто зависит от меня?
Я бы начал с использования model / mapper. Это простой способ получить простые объекты и сохранить их в базе данных. Он также позволяет избежать смешивания запросов и кода базы данных (логики продолжительности) с функциональностью (прикладная или бизнес-логика). Простой пример:
class User { public $id; public $username; } class UserMapper { /** * @param User $user */ public function save(User $user) { if(isset($user->id)) { $statement = "Update users set username = ? where id = ?" } else { $statement = "insert into users set username = ?, id = ?" } $instance = db::getInstance(); $sth = $instance->prepare($statement ); $values_a = array($user->username, $user->id); $db_result = $sth->execute($values_a); } /** * @param int $userId * @return User */ public function load($userId) { $statement = "select * from users where id = ?"; $instance = db::getInstance(); $sth = $instance->prepare($statement ); $values_a = array($user->id); $db_result = $sth->execute($values_a); $returnUser = new User(); $returnUser ->id = $db_result[0]['id']; $returnUser ->username = $db_result[0]['username']; return $returnUser; } }
Я бы также рекомендовал использовать getters / setters вместо прямого доступа к члену, но это было просто для простоты кода … Когда вы разрабатываете больше моделей / карт, вы найдете общую функциональность mapper (сохранение, загрузку, удаление, поиск), а вы может реорганизовать ваш код, чтобы он содержал общую логику, поэтому у вас нет куча copypasta.