#14.PDO方式連接MySQL數據庫
采用的是PDO的方式進行封裝,PDO是PHP中的一個擴展庫,他是一個純面向對象的,好處就是提供了一個可以連接各種數據庫的接口,另外PDO中的prepare預處理的方式可以大大減少sql語句的注入機器相關的安全性。
和其他框架一樣,我們將關于數據庫信息寫入一個配置文件中。
```cpp
|-config 配置
| |-constants.php 項目常量文件
<?php
/**
* 項目常量文件
* User: find35.com
* Date: 15/12/30
* Time: 下午8:49
*/
define('HOST','localhost');//服務器地址
define('UNAME','root');//數據庫賬號
define('UPASS','');//數據庫密碼
define('DBNAME','test');//操作的數據庫名
```
之后我們在前臺入口文件引入這個文件。然后我們在model.class.php類中封裝一個方法來連接數據庫。
```cpp
|-core 框架核心目錄
| |-Model.class.php 數據庫操作類 業務邏輯層
<?php
/**
* 數據庫操作類
* User: find35.com
* Date: 15/12/27
* Time: 下午4:52
*/
class Model
{
protected static $_instance;
protected static $_link;
/**
* 單例模式 不允許在類外對類進行實例化
*/
private function __construct(){}
/**
* 獲得類的實例
* @return mixed|Model
*/
public static function getStringleton(){
//判斷我們類的實例是否存在,沒有則創建之
if(!isset(self::$_instance)){
self::$_instance = new self();
}
//連接數據庫
self::connect(HOST,UNAME,UPASS,DBNAME);
return self::$_instance;
}
/**
* 連接數據庫方法
* @param $host 服務器地址
* @param $username 數據庫賬號
* @param $userpass 數據庫密碼
* @param $dbname 操作的數據庫名
*/
protected static function connect($host,$username,$userpass,$dbname){
try{
self::$_link = new PDO("mysql:host={$host};dbname={$dbname}",$username,$userpass);
if(self::$_link){
echo '連接數據庫成功';
}
}catch (PDOException $e){
MyException::showError($e->getMessage());
}
}
}
```
我們把自定義的異常報錯類的showerror方法設置為static屬性,此處不貼代碼了
然后我們在入口文件調用下,看看是否可以
```cpp
|-index.php 項目前臺入口文件,單一入口
<?php
/**
* 項目前臺入口文件
* User: find35.com
* Date: 15/12/24
* Time: 下午5:15
*/
echo "<meta charset='utf-8'>";
require_once 'core/App.class.php';
require_once 'config/constants.php';
//注冊一個
define('APP','app');
spl_autoload_register(array('App','myAutoloader'));
try{
App::run();
}catch(MyException $e){
$e->showError($e->getMessage());
}
$db = Model::getSingleton();
```
瀏覽器中輸入
```cpp
http://localhost/php_mvc
```
返回如下,則表示成功
```cpp
前臺首頁連接數據庫成功
```
#15.MODEL層CURD的實現
首先我們在test庫中先建立數據庫表users
```cpp
CREATE TABLE users (
`id` INT(10) AUTO_INCREMENT ,
`username` VARCHAR(255) ,
`userpass` VARCHAR(255) ,
`create_time` INT(10),PRIMARY KEY (id));
INSERT INTO users (username,userpass,create_time) VALUES
('zhang','e10adc3949ba59abbe56e057f20f883e',1451515405),
('zhang2','e10adc3949ba59abbe56e057f20f883e',1451515406),
('zhang3','e10adc3949ba59abbe56e057f20f883e',1451515407),
('zhang4','e10adc3949ba59abbe56e057f20f883e',1451515408),
('zhang5','e10adc3949ba59abbe56e057f20f883e',1451515409);
```
這里是使用預處理語言來查詢數據庫,注意設置數據返回類型,數據如何進行報錯。MODEL的CURD來了。
```cpp
|-core 框架核心目錄
| |-Model.class.php 數據庫操作類 業務邏輯層
<?php
/**
* 數據庫操作類
* User: find35.com
* Date: 15/12/27
* Time: 下午4:52
*/
class Model
{
protected static $_instance;
protected static $_link;
protected $whereStr = '';//用來存儲where條件
/**
* 單例模式 不允許在類外對類進行實例化
*/
private function __construct(){}
/**
* 獲得類的實例
* @return mixed|Model
*/
public static function getStringleton(){
//判斷我們類的實例是否存在,沒有則創建之
if(!isset(self::$_instance)){
self::$_instance = new self();
}
//連接數據庫
self::connect(HOST,UNAME,UPASS,DBNAME);
return self::$_instance;
}
/**
* 連接數據庫方法
* @param $host 服務器地址
* @param $username 數據庫賬號
* @param $userpass 數據庫密碼
* @param $dbname 操作的數據庫名
*/
protected static function connect($host,$username,$userpass,$dbname){
try{
self::$_link = new PDO("mysql:host={$host};dbname={$dbname}",$username,$userpass);
//設置返回數據的類型
self::$_link->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
//設置操作數據庫的報錯模式
// self::$_link->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
// if(self::$_link){
// echo '連接數據庫成功';
// }
}catch (PDOException $e){
MyException::showError($e->getMessage());
}
}
/**
* 直接執行sql語句查詢數據庫的方法
* @param $sql mysql語句
* @param array $where 條件數據
* @return mixed 成功數組
*/
public function queryString($sql,$where=array()){
try{
//使用預處理語句來執行sql
$stmt = self::$_link->prepare($sql);
//判斷是否有條件數組
if(empty($where)){
$stmt->execute();
}else{
$stmt->execute($where);
}
//判斷執行是否成功
if($stmt->rowCount() > 0){
return $stmt->fetchAll();
}else {
//得到錯誤信息
$err = $stmt->errorInfo();
throw new PDOException($err[2]);
}
}catch(PDOException $e){
MyException::showError($e->getMessage());
}
}
/**
* 內部sql處理好的查詢方法
* @param $table 表名
* @param array $where 查詢條件
* @return mixed 成功返回數組
*/
public function select($table,$where = array()){
$sql = "select * from {$table} ";
if(!empty($this->whereStr)){
$sql .= $this->whereStr;
}
try{
//執行sql語句
$stmt = self::$_link->prepare($sql);
if(empty($where)){
$stmt->execute();
}else{
$stmt->execute($where);
}
//判斷是否成功,如果不成功爆出異常
if($stmt->rowCount() > 0){
return $stmt->fetchAll();
}else{
$err = $stmt->errorInfo();
return $err[2];
}
}catch(PDOException $e){
MyException::showError($e->getMessage());
}
}
/**
* where條件方法
* @param string $whereStr
* @return $this
*/
public function where($whereStr = ''){
$this->whereStr = $whereStr;
return $this;//返回當前對象
}
/**
* 查詢單條數據的方法
* @param $table 表名
* @param array $where 查詢的條件,:key=value
* @return mixed 成功返回數組
*/
public function find($table,$where = array()){
$sql = "select * from {$table} ";
if(!empty($this->whereStr)){
$sql .= $this->whereStr;
}
try{
//執行sql
$stmt = self::$_link->prepare($sql);
if(empty($where)){
$stmt->execute();
}else{
$stmt->execute($where);
}
//判斷是否成功
if($stmt->rowCount() > 0){
$result = $stmt->fetchAll();
return $result[0];
}else{
$err = $stmt->errorInfo();
throw new PDOException($err[2]);
}
}catch(PDOException $e){
MyException::showError($e->getMessage());
}
}
/**
* 添加單條數據的方法
* @param $table 表名
* @param array(':username'=>'zhang6',':userpass'=>md5(123456),':create_time'=>time()) $data
* @return int 成功返回1
*/
public function insert($table,array $data){
$sql = "insert into {$table} ";
$fields = "";
$values = "";
foreach($data as $k => $v){
$fields .= ltrim($k,":").",";
$values .= "'".ltrim($v,":")."',";
}
$sql .= "(".rtrim($fields,",").") values (".rtrim($values,",").")";
try{
//開啟事務
self::$_link->beginTransaction();
$stmt = self::$_link->prepare($sql);
$stmt->execute($data);
if($stmt->rowCount() > 0){
self::$_link->commit();
return 1;
}else{
self::$_link->rollback();
$err = $stmt->errorInfo();
throw new PDOException($err[2]);
}
}catch(PDOException $e){
MyException::showError($e->getMessage());
}
}
/**
* 更新數據
* @param $table 表名
* @param array $data array(':username'=>'lisi',':userpass'=>md5(456789));
* @param array $where array(':id'=>9);
* @return int
*/
public function update($table,array $data,array $where){
$sql = "update {$table} set ";
$set_str = '';
foreach($data as $k => $v){
$set_str .= ltrim($k,":")."=$k,";
}
$sql .= rtrim($set_str,',').' '.$this->whereStr;
try{
self::$_link->beginTransaction();
$stmt = self::$_link->prepare($sql);
$data2 = array_merge($data,$where);
$stmt->execute($data2);
if($stmt->rowCount() > 0){
self::$_link->commit();
return 1;
}else{
self::$_link->rollback();
$err = $stmt->errorInfo();
throw new PDOException($err[2]);
}
}catch(PDOException $e){
MyException::showError($e->getMessage());
}
}
/**
* 刪除數據方法
* @param $table 表名
* @param array $where
* @return int
*/
public function delete($table,array $where){
$sql = "delete from {$table} ".$this->whereStr;
try{
self::$_link->beginTransaction();
$stmt = self::$_link->prepare($sql);
$stmt->execute($where);
if($stmt->rowCount() > 0){
self::$_link->commit();
return 1;
}else{
self::$_link->rollback();
$err = $stmt->errorInfo();
throw new PDOException($err[2]);
}
}catch(PDOException $e){
MyException::showError($e->getMessage());
}
}
/**
* 析構方法
* 銷毀對象
*/
public function __destruct(){
self::$_link = null;
}
}
```
然后我們開始進行測試
```cpp
|-index.php 項目前臺入口文件,單一入口
<?php
/**
* 項目前臺入口文件
* User: find35.com
* Date: 15/12/24
* Time: 下午5:15
*/
echo "<meta charset='utf-8'>";
require_once 'core/App.class.php';
require_once 'config/constants.php';
//注冊一個
define('APP','app');
spl_autoload_register(array('App','myAutoloader'));
try{
App::run();
}catch(MyException $e){
$e->showError($e->getMessage());
}
$db = Model::getStringleton();
//直接執行sql語句
//$result = $db->queryString('select * from users where username=:username',array(':username'=>'zhang'));
//查詢某個表
//$result = $db->select('users');
//查詢某個表,并增加where條件
//$result = $db->where('where username=:username')->select('users',array(':username'=>'zhang'));
//查詢單條數據
//$result = $db->where('where id=:id')->find('users',array(':id'=>'3'));
//插入數據
//$data = array(':username'=>'zhang6',':userpass'=>md5(123456),':create_time2'=>time());
//$result = $db->insert('users',$data);
//更新數據
//$data = array(':username'=>'lisi',':userpass'=>md5(456789));
//$where = array(':id'=>9);
//$result = $db->where('where id=:id')->update('users',$data,$where);
//刪除數據
$result = $db->where('where id=:id')->delete('users',array('id'=>9));
echo "<pre>";
print_r($result);
```
如果結果都是1,那么表示都成功了。
如果能夠看到這里,那么一個簡單版的mvc框架已經完成。感謝收看