1. 程式人生 > >PHP 筆記——PDO操作數據庫

PHP 筆記——PDO操作數據庫

sta attr creat com 查詢語句 bubuko 查詢 行數 ron

一、簡介

? 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:

  1. query()方法參數為一個查詢字符串,查詢執行成功返回包含查詢結果集的PDOStatement對象,若失敗則返回FALSE。

  2. 若查詢結果集中記錄沒有讀取完,試圖再次執行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操作數據庫