close
文章出處

下面來說一下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
arrow
arrow
    全站熱搜

    AutoPoster 發表在 痞客邦 留言(0) 人氣()