PHP - PDO Extension: A Beginner's Guide

你好,有抱負的程序员!今天,我們將踏上一段令人興奮的旅程,進入PHP及其強大的PDO擴展的世界。別擔心,如果你以前從未寫過一行代碼 - 我會成為你的友好導遊,逐步拆解一切。那麼,來一杯咖啡,我們一起來看看吧!

PHP - PDO Extension

What is PDO?

PDO 的全稱是 PHP Data Objects。它就像一個萬能翻譯器,幫助PHP與不同類型的數據庫進行對話。想像一下你試圖與來自不同國家的人交流 - PDO 就是你的多語言朋友,能夠與他們所有人交談!

Why Use PDO?

你可能會想,“我為什麼要在乎PDO?”讓我給你講一個小故事。當我第一次開始教PHP的時候,我們對於每種數據庫類型都使用不同的方法。這就像每次切换數據庫時都要學習一種新語言。PDO 改變了這一切。它提供了一種一致的方法來與數據庫進行交互,作為開發者,這讓你的生活變得更加輕鬆。

現在,讓我們來動手寫一些代碼!

PDO Connection

Establishing a Connection

要開始使用PDO,我們首先需要連接到數據庫。這樣做:

<?php
$host = 'localhost';
$dbname = 'my_database';
$username = 'root';
$password = 'password';

try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Connected successfully";
} catch(PDOException $e) {
echo "Connection failed: " . $e->getMessage();
}
?>

讓我們分解一下:

  1. 我們定義我們的連接細節(主機、數據庫名稱、用戶名和密碼)。
  2. 我們使用一個 try-catch �塊來處理任何潛在錯誤。
  3. try �塊內部,我們使用我們的連接細節創建一個新的PDO對象。
  4. 我們設置錯誤模式為抛出異常,這有助於我們更好地捕獲和處理錯誤。
  5. 如果一切順利,我們會看到 "Connected successfully"。如果不夠順利,我們會看到一個錯誤消息。

Connection Options

PDO 允許我們在連接時設置各種選項。這裡有一個例子:

<?php
$options = [
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];

$pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password, $options);
?>

這些選項將默認抓取模式設置為關聯數組,並禁用模擬預處理語句。如果這些聽起來像現在的胡言亂語 - 不要擔心,我們會在接下來的過程中更深入地探索這些概念!

PDO Class Methods

現在,我們已經連接上了,讓我們看看一些你最常見的PDO方法。

Query Execution

The query() Method

query() 方法用於簡單的SQL查詢:

<?php
$stmt = $pdo->query("SELECT * FROM users");
while ($row = $stmt->fetch()) {
echo $row['name'] . "\n";
}
?>

這段代碼從 'users' 表中抓取所有用戶並打印他們的名字。這就像讓PDO去圖書館(數據庫),找到用戶的書,並為你讀出所有的名字。

The exec() Method

exec() 方法用於不返回結果集的SQL語句:

<?php
$count = $pdo->exec("DELETE FROM users WHERE active = 0");
echo "$count inactive users were deleted.";
?>

這會刪除非活躍用戶並告訴你刪除了多少。想像一下,你讓PDO清潔你的用戶名單,刪除所有未活躍的用戶。

Prepared Statements

預處理語句是一種更安全的執行查詢的方式,特別是當處理用戶輸入時。它們有助於防止SQL注入攻擊 - 一種常見的安全漏洞。

<?php
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$stmt->execute(['name' => 'John Doe', 'email' => '[email protected]']);
?>

這就像給PDO一個表單去填寫。我們先準備語句,然後用實際的值填滿 :name:email

Fetching Results

PDO 提供了多種方式來抓取結果:

<?php
$stmt = $pdo->query("SELECT * FROM users");

// 以關聯數組抓取
$user = $stmt->fetch(PDO::FETCH_ASSOC);

// 以對象形式抓取
$user = $stmt->fetch(PDO::FETCH_OBJ);

// 抓取所有結果
$users = $stmt->fetchAll();
?>

想像這些是PDO為你检索數據的不同打包方式。你可以將其作為列表(數組)、結構化的包(對象)或一次性獲取所有內容。

Transaction Management

事務允許你將多個操作作為單個工作單元來執行:

<?php
try {
$pdo->beginTransaction();
$pdo->exec("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
$pdo->exec("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
echo "Failed: " . $e->getMessage();
}
?>

這就像告訴PDO,“我即將做一件重要的事情,請確保它全部發生或全部不發生。”這對於你需要保證數據完整性的操作來說非常好。

PDO Methods Table

這裡有一個方便的表格,總結了我們討論過的主要PDO方法:

方法 描述 示例
query() 執行一個SQL查詢 $stmt = $pdo->query("SELECT * FROM users");
exec() 執行一個SQL語句並返回受影響的行數 $count = $pdo->exec("DELETE FROM users WHERE active = 0");
prepare() 為執行準備一個語句 $stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
execute() 執行一個準備好的語句 $stmt->execute(['name' => 'John', 'email' => '[email protected]']);
fetch() 從結果集中抓取下一行 $row = $stmt->fetch(PDO::FETCH_ASSOC);
fetchAll() 從結果集中抓取所有行 $rows = $stmt->fetchAll();
beginTransaction() 開始一個事務 $pdo->beginTransaction();
commit() 提交一個事務 $pdo->commit();
rollBack() 回滾一個事務 $pdo->rollBack();

這就是PHP的PDO擴展的基礎。記住,像學習任何新技能一樣,精通PDO需要練習。如果它立即不感覺清晰,不要氣餒。繼續實驗,很快你就能像專家一樣查詢數據庫!

快樂編程,未來的數據庫巫師們!

Credits: Image by storyset