?喜歡請點個贊吧?
PDO與Mysqli的區(qū)別
PHP 5 及以上版本建議使用以下方式連接 MySQL :
MySQLi extension?("i" 意為 improved)
PDO (PHP Data Objects)
PDO 應用在 12 種不同數(shù)據(jù)庫中, MySQLi 只針對 MySQL 數(shù)據(jù)庫。
二者都支持預處理語句,可防止SQL注入。
PDO連接Mysql數(shù)據(jù)庫
代碼示例:
<?php
$servername = "localhost";
$username = "username";
$password = "password";
try {? ?
$pdo = new PDO("mysql:host=$servername;", $username, $password);//連接數(shù)據(jù)庫并創(chuàng)建PDO對象?
? ? echo "連接成功";
}
catch(PDOException $e)
{? ?
echo $e->getMessage();//捕獲異常并處理
}
?>
PDO的數(shù)據(jù)源 dsn:
連接一個數(shù)據(jù)庫最重要的四個參數(shù):數(shù)據(jù)庫地址、數(shù)據(jù)庫名稱、用戶名、密碼
由于pdo支持多種類型的數(shù)據(jù)庫,因此我們將數(shù)據(jù)庫類型、地址、名稱封裝在數(shù)據(jù)源dsn中
$dsn="{數(shù)據(jù)庫類型}:host={數(shù)據(jù)庫地址};dbname={數(shù)據(jù)庫名稱}";
連接數(shù)據(jù)庫并創(chuàng)建PDO對象:
?new PDO(數(shù)據(jù)源, 用戶名,密碼);
使用PDO 增刪改數(shù)據(jù)
$sql="INSERT INTO 表名稱 VALUES (值1, 值2,....)";
$num=$pdo -> exec($sql);//使用exec語句執(zhí)行SQL語句,返回受影響的行數(shù)。
$insertId=$pdo ->lastInsertId();?//PDO::lastInsertId — 返回最后插入行的ID或序列值
if($number>0){
? ? print'成功添加了’ .$num.'條記錄,新增主鍵id是:'.$insertId;
}
使用PDO查詢數(shù)據(jù)
使用PDO::query()獲取結(jié)果集;
查詢結(jié)果放在PDOStatement對象中;
查詢單條記錄:$result->fetch()
獲取所有記錄:$result->fetchAll()
直接遍歷結(jié)果集:foreach($result as $row){ }
將結(jié)果集映射到對象再遍歷:類名與表名一致,屬性與字段名一致,通過? _get() 魔術(shù)方法實現(xiàn)查詢
fetch查詢單條記錄
setFetchMode(PDO::FETCH_ASSOC) 讀取模式: 從結(jié)果集中獲取以列名為索引的關(guān)聯(lián)數(shù)組
PDOStatement::fetch()解析結(jié)果集
PDOStatement類中的fetch()方法可以將結(jié)果集中當前的記錄以某種方式返回,并將結(jié)果集指針移至下一行,當?shù)竭_結(jié)果集末尾時返回FALSE
$sql="SELECT 列名稱 FROM 表名稱"
$result=$pdo->query($sql);
if($result && $result->rowCount()){
? ? $result->setFetchMode(PDO::FETCH_ASSOC);
? ? $row = $result->fetch();
????echo'$row['字段名1']';
? ??echo'$row['字段名2']';
? ? }
fetchAll 查詢?nèi)坑涗?/h2>
fetchAll()方法與上一個方法fetch()類似,但是該方法只需要調(diào)用一次就可以獲取結(jié)果集中的所有行,并賦給返回的數(shù)組(二維)
$result->setFetchMode(PDO::FETCH_ASSOC);
$rows=$result->fetchAll();//將結(jié)果集轉(zhuǎn)為二維數(shù)組
foreach ($rows as $row){
????echo'$row['字段名1']';
????echo'$row['字段名2']';? ?
}??
也可跳過fetch解析,直接操作結(jié)果集
$result->setFetchMode(PDO::FETCH_ASSOC);?
$foreach ($result as $row){?
}
使用模型映射的方式處理結(jié)果集
PDO::FETCH_CLASS?返回一個請求類的新實例,映射結(jié)果集中的列名到類中對應的屬性名
class student
{
? ? private $name;
? ? private $id;
? ? ? ? public function __get($propertyName)
{????
? ? return $this -> $propertyName ;
}
}
$result->setFetchMode(PDO::FETCH_CLASS,’student');?
PDO預處理語句
將靜態(tài)SQL語句與動態(tài)數(shù)據(jù)分離,在SQL語句中使用占位符"?"或":字段名"
PDO::prepare()準備預處理語句;
execute([真實替換數(shù)據(jù)])執(zhí)行預處理語句
占位符":字段名"
$sql="SELECT 字段名1=:字段名1, 字段名2=:字段名2? FROM 表名稱";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(":字段名1", $value1);
$stmt->bindParam("?:字段名2?", $value2);?
//給變量賦值
$stmt->execute();
占位符"?"
$sql=?"SELECT ?, ?? FROM 表名稱";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(1, $value1);
$stmt->bindParam(2, $value2);?
//給變量賦值
$stmt->execute();