OOP PHP PDO 我的第一个项目,我做得对吗?
OOP PHP PDO My First Project , Am I doing right?
我正在尝试学习 OOP PHP 和 PDO,目前有点混乱。阅读大量文章后,我决定创建我的第一个 project.And 这是我的代码。
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>
如您所见,这是一个简单的注册系统。
我的问题是,像这样在另一个class中调用数据库class,这是正确的方法还是我应该将插入功能带到数据库class,或者我可能需要定义db class 作为父级和 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,而不是直接成员访问,但这只是为了简化代码...随着您开发更多 models/mappers,您会发现常见的映射器功能(节省、加载、删除、查找)并且您可以重构您的代码以包含通用逻辑,这样您就没有一堆复制粘贴了。
我正在尝试学习 OOP PHP 和 PDO,目前有点混乱。阅读大量文章后,我决定创建我的第一个 project.And 这是我的代码。
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>
如您所见,这是一个简单的注册系统。 我的问题是,像这样在另一个class中调用数据库class,这是正确的方法还是我应该将插入功能带到数据库class,或者我可能需要定义db class 作为父级和 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,而不是直接成员访问,但这只是为了简化代码...随着您开发更多 models/mappers,您会发现常见的映射器功能(节省、加载、删除、查找)并且您可以重构您的代码以包含通用逻辑,这样您就没有一堆复制粘贴了。