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 的頭像
    AutoPoster

    互聯網 - 大數據

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