下面來說一下PDO
先畫一張圖來了解一下
mysqli是針對mysql這個數據庫擴展的一個類
PDO是為了能訪問更多數據庫
如果出現程序需要訪問其他數據庫的話就可以用PDO來做
PDO
數據訪問抽象層
1、操作其他數據庫
2、事務功能
3、防止SQL注入攻擊
用PDO來舉個例子
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>無標題文檔</title> </head> <body> <?php //1、操作其他數據庫 //2、事務功能 //3、防止SQL注入攻擊 //造PDO對象 $dsn = "mysql:dbname=shuang;host=localhost"; //數據源 $pdo = new PDO($dsn,"root","726");//需要三個參數 //寫SQL語句 $sql = "select * from nation"; //執行 $attr = $pdo->query($sql); $arr = $attr->fetch(PDO::FETCH_ASSOC); //這里的參數不需要單引號雙引號 var_dump($arr); ?> </body> </html>
調用一下fetch里面的參數為 PDO::FETCH_ASSOC
輸出一下attr
輸出的是一個關聯數組
把里面參數ASSOC換為NUM,輸出:
輸出為索引的
如果參數ASSOC改為 BOTH,輸出:
則關聯和索引都有
改為fetchALL(PDO::FETCH_BOTH)也可以,它是把所有數據都可以查到
用PDO來做個添加語句試試看
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>無標題文檔</title> </head> <body> <?php //1、操作其他數據庫 //2、事務功能 //3、防止SQL注入攻擊 //造PDO對象 $dsn = "mysql:dbname=shuang;host=localhost"; //數據源 $pdo = new PDO($dsn,"root","726");//需要三個參數 //寫SQL語句 //$sql = "select * from nation"; $sql = "insert into nation values('n076','數據')"; //添加語句 //執行 $a = $pdo->query($sql); var_dump($a); //$arr = $attr->fetchALL(PDO::FETCH_BOTH); //這里的參數不需要單引號雙引號 //var_dump($arr); ?> </body> </html>
運行試試看:
再看一下,數據庫內,有沒有添加上數據
添加成功
PDO中除了用query方法,還可以用一種
exec 方法
運行后看看效果
顯示了一個1,證明影響了1行數據
再看看數據庫
077已添加進去
如果失敗了,運行后會顯示0
query方法一般是用來執行查詢
exec是用來執行其他語句
它的第一個功能就講完了
接下來說一下第2種事務功能
運行一下,078讓它添加,077重復,肯定添加不進去
查看一下數據庫:
078在里面,077主鍵相同不能被添加
在下面加個事務功能
開啟事務和提交是對應的,有開啟就一定有提交,回滾,是讓它回滾到原來的位置
如果添加的話,按理說079可以添加上,077重復,不可以添加,但是加了事務功能后,要么一起成功,要么一起失敗,看一下運行后的數據庫
079和077的內容都沒有被添加上
把重復的077改成080,運行后,看一下數據庫內的數據
添加成功!
再來看一下它最后一個功能
還是用nation表來做
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>無標題文檔</title> </head> <body> <?php //預處理語句防止SQL注入 $dsn = "mysql:dbname=shuang;host=localhost"; $pdo = new PDO($dsn,"root","726"); $code = "n001"; //SQL語句里面需要加占位符? $sql = "select * from nation where code=?"; //準備執行。返回PDOStatement對象 $st = $pdo->prepare($sql); //調用綁定參數的方法來綁定參數 $st->bindParam(1,$code); $st->execute(); $attr = $st->fetchAll(); var_dump($attr); ?> </body> </html>
運行后,查到了結果
使用的是分兩次來發送到服務器,就不會出現注入攻擊了
再做一個添加語句
運行后,再看一下數據庫,是否添加成功了
測試1 在數據庫內,證明運行成功了
但是考慮到,數據很多的情況下,用上述方法會很麻煩,所以還有一種簡單方法
用數組的方式來做,只是索引數組
運行后,來看一下有沒有把數據添加到數據庫
測試2 在數據庫內,運行成功
除了用問號占位符,還可以用字符串占位符
來看一下用字符串占位符怎么做
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>無標題文檔</title> </head> <body> <?php $dsn = "mysql:dbname=shuang;host=localhost"; $pdo = new PDO($dsn,"root","726"); //占位符是字符串 $sql = "insert into nation values(:code,:name) "; $st = $pdo->prepare($sql); $st->bindParam(":code",$code,PDO::PARAM_STR); $st->bindParam(":name",$name,PDO::PARAM_STR); $code = "n009"; $name = "測試3"; $st->execute(); ?> </body> </html>
看看數據庫內,有沒有加上這條數據
測試3已成功添加
證明用字符串占位符也是可以的
如果調用bindParam方法,就要寫參數,這種方法有點麻煩,它還有簡便的方法,還可以使用數組的方式
不過這里使用的數組和上面使用的數組就不一樣了,上面使用的是索引數組,這里使用的是關聯數組
來看一下代碼部分怎么寫
比剛才的方式簡便了許多,array里面的要和sql語句里面的值相對應,來看一下數據庫內有沒有添加上
測試4,添加成功
看了這么多測試,可能會有人問了,Mysqli和PDO到底使用哪種方式簡單
下面來舉個例子吧
做個添加的例子
重要的是它的處理頁面
只需要五行代碼就可以,來實驗一下
看一下數據庫內
測試5添加成功!
我們想一下,之前使用的Mysqli的方式,還需要取數據,好幾行數據的話,還需要取好幾個數據
這種方式就是一次性的都過來,這種方式還可以防止注入攻擊
說一下防止注入攻擊的原理
先把SQL語句外面這些東西發到服務器等待執行,分第二次發送,它的值,來判斷code是否等于它。
之前那種方式是把好幾個變量拼在一起去執行,那樣的話可以讓人篡改我們的SQL語句
PDO的這種方式并不能篡改,無論扔什么值都會判斷是否相等
不含病毒。www.avast.com |
留言列表