配置文件和Mysql類
一.創建Mysql類
1.本身我們將使用PDO來操控數據庫,而不管哪種數據庫引擎,直接操作都比較松散,所以我們有必要做適當的封裝(封裝過度也會導致學習成本過高,適當就好)。
2.創建一個方法端mysql.php的類。
//MySQL數據庫類 class Mysql { }
3.創建對外的調用端1.php引入方法端數據庫mysql.php
<?php //引入數據庫類 require 'mysql.php'; $Mysql = new Mysql();
4.創建類中的構造方法,構造方法里通過PDO來連接數據庫。
方法端mysql.php類:
//構造方法,自動連接PDO <?php //數據庫類 class Mysql { //構造方法,自動PDO連接數據庫 public function __construct() { try { //連接MySQL數據庫 $pdo = new PDO('mysql:host=localhost;dbname=example', 'xixi','123456'); //設置UTF8字符編碼 $pdo->query('SET NAMES UTF8'); } catch (PDOException $e) { //輸出錯誤信息 echo $e->getMessage(); } } }
測試是否鏈接成功:http://192.168.3.62/Example/mysql/1.php
二.配置文件
1.數據庫配置信息直接在mysql.php文件中,當移植或配置其他數據庫服務器時,需要經常改動這里,帶來麻煩。我們需要創建一個配置文件config.php,來統一處理所有配置信息。
2.創建config.php,使用return array()數組方式配置信息。
<?php //返回配置文件數組 return array( //數據庫配置 'DB_HOST' => 'localhost', //服務器地址 'DB_NAME' => 'example', //數據庫名 'DB_USER' => 'xixi', //用戶名 'DB_PASS' => '123456' //密碼 );
3.將配置信息config.php引入到Mysql.class.php類中去。
<?php //數據庫類 class Mysql { //構造方法,自動PDO連接數據庫 public function __construct() { try { //引入配置文件 $config = require('config.php'); //連接MySQL數據庫 $pdo = new PDO('mysql:host='.$config['DB_HOST'].';dbname='.$config['DB_NAME'], $config['DB_USER'], $config['DB_PASS']); //設置UTF8字符編碼 $pdo->query('SET NAMES UTF8'); } catch (PDOException $e) { //輸出錯誤信息 echo $e->getMessage(); } } }
調用端1.php測試是否連接成功
三.內部實例化
1.如果每次都要在外部進行new Mysql();這樣看上去顯得麻煩,也難受。
2.我們可以在方法端mysql.php的內部通過靜態方法進行實例化,外部直接調用這個方法,即完成了實例化的過程。
<?php //數據庫類 class Mysql { //構造方法,自動PDO連接數據庫 public function __construct() { try { //引入配置文件 $config = require('config.php'); //連接MySQL數據庫 $pdo = new PDO('mysql:host='.$config['DB_HOST'].';dbname='.$config['DB_NAME'], $config['DB_USER'], $config['DB_PASS']); //設置UTF8字符編碼 $pdo->query('SET NAMES UTF8'); } catch (PDOException $e) { //輸出錯誤信息 echo $e->getMessage(); } } //內部自我實例化,靜態方法 public static function stmt() { //返回出一個對象 return new self(); } public function test() { echo 'test'; } }
3.通過外部調用端1.php調用Mysql類。
<?php //引入數據庫類 require 'mysql.php'; //實例化並創建對象 $Mysql = Mysql::stmt(); //調用 $Mysql->test();
調用端1.php查看測試
test
數據庫功能類-封裝新增方法
通過一個簡單的傳遞參數,即可智能實現數據新增。
一.調用猜想
1.如果使用過一些框架,它們就把增刪改查進行了有效的封裝。
2.通過實例化,將調用端1.php和方法端mysql.php關聯的數據表關聯上。
<?php //引入數據庫類 require 'mysql.php'; //實例化並創建對象 $Mysql = Mysql::mysql(); 打印出$Mysql這個對象測試 var_dump($Mysql);
調用端1.php查看測試
object(Mysql)[1]
3.字段和值,通過數組傳遞。
給對外的調用端1.php新增數據,通過數組傳遞方式把字段和值傳進去:
<?php //引入數據庫類 require 'mysql.php'; //實例化並創建對象,給這個ex_user表傳值 $Mysql = Mysql::mysql('ex_user'); //新增數據,通過數組實現字段和值的對應 $data = array( 'name' => '西西', 'age' => 29, 'create_time' => date('Y-m-d H:i:s') ); //寫入數據庫,並返回當前最新的ID值 echo $Mysql->add($data);
二.方法端mysql.php逐步實現數據庫封裝新增方法
第一步:在Mysql類中,創建一個新增方法,數據庫新增字段數組
public function add($data) { //通過array_keys得到字段數組$keys,不管傳多少值只要得到$keys就行了 $keys = array_keys($data); //打印$keys值查看 print_r($keys); }
查看:
Array ( [0] => name [1] => age [2] => create_time )
第二步:新增方法關聯的表和PDO對象,需要在構造方法里保存。
//數據庫類 class Mysql { //將PDO對象保存至屬性 private $pdo; //構造方法,自動PDO連接數據庫 public function __construct() { try { //保存PDO對象為屬性 $this->pdo = $pdo; } } //數據庫新增操作 public function add($data) { } }
第三步:實現sql語句寫入到數據庫
//數據庫實現新增 public function add($data) { //SQL新增 $sql = "INSERT INTO ex_user (name, age, create_time) VALUES ('西西',18,NOW())"; //執行SQL語句 $this->pdo->prepare($sql)->execute(); }
第四步:sql寫入到數據庫后返回一個寫入的ID
//數據庫新增操作 public function add($data) { //返回最新的ID值 return $this->pdo->lastInsertId(); }
第五步:將字段數組加上防止沖突的`符號,得到字段字符串
//數據庫新增操作 public function add($data) { //得到字段數組 $keys = array_keys($data); //將字段數組加上防止沖突的`符號 foreach ($keys as $key=>$value) { $keys[$key] = '`'.$value.'`'; } //得到字段字符串 $fields = implode(',', $keys); echo $fields; }
通過echo $fields打印查看得到字段字符串:
`name`,`age`,`create_time`
第六步:得到值字符串,給值字符串加上單引號
//數據庫新增操作 public function add($data) { //給值字符串加上單引號 foreach ($data as $key=>$value) { $data[$key] = "'".$value."'"; } //得到值字符串 $values = implode(',', $data); echo $values; }
通過echo $values打印查看將要寫入到數據庫值字符串
'西西','29','2018-03-02 09:49:31'
第七步:在所有的方法里共享表名ex_user
<?php //數據庫類 class Mysql { //將表名保存至屬性 private $table; //構造方法,自動PDO連接數據庫 public function __construct($table) { try { //保存數據表名,加上單引號防止出錯 $this->table = '`'.$table.'`'; } catch (PDOException $e) { } } //內部自我實例化,靜態方法 public static function mysql($table) { return new self($table); } //數據庫新增操作 public function add($data) { } }
第八步:通過得到的第五步字段字符串,第六步值字符串,第七步ex_user表名重組SQL語句
//數據庫新增操作 public function add($data) { //重組SQL語句 $sql = "INSERT INTO $this->table ($fields) VALUES ($values)"; }
最后整理最終代碼::
<?php //數據庫類 class Mysql { //將PDO對象保存至屬性 private $pdo; //將表名保存至屬性 private $table; //構造方法,自動PDO連接數據庫 public function __construct($table) { try { //引入配置文件 $config = require('config.php'); //連接MySQL數據庫 $pdo = new PDO('mysql:host='.$config['DB_HOST'].';dbname='.$config['DB_NAME'], $config['DB_USER'], $config['DB_PASS']); //設置UTF8字符編碼 $pdo->query('SET NAMES UTF8'); //保存PDO對象為屬性 $this->pdo = $pdo; //保存數據表名 $this->table = '`'.$table.'`'; } catch (PDOException $e) { //輸出錯誤信息 echo $e->getMessage(); } } //內部自我實例化,靜態方法 public static function mysql($table) { return new self($table); } //數據庫新增操作 public function add($data) { //得到字段數組 $keys = array_keys($data); //將字段數組加上防止沖突的`符號 foreach ($keys as $key=>$value) { $keys[$key] = '`'.$value.'`'; } //得到字段字符串 $fields = implode(',', $keys); //給值字符串加上單引號 foreach ($data as $key=>$value) { $data[$key] = "'".$value."'"; } //得到值字符串 $values = implode(',', $data); //SQL新增 $sql = "INSERT INTO $this->table ($fields) VALUES ($values)"; //執行SQL語句 $this->pdo->prepare($sql)->execute(); //返回最新的ID值 return $this->pdo->lastInsertId(); } }
數據庫功能類-封裝修改方法
一.封裝修改
調用端1.php倆種修改方式通過提交的ID判斷條件或自定義判斷條件
<?php //引入數據庫類 require 'mysql.php'; //實例化並創建對象 $Mysql = Mysql::mysql('ex_user'); //可以直接通過提交的ID判斷條件或自定義判斷條件。修改數據id篩選傳遞 <?php //引入數據庫類 require 'mysql.php'; //實例化並創建對象 $Mysql = Mysql::mysql('ex_user'); //將要修改的數據,有兩種方式修改 $data = array( 'id' => 1, 'name' => '西西', 'age' => 18 ); //修改數據庫,並返回當前影響行數(返回大於0,說明修改成功) //方式一:提交的ID判斷條 echo $Mysql->update($data); //方式二:通過array('name'=>'西西')自定義判斷條件 echo $Mysql->update($data, array('name'=>'西西'));
方法部分mysql.php可以支持ID或自定義判斷
實現步驟:
第一步:測試mysql.php輸出的sql語句格式是否正確
//數據庫修改操作 public function update($data) { //重組SQL語句 $sql = "UPDATE $this->table SET xxx=xxx,xxx=xxx WHERE xx=xx"; echo $sql; }
調用端1.php測試輸出$sql語句格式
UPDATE `ex_user` SET xxx=xxx,xxx=xxx WHERE xx=xx
第二步:分離數組中的id和其他字段
(1)得到$idWhere
//數據庫修改操作 public function update($data) { //初始化id條件等於空 $idWhere = ''; //先通過array_key_exists這個函數判斷有沒有id這個字段 //最后分離數組中的id和其他字段 if (array_key_exists('id', $data)) { //$idWhere得到初始化的id條件 $idWhere = "(`id`='{$data['id']}')"; } //重組SQL語句 $sql = "UPDATE $this->table SET xxx=xxx,xxx=xxx WHERE $idWhere";
//輸出當前重組的SQL語句 echo $sql; }
調用端1.php測試輸出$sql語句格式測試輸出$sql語句
UPDATE `ex_user` SET xxx=xxx,xxx=xxx WHERE (`id`='1')
第三步:得到將要修改的$key和$value的值
方式一:通過id條件得到將要修改的$key和$value的值
//數據庫修改操作 public function update($data) { //初始化id條件 $idWhere = ''; //修改字符串 $update = ''; //先分離數組中的id和其他字段 if (array_key_exists('id', $data)) { $idWhere = "(`id`='{$data['id']}')"; } //使用id條件判斷 $where = $idWhere; //得到剔除id索引的數組 unset($data['id']); //將字段數組加上防止沖突的`符號 foreach ($data as $key=>$value) { $update .= "`$key`='$value',"; } //去掉最后的逗號 $update = substr($update, 0, -1); //重組SQL語句 $sql = "UPDATE $this->table SET $update WHERE $where"; //輸出當前重組的SQL語句 echo $sql; }
調用端1.php查看測試
UPDATE `ex_user` SET `name`='西西',`age`='18' WHERE (`id`='1')
方式二:通過array('name'=>'西西')傳的參數得到將要修改$key和$value的值
//數據庫修改操作 public function update($data, $otherWhere = []) { //初始化id 條件 $idWhere = ''; //修改字符串 $update = ''; //先分離數組中的id和其他字段 if (array_key_exists('id', $data)) { $idWhere = "(`id`='{$data['id']}')"; } //如果沒有指定otherWhere,則使用id if (empty($otherWhere)) { //使用id 條件判斷 $where = $idWhere; } else { //使用指定條件判斷 $key = key($otherWhere); $value = current($otherWhere); $where = "(`$key`='$value')"; } //得到剔除id 索引的數組 unset($data['id']); //將字段數組加上防止沖突的`符號 foreach ($data as $key=>$value) { $update .= "`$key`='$value',"; } //去掉最后的逗號 $update = substr($update, 0, -1); //重組SQL語句 $sql = "UPDATE $this->table SET $update WHERE $where"; //輸出當前重組SQL語句查看 echo $sql; }
調用端1.php查看測試
UPDATE `ex_user` SET `name`='西西',`age`='18' WHERE (`name`='西西')
最終方法部分mysql.php語句:
<?php //數據庫類 class Mysql { //將PDO對象保存至屬性 private $pdo; //將表名保存至屬性 private $table; //構造方法,自動PDO連接數據庫 public function __construct($table) { try { //引入配置文件 $config = require('config.php'); //連接MySQL數據庫 $pdo = new PDO('mysql:host='.$config['DB_HOST'].';dbname='.$config['DB_NAME'], $config['DB_USER'], $config['DB_PASS']); //設置UTF8字符編碼 $pdo->query('SET NAMES UTF8'); //保存PDO對象為屬性 $this->pdo = $pdo; //保存數據表名 $this->table = '`'.$table.'`'; } catch (PDOException $e) { //輸出錯誤信息 echo $e->getMessage(); } } //內部自我實例化,靜態方法 public static function mysql($table) { return new self($table); } //數據庫修改操作 public function update($data, $otherWhere = []) { //初始化id 條件 $idWhere = ''; //修改字符串 $update = ''; //先分離數組中的id 和其他字段 if (array_key_exists('id', $data)) { $idWhere = "(`id`='{$data['id']}')"; } //如果沒有指定otherWhere,則使用id if (empty($otherWhere)) { //使用id 條件判斷 $where = $idWhere; } else { //使用指定條件判斷 $key = key($otherWhere); $value = current($otherWhere); $where = "(`$key`='$value')"; } //得到剔除id 索引的數組 unset($data['id']); //將字段數組加上防止沖突的`符號 foreach ($data as $key=>$value) { $update .= "`$key`='$value',"; } //去掉最后的逗號 $update = substr($update, 0, -1); //重組SQL語句 $sql = "UPDATE $this->table SET $update WHERE $where"; //得到准備語句 $stmt = $this->pdo->prepare($sql); //執行SQL語句 $stmt->execute(); //返回影響行數 return $stmt->rowCount(); } }
數據庫功能類-封裝刪除方法
調用端1.php可以直接傳遞ID值或條件判斷的鍵值對數組。
<?php //引入數據庫類 require 'mysql.php'; //實例化並創建對象 $Mysql = Mysql::mysql('ex_user'); //刪除數據,默認id 篩選或傳遞指定條件,並返回影響行數 //方式一:通過id條件刪除的$key和$value的值 echo $Mysql->delete(12); //方式二:指定name=西西的刪除 echo $Mysql->delete(array('name'=>'西西'));
方法端mysql.php刪除的倆種方式
方式一:通過id條件刪除的$key和$value的值
//數據庫刪除操作 public function delete($param) { //使用id 條件判斷 $where = "(`id`='$param')"; //重組SQL $sql = "DELETE FROM $this->table WHERE $where"; //得到准備語句 $stmt = $this->pdo->prepare($sql); //執行SQL語句 $stmt->execute(); //返回影響行數 return $stmt->rowCount(); }
方式二:指定name=西西的刪除
//數據庫刪除操作 public function delete($param) { //判斷參數是否是數字ID,還是數組 if (is_array($param)) { //使用指定條件判斷 $key = key($param); $value = current($param); $where = "(`$key`='$value')"; } else { //使用id 條件判斷 $where = "(`id`='$param')"; } //重組SQL $sql = "DELETE FROM $this->table WHERE $where"; //得到准備語句 $stmt = $this->pdo->prepare($sql); //執行SQL語句 $stmt->execute(); //返回影響行數 return $stmt->rowCount(); }
最終完整mysql.php語句:
<?php //數據庫類 class Mysql { //將PDO對象保存至屬性 private $pdo; //將表名保存至屬性 private $table; //構造方法,自動PDO連接數據庫 public function __construct($table) { try { //引入配置文件 $config = require('config.php'); //連接MySQL數據庫 $pdo = new PDO('mysql:host='.$config['DB_HOST'].';dbname='.$config['DB_NAME'], $config['DB_USER'], $config['DB_PASS']); //設置UTF8字符編碼 $pdo->query('SET NAMES UTF8'); //保存PDO對象為屬性 $this->pdo = $pdo; //保存數據表名 $this->table = '`'.$table.'`'; } catch (PDOException $e) { //輸出錯誤信息 echo $e->getMessage(); } } //內部自我實例化,靜態方法 public static function mysql($table) { return new self($table); } //數據庫刪除操作 public function delete($param) { //判斷參數是否是數字ID,還是數組 if (is_array($param)) { //使用指定條件判斷 $key = key($param); $value = current($param); $where = "(`$key`='$value')"; } else { //使用id 條件判斷 $where = "(`id`='$param')"; } //重組SQL $sql = "DELETE FROM $this->table WHERE $where"; //得到准備語句 $stmt = $this->pdo->prepare($sql); //執行SQL語句 $stmt->execute(); //返回影響行數 return $stmt->rowCount(); } }
封裝數據庫功能類-單查詢和多查詢
一.封裝單一查詢
單一查詢基本上需要where條件判斷,一般默認都是通過ID操作的。
實現步驟:
第一步:測試方法端mysql.php輸出的sql語句格式是否正確:
//單一查詢方法 public function find() { //SQL語句 $sql = "SELECT id,name,age,create_time FROM $this->table WHERE id=1"; //打印查詢的語句 echo $sql;
調用端1.php增加單一查詢模式:
<?php //引入數據庫類 require 'mysql.php'; //實例化並創建對象 $Mysql = Mysql::mysql('ex_user'); //單一查詢模式 $Mysql->find();
調用端執行的1.php測試輸出的sql語句
SELECT id,name,age,create_time FROM `ex_user` WHERE id=1
第二步:方法端mysql.php得到將要查詢的id值($where)
//單一查詢方法 public function find($param) { //得到where條件 $where = $this->getParam($param); //帶$where的SQL語句 $sql = "SELECT id,name,age,create_time FROM $this->table WHERE $where"; //打印查詢的語句 echo $sql; } //重復的ID條件代碼內部調用,包裹成私有化方法 private function getParam($param) { //判斷參數是否是數字ID,還是數組 if (is_array($param)) { //使用指定條件判斷 $key = key($param); $value = current($param); $where = "(`$key`='$value')"; } else { //使用id條件判斷 $where = "(`id`='$param')"; } return $where; }
調用端1.php增加ID數1查看是否可以調用成功
<?php //引入數據庫類 require 'mysql.php'; //實例化並創建對象 $Mysql = Mysql::mysql('ex_user'); //單一查詢模式 //實現ID=1 $Mysql->find(1);
調用端執行的1.php測試輸出的sql語句
SELECT id,name,age,create_time FROM `ex_user` WHERE (`id`='1')
第三步:方法端得到mysql.php將要查詢的id,name,age,create_time的值($fields)
///單一查詢方法 public function find($fields, $param) { //得到where條件 $where = $this->getParam($param); //得到加上`符號的字段,先轉換成數組 $fields = $this->getFields($fields); //加上$this的SQL語句 $sql = "SELECT $fields FROM $this->table WHERE id=$where"; echo $sql; } //重復的ID條件代碼內部調用,包裹成私有化方法 private function getParam($param) { //判斷參數是否是數字ID,還是數組 if (is_array($param)) { //使用指定條件判斷 $key = key($param); $value = current($param); $where = "(`$key`='$value')"; } else { //使用id 條件判斷 $where = "(`id`='$param')"; } return $where; } //重組fields字段,私有化方法 private function getFields($fields) { //給fields 加上`符號 $fields = explode(',', $fields); //將字段數組加上防止沖突的`符號 foreach ($fields as $key=>$value) { $fields[$key] = "`$value`"; } //得到值字符串 $fields = implode(',', $fields); return $fields; }
調用端1.php增加ID數1查看id,name,age,create_time是否可以調用成功
<?php //引入數據庫類 require 'mysql.php'; //實例化並創建對象 $Mysql = Mysql::mysql('ex_user'); //實現id,name,age,create_time $Mysql->find('id,name,age,create_time', 1);
調用端執行的1.php測試輸出的sql語句
SELECT `id`,`name`,`age`,`create_time` FROM `ex_user` WHERE id=(`id`='1')
方法端mysql.php最終通過得到的sql得到准備對象$stmt最終實現單一查詢
<?php //數據庫類 class Mysql { //將PDO對象保存至屬性 private $pdo; //將表名保存至屬性 private $table; //構造方法,自動PDO連接數據庫 public function __construct($table) { try { //引入配置文件 $config = require('config.php'); //連接MySQL數據庫 $pdo = new PDO('mysql:host='.$config['DB_HOST'].';dbname='.$config['DB_NAME'], $config['DB_USER'], $config['DB_PASS']); //設置UTF8字符編碼 $pdo->query('SET NAMES UTF8'); //保存PDO對象為屬性 $this->pdo = $pdo; //保存數據表名 $this->table = '`'.$table.'`'; } catch (PDOException $e) { //輸出錯誤信息 echo $e->getMessage(); } } //內部自我實例化,靜態方法 public static function mysql($table) { return new self($table); } //單一查詢方法 public function find($fields, $param) { //得到where條件 $where = $this->getParam($param); //得到加上`符號的字段 $fields = $this->getFields($fields); //重組SQL語句,LIMIT 1只顯示一條 $sql = "SELECT $fields FROM $this->table WHERE $where LIMIT 1"; //得到准備對象 $stmt = $this->pdo->prepare($sql); //執行SQL語句 $stmt->execute(); //返回單一數據 return $stmt->fetchObject(); } //重復的代碼內部調用,私有化方法 private function getParam($param) { //判斷參數是否是數字ID,還是數組 if (is_array($param)) { //使用指定條件判斷 $key = key($param); $value = current($param); $where = "(`$key`='$value')"; } else { //使用id 條件判斷 $where = "(`id`='$param')"; } return $where; } //重組fields字段,私有化方法 private function getFields($fields) { //給fields 加上`符號 $fields = explode(',', $fields); //將字段數組加上防止沖突的`符號 foreach ($fields as $key=>$value) { $fields[$key] = "`$value`"; } //得到值字符串 $fields = implode(',', $fields); return $fields; } }
調用端1.php最終實現查詢ID=3的姓名
<?php //引入數據庫類 require 'mysql.php'; //實例化並創建對象 $Mysql = Mysql::mysql('ex_user'); //最終實現單一查詢模式 $object = $Mysql->find('id,name,age,create_time', 3); //輸出姓名 echo $object->name;
二.封裝多查詢
方法端mysql.php多查詢和單查詢基本一樣,這里不用where
<?php //數據庫類 class Mysql { //將PDO對象保存至屬性 private $pdo; //將表名保存至屬性 private $table; //構造方法,自動PDO連接數據庫 public function __construct($table) { try { //引入配置文件 $config = require('config.php'); //連接MySQL數據庫 $pdo = new PDO('mysql:host='.$config['DB_HOST'].';dbname='.$config['DB_NAME'], $config['DB_USER'], $config['DB_PASS']); //設置UTF8字符編碼 $pdo->query('SET NAMES UTF8'); //保存PDO對象為屬性 $this->pdo = $pdo; //保存數據表名 $this->table = '`'.$table.'`'; } catch (PDOException $e) { //輸出錯誤信息 echo $e->getMessage(); } } //內部自我實例化,靜態方法 public static function mysql($table) { return new self($table); } //多查詢方法 public function select($fields) { //得到加上`符號的字段 $fields = $this->getFields($fields); //重組SQL語句 $sql = "SELECT $fields FROM $this->table"; //得到准備對象 $stmt = $this->pdo->prepare($sql); //執行SQL語句 $stmt->execute(); //初始化列表對象 $objects = []; //組裝數據列表 while ($rows = $stmt->fetchObject()) { $objects[] = $rows; } //返回數據對象數組 return $objects; } //重組fields字段,私有化方法 private function getFields($fields) { //給fields 加上`符號 $fields = explode(',', $fields); //將字段數組加上防止沖突的`符號 foreach ($fields as $key=>$value) { $fields[$key] = "`$value`"; } //得到值字符串 $fields = implode(',', $fields); return $fields; } }
調用端1.php最終實現多查詢
<?php //引入數據庫類 require 'mysql.php'; //實例化並創建對象 $Mysql = Mysql::mysql('ex_user'); //多查詢,模式 $objects = $Mysql->select('id,name,age,create_time'); //遍歷 foreach ($objects as $key=>$obj) { echo $obj->name.'<br>'; }
數據庫功能類-封裝連綴操作
封裝連綴功能讓where、fields和limit等操作,變得簡單易學。
一.為何要連綴
1.如果封裝越發復雜,參數傳遞就越多,學習成本就越大,讓開發者摸不着頭腦。
2.而連綴模式,可以無限的復雜下去,且不提升學習成本,開發者思路清晰。
二.where連綴
通過where連綴方式刪除:
方法端mysql.php實現代碼
<?php //數據庫類 class Mysql { //將PDO對象保存至屬性 private $pdo; //將表名保存至屬性 private $table; //第一步:設置條件屬性 private $where; //構造方法,自動PDO連接數據庫 public function __construct($table) { try { //引入配置文件 $config = require('config.php'); //連接MySQL數據庫 $pdo = new PDO('mysql:host='.$config['DB_HOST'].';dbname='.$config['DB_NAME'], $config['DB_USER'], $config['DB_PASS']); //設置UTF8字符編碼 $pdo->query('SET NAMES UTF8'); //保存PDO對象為屬性 $this->pdo = $pdo; //保存數據表名 $this->table = '`'.$table.'`'; } catch (PDOException $e) { //輸出錯誤信息 echo $e->getMessage(); } } //內部自我實例化,靜態方法 public static function mysql($table) { return new self($table); } //數據庫刪除操作 public function delete() { //第三步:重組SQL語句保存where為屬性即可 $sql = "DELETE FROM $this->table $this->where"; //得到准備語句 $stmt = $this->pdo->prepare($sql); //執行SQL語句 $stmt->execute(); //返回影響行數 return $stmt->rowCount(); } //第二步:設置where條件 public function where($param) { //得到第一組key=value $key = key($param); $value = current($param); //如果沒有第二下標,則默認= $sign = empty($param[0]) ? '=' : $param[0]; //合並成判斷條件,保存到屬性里去 $this->where = "WHERE (`$key`$sign'$value')"; //返回當前Mysql對象 return $this; } }
調用端1.php使用->where()倆種方式刪除。
?php //引入數據庫類 require 'mysql.php'; //實例化並創建對象 $Mysql = Mysql::mysql('ex_user'); //第一種調用方式:把條件分離出來,更清晰,把id等於3的刪除掉 $condition['id'] = 3; $Mysql->where($condition)->delete(); //第二種調用方式:默認=號,可以通過這種使用大於號把id大於三的都刪除掉 $condition = array('id'=>3, '>'); $Mysql->where($condition)->delete();
通過where連綴方式修改:
方法端mysql.php實現代碼
<?php //數據庫類 class Mysql { //將PDO對象保存至屬性 private $pdo; //將表名保存至屬性 private $table; //第一步:設置條件屬性 private $where; //構造方法,自動PDO連接數據庫 public function __construct($table) { try { //引入配置文件 $config = require('config.php'); //連接MySQL數據庫 $pdo = new PDO('mysql:host='.$config['DB_HOST'].';dbname='.$config['DB_NAME'], $config['DB_USER'], $config['DB_PASS']); //設置UTF8字符編碼 $pdo->query('SET NAMES UTF8'); //保存PDO對象為屬性 $this->pdo = $pdo; //保存數據表名 $this->table = '`'.$table.'`'; } catch (PDOException $e) { //輸出錯誤信息 echo $e->getMessage(); } } //內部自我實例化,靜態方法 public static function mysql($table) { return new self($table); } //數據庫修改操作 public function update($data) { //修改字符串 $update = ''; //得到剔除id 索引的數組 unset($data['id']); //將字段數組加上防止沖突的`符號 foreach ($data as $key=>$value) { $update .= "`$key`='$value',"; } //去掉最后的逗號 $update = substr($update, 0, -1); //重組SQL語句,保存where為屬性 $sql = "UPDATE $this->table SET $update $this->where"; //得到准備語句 $stmt = $this->pdo->prepare($sql); //執行SQL語句 $stmt->execute(); //返回影響行數 return $stmt->rowCount(); } //第二步:設置where條件 public function where($param) { //使用指定條件判斷 $key = key($param); $value = current($param); //如果沒有第二下標,則默認= $sign = empty($param[0]) ? '=' : $param[0]; //合並成判斷條件,保存到屬性里去 $this->where = "WHERE (`$key`$sign'$value')"; //返回當前Mysql對象 return $this; } }
調用端1.php使用->where()方式修改
<?php //引入數據庫類 require 'mysql.php'; //實例化並創建對象 $Mysql = Mysql::mysql('ex_user'); //修改數據 $data = array( 'name' => '西西', 'age' => 18 ); //修改數據庫,並返回當前影響行數(大於0,說明修改成功) $condition = array('name'=>'小西西'); echo $Mysql->where($condition)->update($data);
三.fields連綴
通過fields連綴方式實現單一查詢:
方法端mysql.php實現代碼
mysql.php <?php //數據庫類 class Mysql { //將PDO對象保存至屬性 private $pdo; //將表名保存至屬性 private $table; //條件屬性 private $where; //第一步:設置字段屬性 private $fields = '*'; //構造方法,自動PDO連接數據庫 public function __construct($table) { try { //引入配置文件 $config = require('config.php'); //連接MySQL數據庫 $pdo = new PDO('mysql:host='.$config['DB_HOST'].';dbname='.$config['DB_NAME'], $config['DB_USER'], $config['DB_PASS']); //設置UTF8字符編碼 $pdo->query('SET NAMES UTF8'); //保存PDO對象為屬性 $this->pdo = $pdo; //保存數據表名 $this->table = '`'.$table.'`'; } catch (PDOException $e) { //輸出錯誤信息 echo $e->getMessage(); } } //內部自我實例化,靜態方法 public static function mysql($table) { return new self($table); } //單一查詢方法 public function find() { //重組SQL語句 $sql = "SELECT $this->fields FROM $this->table $this->where LIMIT 1"; //得到准備對象 $stmt = $this->pdo->prepare($sql); //執行SQL語句 $stmt->execute(); //返回單一數據 return $stmt->fetchObject(); } //所有的where條件都在這里 public function where($param) { //使用指定條件判斷 $key = key($param); $value = current($param); //如果沒有第二下標,則默認= $sign = empty($param[0]) ? '=' : $param[0]; //合並成判斷條件,保存到屬性里去 $this->where = "WHERE (`$key`$sign'$value')"; //返回當前Mysql對象 return $this; } //第二步:設置fields直接復制,並保存屬性,方便調用 public function fields($fields) { //給fields 加上`符號 $fields = explode(',', $fields); //將字段數組加上防止沖突的`符號 foreach ($fields as $key=>$value) { $fields[$key] = "`$value`"; } //得到值字符串 $this->fields = implode(',', $fields); //Mysql對象 return $this; } }
調用端1.php使用fields連綴實現查詢
<?php //引入數據庫類 require 'mysql.php'; //實例化並創建對象 $Mysql = Mysql::mysql('ex_user'); //單一查詢,模式 $condition = array('id'=>1); $object = $Mysql->where($condition)->find(); echo $object->name;;
通過fields連綴方式實現單一查詢:
方法端mysql.php實現代碼
<?php //數據庫類 class Mysql { //將PDO對象保存至屬性 private $pdo; //將表名保存至屬性 private $table; //條件屬性 private $where; //字段屬性 private $fields = '*'; //構造方法,自動PDO連接數據庫 public function __construct($table) { try { //引入配置文件 $config = require('config.php'); //連接MySQL數據庫 $pdo = new PDO('mysql:host='.$config['DB_HOST'].';dbname='.$config['DB_NAME'], $config['DB_USER'], $config['DB_PASS']); //設置UTF8字符編碼 $pdo->query('SET NAMES UTF8'); //保存PDO對象為屬性 $this->pdo = $pdo; //保存數據表名 $this->table = '`'.$table.'`'; } catch (PDOException $e) { //輸出錯誤信息 echo $e->getMessage(); } } //內部自我實例化,靜態方法 public static function mysql($table) { return new self($table); } ///多查詢方法 public function select() { //重組SQL語句 $sql = "SELECT $this->fields FROM $this->table $this->where"; //得到准備對象 $stmt = $this->pdo->prepare($sql); //執行SQL語句 $stmt->execute(); //初始化列表對象 $objects = []; //組裝數據列表 while ($rows = $stmt->fetchObject()) { $objects[] = $rows; } //返回數據對象數組 return $objects; } //所有的where條件都在這里 public function where($param) { //使用指定條件判斷 $key = key($param); $value = current($param); //如果沒有第二下標,則默認= $sign = empty($param[0]) ? '=' : $param[0]; //合並成判斷條件,保存到屬性里去 $this->where = "WHERE (`$key`$sign'$value')"; //返回當前Mysql對象 return $this; } //所有的字段設置都在這里 public function fields($fields) { //給fields 加上`符號 $fields = explode(',', $fields); //將字段數組加上防止沖突的`符號 foreach ($fields as $key=>$value) { $fields[$key] = "`$value`"; } //得到值字符串 $this->fields = implode(',', $fields); //Mysql對象 return $this; } }
調用端1.php使用fields連綴實現多查詢
<?php //引入數據庫類 require 'mysql.php'; //實例化並創建對象 $Mysql = Mysql::mysql('ex_user'); //多選模式 $objects = $Mysql->fields('id,name')->select(); foreach ($objects as $key=>$obj) { echo $obj->name.'<br>'; }
四.Limit連綴
使用limit連綴方式實現多選模式查詢
方法端mysql.php
mysql.php <?php //數據庫類 class Mysql { //將PDO對象保存至屬性 private $pdo; //將表名保存至屬性 private $table; //條件屬性 private $where; //字段屬性 private $fields = '*'; //limit屬性 private $limit; //構造方法,自動PDO連接數據庫 public function __construct($table) { try { //引入配置文件 $config = require('config.php'); //連接MySQL數據庫 $pdo = new PDO('mysql:host='.$config['DB_HOST'].';dbname='.$config['DB_NAME'], $config['DB_USER'], $config['DB_PASS']); //設置UTF8字符編碼 $pdo->query('SET NAMES UTF8'); //保存PDO對象為屬性 $this->pdo = $pdo; //保存數據表名 $this->table = '`'.$table.'`'; } catch (PDOException $e) { //輸出錯誤信息 echo $e->getMessage(); } } //內部自我實例化,靜態方法 public static function mysql($table) { return new self($table); } ///多查詢方法 public function select() { //重組SQL語句 $sql = "SELECT $this->fields FROM $this->table $this->where $this->limit"; //得到准備對象 $stmt = $this->pdo->prepare($sql); //執行SQL語句 $stmt->execute(); //初始化列表對象 $objects = []; //組裝數據列表 while ($rows = $stmt->fetchObject()) { $objects[] = $rows; } //返回數據對象數組 return $objects; } //所有的where條件都在這里 public function where($param) { //使用指定條件判斷 $key = key($param); $value = current($param); //如果沒有第二下標,則默認= $sign = empty($param[0]) ? '=' : $param[0]; //合並成判斷條件,保存到屬性里去 $this->where = "WHERE (`$key`$sign'$value')"; //返回當前Mysql對象 return $this; } //所有的字段設置都在這里 public function fields($fields) { //給fields 加上`符號 $fields = explode(',', $fields); //將字段數組加上防止沖突的`符號 foreach ($fields as $key=>$value) { $fields[$key] = "`$value`"; } //得到值字符串 $this->fields = implode(',', $fields); //Mysql對象 return $this; } //所有的limit 設置都在這里 public function limit($start, $end) { //得到Limit 字符串 $this->limit = "LIMIT $start, $end"; //返回當前Mysql 對象 return $this; } }
調用端1.php使用limit連綴實現多選模式查詢
<?php //引入數據庫類 require 'mysql.php'; //實例化並創建對象 $Mysql = Mysql::mysql('ex_user'); //多選模式 $objects = $Mysql->fields('id,name')->limit(0,3)->select(); foreach ($objects as $key=>$obj) { echo $obj->id.$obj->name.'<br>'; }
五.order功能
使用order功能實現多選模式查詢排序
方法端mysql.php
mysql.php <?php //數據庫類 class Mysql { //將PDO對象保存至屬性 private $pdo; //將表名保存至屬性 private $table; //條件屬性 private $where; //字段屬性 private $fields = '*'; //limit屬性 private $limit; //order屬性 private $order; //構造方法,自動PDO連接數據庫 public function __construct($table) { try { //引入配置文件 $config = require('config.php'); //連接MySQL數據庫 $pdo = new PDO('mysql:host='.$config['DB_HOST'].';dbname='.$config['DB_NAME'], $config['DB_USER'], $config['DB_PASS']); //設置UTF8字符編碼 $pdo->query('SET NAMES UTF8'); //保存PDO對象為屬性 $this->pdo = $pdo; //保存數據表名 $this->table = '`'.$table.'`'; } catch (PDOException $e) { //輸出錯誤信息 echo $e->getMessage(); } } //內部自我實例化,靜態方法 public static function mysql($table) { return new self($table); } ///多查詢方法 public function select() { //重組SQL語句 $sql = "SELECT $this->fields FROM $this->table $this->order $this->where $this->limit"; //得到准備對象 $stmt = $this->pdo->prepare($sql); //執行SQL語句 $stmt->execute(); //初始化列表對象 $objects = []; //組裝數據列表 while ($rows = $stmt->fetchObject()) { $objects[] = $rows; } //返回數據對象數組 return $objects; } //所有的where條件都在這里 public function where($param) { //使用指定條件判斷 $key = key($param); $value = current($param); //如果沒有第二下標,則默認= $sign = empty($param[0]) ? '=' : $param[0]; //合並成判斷條件,保存到屬性里去 $this->where = "WHERE (`$key`$sign'$value')"; //返回當前Mysql對象 return $this; } //所有的字段設置都在這里 public function fields($fields) { //給fields 加上`符號 $fields = explode(',', $fields); //將字段數組加上防止沖突的`符號 foreach ($fields as $key=>$value) { $fields[$key] = "`$value`"; } //得到值字符串 $this->fields = implode(',', $fields); //Mysql對象 return $this; } //所有的limit 設置都在這里 public function limit($start, $end) { //得到Limit 字符串 $this->limit = "LIMIT $start, $end"; //返回當前Mysql 對象 return $this; } //所有的order設置都在這里 public function order($param) { //分割成數組按空格分割,字符和排序關鍵字 $order = explode(' ', $param); //組裝排序SQL $this->order = "ORDER BY `$order[0]` ".strtoupper($order[1]); //返回Mysql對象 return $this; } }
調用端1.php使用order功能實現多選模式查詢排序
<?php //引入數據庫類 require 'mysql.php'; //實例化並創建對象 $Mysql = Mysql::mysql('ex_user'); //多選模式 $objects = $Mysql->fields('id,name')->limit(0,3)->order('id desc')->select(); foreach ($objects as $key=>$obj) { echo $obj->id.$obj->name.'<br>'; }
六.countr功能
使用count功能查詢總共的條數
方法端mysql.php
mysql.php <?php //數據庫類 class Mysql { //將PDO對象保存至屬性 private $pdo; //將表名保存至屬性 private $table; //條件屬性 private $where; //字段屬性 private $fields = '*'; //limit屬性 private $limit; //order屬性 private $order; //count屬性 private $count; //構造方法,自動PDO連接數據庫 public function __construct($table) { try { //引入配置文件 $config = require('config.php'); //連接MySQL數據庫 $pdo = new PDO('mysql:host='.$config['DB_HOST'].';dbname='.$config['DB_NAME'], $config['DB_USER'], $config['DB_PASS']); //設置UTF8字符編碼 $pdo->query('SET NAMES UTF8'); //保存PDO對象為屬性 $this->pdo = $pdo; //保存數據表名 $this->table = '`'.$table.'`'; } catch (PDOException $e) { //輸出錯誤信息 echo $e->getMessage(); } } //內部自我實例化,靜態方法 public static function mysql($table) { return new self($table); } ///多查詢方法 public function select() { //重組SQL語句 $sql = "SELECT $this->fields FROM $this->table $this->order $this->where $this->limit"; //得到准備對象 $stmt = $this->pdo->prepare($sql); //執行SQL語句 $stmt->execute(); //初始化列表對象 $objects = []; //組裝數據列表 while ($rows = $stmt->fetchObject()) { $objects[] = $rows; } //將查詢的記錄數保存到count屬性里 $this->count = $stmt->rowCount(); //返回數據對象數組 return $objects; } //所有的where條件都在這里 public function where($param) { //使用指定條件判斷 $key = key($param); $value = current($param); //如果沒有第二下標,則默認= $sign = empty($param[0]) ? '=' : $param[0]; //合並成判斷條件,保存到屬性里去 $this->where = "WHERE (`$key`$sign'$value')"; //返回當前Mysql對象 return $this; } //所有的字段設置都在這里 public function fields($fields) { //給fields 加上`符號 $fields = explode(',', $fields); //將字段數組加上防止沖突的`符號 foreach ($fields as $key=>$value) { $fields[$key] = "`$value`"; } //得到值字符串 $this->fields = implode(',', $fields); //Mysql對象 return $this; } //所有的limit 設置都在這里 public function limit($start, $end) { //得到Limit 字符串 $this->limit = "LIMIT $start, $end"; //返回當前Mysql 對象 return $this; } //所有的order設置都在這里 public function order($param) { //分割字符和排序關鍵字 $order = explode(' ', $param); //組裝排序SQL $this->order = "ORDER BY `$order[0]` ".strtoupper($order[1]); //返回Mysql對象 return $this; } //返回count public function count() { //返回記錄數 return $this->count; } }
調用端1.php使用count功能打印查詢的條數
<?php //引入數據庫類 require 'mysql.php'; //實例化並創建對象 $Mysql = Mysql::mysql('ex_user'); //多選模式 $objects = $Mysql->fields('id,name')->limit(0,3)->order('id desc')->select(); foreach ($objects as $key=>$obj) { echo $obj->id.$obj->name.'<br>'; } //count打印有幾條 echo $Mysql->count();
數據庫功能類-原生方式
1.由於功能的學習成本或是更復雜的無法實現,可以直接提供給開發者原生使用的入口。
方法端mysql.php生成原生方式
<?php //數據庫類 class Mysql { //將PDO對象保存至屬性 private $pdo; //將表名保存至屬性 private $table; //條件屬性 private $where; //字段屬性 private $fields = '*'; //limit屬性 private $limit; //order屬性 private $order; //count屬性 private $count; //構造方法,自動PDO連接數據庫 public function __construct($table) { try { //引入配置文件 $config = require('config.php'); //連接MySQL數據庫 $pdo = new PDO('mysql:host=' . $config['DB_HOST'] . ';dbname=' . $config['DB_NAME'], $config['DB_USER'], $config['DB_PASS']); //設置UTF8字符編碼 $pdo->query('SET NAMES UTF8'); //保存PDO對象為屬性 $this->pdo = $pdo; //保存數據表名 $this->table = '`' . $table . '`'; } catch (PDOException $e) { //輸出錯誤信息 echo $e->getMessage(); } } //內部自我實例化,靜態方法 public static function getMysql($table = '') { return new self($table); } //原生執行SQL 語句,返回准備對象 public function query($sql) { //得到准備語句 $stmt = $this->pdo->prepare($sql); //執行SQL語句 $stmt->execute(); //返回准備對象 return $stmt; } //還可以返回PDO 對象,用於原生時的一些操作 public function getPdo() { //返回PDO對象 return $this->pdo; } //數據庫新增操作 public function add($data) { //得到字段數組 $keys = array_keys($data); //將字段數組加上防止沖突的`符號 foreach ($keys as $key => $value) { $keys[$key] = '`' . $value . '`'; } //得到字段字符串 $fields = implode(',', $keys); //給值字符串加上單引號 foreach ($data as $key => $value) { $data[$key] = "'" . $value . "'"; } //得到值字符串 $values = implode(',', $data); //重組SQL語句 $sql = "INSERT INTO $this->table ($fields) VALUES ($values)"; //執行SQL語句 $this->pdo->prepare($sql)->execute(); //返回最新的ID值 return $this->pdo->lastInsertId(); } //數據庫修改操作 public function update($data) { //修改字符串 $update = ''; //得到剔除id 索引的數組 unset($data['id']); //將字段數組加上防止沖突的`符號 foreach ($data as $key => $value) { $update .= "`$key`='$value',"; } //去掉最后的逗號 $update = substr($update, 0, -1); //重組SQL語句 $sql = "UPDATE $this->table SET $update $this->where"; echo $sql; //得到准備語句 $stmt = $this->pdo->prepare($sql); //執行SQL語句 $stmt->execute(); //返回影響行數 return $stmt->rowCount(); } //數據庫刪除操作 public function delete() { //重組SQL $sql = "DELETE FROM $this->table $this->where"; //得到准備語句 $stmt = $this->pdo->prepare($sql); //執行SQL語句 $stmt->execute(); //返回影響行數 return $stmt->rowCount(); } //單一查詢方法 public function find() { //重組SQL語句 $sql = "SELECT $this->fields FROM $this->table $this->where LIMIT 1"; //得到准備對象 $stmt = $this->pdo->prepare($sql); //執行SQL語句 $stmt->execute(); //返回單一數據 return $stmt->fetchObject(); } //多查詢方法 public function select() { //重組SQL語句 $sql = "SELECT $this->fields FROM $this->table $this->order $this->where $this->limit"; //得到准備對象 $stmt = $this->pdo->prepare($sql); //執行SQL語句 $stmt->execute(); //初始化列表對象 $objects = []; //組裝數據列表 while ($rows = $stmt->fetchObject()) { $objects[] = $rows; } //將查詢的記錄數保存到count屬性里 $this->count = $stmt->rowCount(); //返回數據對象數組 return $objects; } //所有的where 條件都在這里 public function where($param) { //使用指定條件判斷 $key = key($param); $value = current($param); //如果沒有第二下標,則默認= $sign = empty($param[0]) ? '=' : $param[0]; //合並成判斷條件,保存到屬性里去 $this->where = "WHERE (`$key`$sign'$value')"; //返回當前Mysql對象 return $this; } //所有的字段設置都在這里 public function fields($fields) { //給fields 加上`符號 $fields = explode(',', $fields); //將字段數組加上防止沖突的`符號 foreach ($fields as $key => $value) { $fields[$key] = "`$value`"; } //得到值字符串 $this->fields = implode(',', $fields); //Mysql對象 return $this; } //所有的limit 設置都在這里 public function limit($start, $end) { //得到Limit 字符串 $this->limit = "LIMIT $start, $end"; //返回當前Mysql 對象 return $this; } //所有的order設置都在這里 public function order($param) { //分割字符和排序關鍵字 $order = explode(' ', $param); //組裝排序SQL $this->order = "ORDER BY `$order[0]` ".strtoupper($order[1]); //返回Mysql對象 return $this; } //返回count public function count() { //返回記錄數 return $this->count; } }
調用端2.php通過原生方式實現增刪改查
<?php //引入數據庫類 require 'mysql.php'; //實例化並創建對象 $Mysql = Mysql::getMysql(); //原生刪除 $stmt = $Mysql->query('DELETE FROM ex_user WHERE id=2'); echo $stmt->rowCount(); //原生修改 $stmt = $Mysql->query("UPDATE ex_user SET name='西西' WHERE id=1"); echo $stmt->rowCount(); //原生新增 $stmt = $Mysql->query("INSERT INTO ex_user (name,age,create_time) VALUES ('小西西', 17, NOW())"); echo $stmt->rowCount(); echo $Mysql->getPdo()->lastInsertId(); //原生查詢 $stmt = $Mysql->query("SELECT id,name,age FROM ex_user"); print_r($stmt->fetchObject());