function __construct($name, $lastName, $address, $rollNo)
{
$this->name = $name;
$this->lastName = $lastName;
$this->address = $address;
$this->rollNo = $rollNo;
$this->conn = new \PDO('mysql:host=localhost;dbname=students', 'root', '');
}
public function getUser($id){
$sql = "SELECT * FROM students WHERE id = ".intval($id);
foreach($this->conn->query($sql) as $row){
$user['name'] = $row['name'];
$user['address'] = $row['address'];
$user['roll_no'] = $row['roll_no'];
}
return $user;
}
所以我想学习的是如何在所有类中使用单个PDO对象,而不是在所有类中创建$ conn,如用户,课程等。
我发现了Dependency Injection,Singleton,Factory这个词,对我来说,作为初学者,这些都是混淆的。
另外,我想知道我在为代码创建PDO的新对象时所做的不好。
答案 0 :(得分:2)
单例是一个控件类,它将确保一次只存在给定对象的一个实例。因此,不是在每个对象中调用$conn = new PDO()
,而是创建多个PDO()
实例,您可以编写一个名为Database
的单例类,而不是使用$conn = Database::instance()
。
class Database
{
static $instance = null;
static function instance()
{
if (self::$instance == null)
self::$instance = new PDO('mysql:host=localhost;dbname=students', 'root', '');
return self::$instance;
}
}
基本上它的作用是创建一个PDO()
类(如果它不存在),并在之前已经实例化时重用它。
作为一个优势,您也不需要将数据库凭据分布在整个项目中。班级Database
将拥有它而不是其他人。
答案 1 :(得分:0)
您可以创建一个名为“数据库”的类来处理连接MySQL和设置PDO。
就像......
class Database{
private $host = DB_HOST;
private $user = DB_USER;
private $pass = DB_PASS;
private $dbname = DB_NAME;
private $dbh;
private $error;
public function __construct(){
// setup dsn
$dns = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
try{
$this->dbh = new PDO($dsn, $this->user, $this->pass);
}
catch(PDOException $e){
$this->error = $e->getMessage();
}
}
}
然后在你的其他类中,只需将类分配给其他类中的变量即可。
$db = new Database();
这样可以避免代码重复。您还可以在Database类中创建函数以执行PDO查询。
答案 2 :(得分:-2)
创建一个包含连接的父类,并创建一个扩展父类的子类
class Main {
protected $dbh;
function dbConnect() {
$options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
//DB_HOST, DB_NAME, DB_USER, DB_PASS are set via define()
//e.g. define("DB_HOST", "localhost");
$dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME;
$this->dbh = new PDO($dsn, DB_USER, DB_PASS, $options);
}
然后..
class User extends Main {
function crudRead() {
parent::dbConnect(); //called from the main class
$db = $this->dbh->prepare('SELECT * FROM user');
$db->execute();
return $db->fetchAll(PDO::FETCH_ASSOC);
}
}