데이터베이스와의 통신, 추가, 삭제, 수정 및 읽기(CRUD)를 담당합니다.
먼저 커넥터 클래스를 생성하고 속성
<?php class Connector { // 数据库地址前缀,常见的有mysql,slqlsrv,odbc等等等 private $driver = 'mysql'; // 数据库地址 private $host = 'localhost'; // 数据库默认名称, 设置为静态是因为有切换数据库的需求 private static $db = 'sakila'; // 数据库用户名 private $username = 'root'; // 数据库密码 private $password = ''; // 当前数据库连接 protected $connection; // 数据库连接箱,切换已存在的数据库连接不需要重新通信,从这里取即可 protected static $container = []; // PDO默认属性配置,具体请自行查看文档 protected $options = [ PDO::ATTR_CASE => PDO::CASE_NATURAL, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL, PDO::ATTR_STRINGIFY_FETCHES => false, ]; }
를 설정합니다. 위 코드는 주석으로 이해할 수 있어야 하므로 생략하겠습니다. 더 자세히 설명하고 함수
buildConnectString으로 직접 이동하세요. DSN 연결 문자열을 생성하는 것입니다. 매우 간단합니다
protected function buildConnectString() { return "$this->driver:host=$this->host;dbname=".self::$db; } // "mysql:host=localhost;dbname=sakila;"
connect - 데이터베이스에 연결
public function connect() { try { // 连接数据库,生成pdo实例, 将之赋予$connection,并存入$container之中 self::$container[self::$db] = $this->connection = new PDO($this->buildConnectString(), $this->username, $this->password, $this->options); // 返回数据库连接 return $this->connection; } catch (Exception $e) { // 若是失败, 返回原因 // 还记得dd()吗?这个辅助函数还会一直用上 dd($e->getMessage()); } }
set데이터베이스 - 데이터베이스 전환
public function setDatabase($db) { self::$db = $db; return $this; }
_construct - 인스턴스 생성 후 첫 번째 단계는 무엇입니까
function construct() { // 如果从未连接过该数据库, 那就新建连接 if(empty(self::$container[self::$db])) $this->connect(); // 反之, 从$container中提取, 无需再次通信 $this->connection = self::$container[self::$db]; }
다음 두 함수 표현식은 함께 사용되므로 예제를 사용하여 디버깅할 수 있습니다. 단계별
$a = new Connector(); $bindValues = [ 'PENELOPE', 'GUINESS' ]; dd($a->read('select * from actor where first_name = ? and last_name = ?', $bindValues));반환 값
array (size=1) 0 => object(stdClass)[4] public 'actor_id' => string '1' (length=1) public 'first_name' => string 'PENELOPE' (length=8) public 'last_name' => string 'GUINESS' (length=7) public 'last_update' => string '2006-02-15 04:34:33' (length=19)
public function read($sql, $bindings) { // 将sql语句放入预处理函数 // $sql = select * from actor where first_name = ? and last_name = ? $statement = $this->connection->prepare($sql); // 将附带参数带入pdo实例 // $bindings = ['PENELOPE', 'GUINESS'] $this->bindValues($statement, $bindings); // 执行 $statement->execute(); // 返回所有合法数据, 以Object对象为数据类型 return $statement->fetchAll(PDO::FETCH_OBJ); }
// 从例子中可以看出, 我用在预处理的变量为?, 这是因为pdo的局限性, 有兴趣可以在评论区讨论这个问题 public function bindValues($statement, $bindings) { // $bindings = ['PENELOPE', 'GUINESS'] // 依次循环每一个参数 foreach ($bindings as $key => $value) { // $key = 0/1 // $value = 'PENELOPE'/'GUINESS' $statement->bindValue( // 如果是字符串类型, 那就直接使用, 反之是数字, 将其+1 // 这里是数值, 因此返回1/2 is_string($key) ? $key : $key + 1, // 直接放入值 // 'PENELOPE'/'GUINESS' $value, // 这里直白不多说 // PDO::PARAM_STR/PDO::PARAM_STR is_int($value) ? PDO::PARAM_INT : PDO::PARAM_STR ); } }그럼 이해하셨나요
_( :3 ∠)
// 与read不同的地方在于, read返回数据, update返回boolean(true/false) public function update($sql, $bindings) { $statement = $this->connection->prepare($sql); $this->bindValues($statement, $bindings); return $statement->execute(); }
// 与update一样, 分开是因为方便日后维护制定 public function delete($sql, $bindings) { $statement = $this->connection->prepare($sql); $this->bindValues($statement, $bindings); return $statement->execute(); }
Add id를 반환합니다.
// 返回最新的自增ID, 如果有 public function create($sql, $bindings) { $statement = $this->connection->prepare($sql); $this->bindValues($statement, $bindings); $statement->execute(); return $this->lastInsertId(); }
// pdo自带,只是稍微封装 public function lastInsertId() { $id = $this->connection->lastInsertId(); return empty($id) ? null : $id; }
public function exec($sql) { return $this->connection->exec($sql); }
public function query($sql) { $q = $this->connection->query($sql); return $q->fetchAll(PDO::FETCH_OBJ); }전체 코드
public function beginTransaction() { $this->connection->beginTransaction(); return $this; } public function rollBack() { $this->connection->rollBack(); return $this; } public function commit() { $this->connection->commit(); return $this; } public function inTransaction() { return $this->connection->inTransaction(); }
2.) 데이터 추가와 다시 쓰기 두 가지 기능은 여러 데이터 세트를 한 번에 추가하는 것을 지원하지 않습니다. 이유는 너무 번거롭다고 생각해서 삭제했기 때문입니다. .사려 깊은 어린이 신발이 솔루션을 제공할 수 있습니다
위 내용은 자신만의 데이터베이스 패키지를 작성하는 방법 (2)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!