PHP 筆記——PDO操作數據庫
一、簡介
? PHP 5.1可使用輕量級的統一接口 PDO(PHP Data Object,PHP數據對象)來訪問各種常見的數據庫。而使用PDO只需要指定不同的 DSN(數據源名稱)即可訪問不同的數據庫。
二、PDO開啟
在Windows中要使用PHP訪問MySQL數據庫,首先需要在php.ini文件中啟用設置:
? extension=php_pdo.dll:啟用PDO擴展庫。
? extension=php_pdo_mysql.dll:啟用MySQL擴展庫。
三、PDO對象初始化
連接服務器:
<?php header("Content-Type: text/html; charset=utf-8"); $dbms = 'mysql'; // 指定連接的數據庫驅動名稱 $dbname = 'test'; // 指定要連接的數據庫 $username = 'root'; // 指定連接使用的用戶名稱 $passwd = 'root'; // 指定連接用戶的密碼 $host = 'localhost:3306'; // 指定 MySQL 服務器名稱,註意端口號 $dsn = "$dbms:host=$host;dbname=$dbname"; // 構造 DSN,$dbms 後是冒號,其它參數間是分號 try { $pdo = new PDO($dsn, $username, $passwd); echo "使用 PDO 成功連接至 MySQL 服務器<br>"; } catch (PDOException $exc) { echo "Could not connect to the database<br/>".$exc->getMessage(); } print_r($pdo); ?>
創建、刪除數據庫:
<?php header("Content-Type: text/html; charset=utf-8"); $dbms = 'mysql'; $username = 'root'; $passwd = 'root'; $host = 'localhost:3306'; $dsn = "$dbms:host=$host"; // 連接到服務器創建和刪除數據庫,所以不需要指定連接的數據庫 try { $pdo = new PDO($dsn, $username, $passwd); echo "使用 PDO 成功連接至 MySQL 服務器<br>"; $n = $pdo->exec('create database testdb'); echo "$n 成功創建數據庫<br>"; $n = $pdo->exec('drop database testdb'); echo "$n 成功刪除數據庫<br>"; } catch (PDOException $exc) { echo "數據庫連接失敗!".$exc->getMessage(); } ?>
四、PDO對象應用
pdo對象成員方法:
query($sql); // 用於執行查詢SQL語句。返回PDOStatement對象
exec($sql); // 用於執行增、刪、改操作,返回影響行數
setAttribute(); // 設置一個“數據庫連接對象”屬性
fetchAll(); // 解析數據
記錄查詢:
(1)使用query()方法執行查詢
$sql = "SELECT * FROM stu";
$stmt = $pdo->query($sql);
ps:
query()方法參數為一個查詢字符串,查詢執行成功返回包含查詢結果集的PDOStatement對象,若失敗則返回FALSE。
若查詢結果集中記錄沒有讀取完,試圖再次執行query()方法將會出錯。此
時,可在再次執行query()方法前,調用PDOStatement的closeCursor()方法釋
放PDOStatement對象關聯的數據庫資源。
(2)使用預處理查詢
- 實現SQL語句的預處理
- 首先需要預處理一個待執行的SQL語句模板
- 然後為該模板進行參數綁定
- 最後將用戶提交的數據內容發送給MySQL執行,完成預處理的執行
如果一個查詢需要多次執行,則可使用PDO對象的 prepare() 方法預先提交查詢,服務器準備一個預處理查詢語句。然後可多次調用PDOStatement對象的execute()方法執行查詢。
$stmt = $pdo->prepare($sql);
查詢執行成功返回包含查詢結果集的PDOStatement對象,若失敗則返回FALSE。
$sql = "SELECT * FROM users";
$stmt = $pdo->prepare($sql);
// 準備好語句後,調用execute()方法執行查詢
$b = $stmt->execute();
var_dump($b);
(3)使用帶參數的預處理查詢
在預處理查詢過程中可對其參數進行設置,分別是使用問號參數、使用命名參數和將參數綁定到變量(:參數名,以冒號開始的參數名)3種方式設置參數。
① 使用問號參數
$stmt = $pdo->prepare("SELECT * FROM users WHERE id>? and data LIKE ?");
$b = $stmt->execute(array(2,"php%"));
var_dump($b);
② 使用命名參數
$stmt = $pdo->prepare("SELECT * FROM users WHERE id>:id and data LIKE :filter");
$b = $stmt->execute(array(':id'=>2,':filter'=>"C%"));
var_dump($b);
③ 將參數綁定到變量
可以將參數綁定到變量,變量的值作為參數值。
如果參數不是命名參數,在綁定時,可使用1開始的整數表示對應參數。
處理查詢結果集
? 不管用query()方法還是execute()方法執行查詢操作,查詢結果都保存在PDOStatement對象中。可用PDOStatement對象的fetch()、fetchAll()或fetchColumn()方法從查詢結果中集中讀取數據。
(1)使用fetch()方法讀取查詢結果
fetch()方法返回一個包含查詢結果集下一條記錄的數據,已無記錄時返回
FALSE。其基本格式為:
$row = $stmt->fetch($fetch_style);
參數 $fetch_style:
PDO::FETCH_NUM:用0開始的整數作為數組元素下標。
PDO::FETCH_ASSOC:用列名作為數組元素下標。
PDO::FETCH_BOTH:默認值,既有整數下標,也有列名下標。
執行:
foreach ( $stmt as $row ){
echo $row['Name']."<br>";
}
while($row = $stmt->fetch()){
echo $row['Name']."<br>";
}
(2)使用fetchAll()方法讀取查詢結果
fetchAll()方法指返回查詢結果集中剩余的全部記錄到一個二維數組,無
記錄時返回FALSE。其基本格式為:
$rows = $stmt->fetchAll($fetch_style);
執行:
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
print_r($rows);
(3)fetchColumn()方法讀取查詢結果
fetchColumn()方法返回查詢結果集下一條記錄中指定列的值,已無記
錄時返回FALSE。其基本格式為:
$a = $stmt->fetchColumn($n);
$a = $stmt->fetchColumn(); // 獲取下條記錄的第1列
$a = $stmt->fetchColumn(1); // 獲取下條記錄的第2列
五、幾個例子
例一
<?php
header("Content-Type: text/html; charset=utf-8");
$dbms = 'mysql';
$dbname = 'db_employee';
$username = 'root';
$passwd = 'root';
$host = 'localhost:3306';
$dsn = "$dbms:host=$host;dbname=$dbname";
try {
$pdo = new PDO($dsn, $username, $passwd);
echo "使用 PDO 成功連接至 MySQL 服務器<br>";
} catch (PDOException $exc) {
echo "數據庫連接失敗!".$exc->getMessage();
}
$sql = 'SELECT * FROM tb_employee';
$stmt = $pdo->query($sql);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
print_r($rows);
?>
例二
<?php
header("Content-Type: text/html; charset=utf-8");
$dbms = 'mysql';
$dbname = 'db_employee';
$username = 'root';
$passwd = 'root';
$host = 'localhost:3306';
$dsn = "$dbms:host=$host;dbname=$dbname";
try {
$pdo = new PDO($dsn, $username, $passwd);
echo "使用 PDO 成功連接至 MySQL 服務器<br>";
} catch (PDOException $exc) {
echo "數據庫連接失敗!".$exc->getMessage();
}
$sql = 'SELECT * FROM tb_employee';
$stmt = $pdo->query($sql);
foreach ( $stmt as $row ){
echo $row['Name']."<br>";
}
?>
例三
<?php
header("Content-Type: text/html; charset=utf-8");
$dbms = 'mysql';
$dbname = 'db_employee';
$username = 'root';
$passwd = 'root';
$host = 'localhost:3306';
$dsn = "$dbms:host=$host;dbname=$dbname";
try {
$pdo = new PDO($dsn, $username, $passwd);
echo "使用 PDO 成功連接至 MySQL 服務器<br>";
} catch (PDOException $exc) {
echo "數據庫連接失敗!".$exc->getMessage();
}
$sql = 'SELECT * FROM tb_employee';
$stmt = $pdo->query($sql);
while($row = $stmt->fetch()){
echo $row['Name']."<br>";
}
?>
例四
<?php
header("Content-Type: text/html; charset=utf-8");
$dbms = 'mysql';
$dbname = 'db_employee';
$username = 'root';
$passwd = 'root';
$host = 'localhost:3306';
$dsn = "$dbms:host=$host;dbname=$dbname";
try {
$pdo = new PDO($dsn, $username, $passwd);
echo "使用 PDO 成功連接至 MySQL 服務器<br>";
} catch (PDOException $exc) {
echo "數據庫連接失敗!".$exc->getMessage();
}
$sql = 'SELECT * FROM tb_employee';
$stmt = $pdo->prepare($sql);
$b = $stmt->execute();
while($row = $stmt->fetch()){
echo $row['Name']."<br>";
}
?>
PHP 筆記——PDO操作數據庫