php_pdo_sqlsrv.dll (Windows) 或 pdo_sqlsrv.so (Linux)extension=pdo_sqlsrv<?php
$dsn = 'sqlsrv:Server=192.168.1.106;Database=bookStore_demo;CharacterSet=UTF-8';
$user = 'sa';
$password = '123';
try {
$pdo = new PDO($dsn, $user, $password, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
$sql = 'SELECT * FROM article';
$stmt = $pdo->query($sql);
$results = $stmt->fetchAll();
var_dump($results);
} catch (PDOException $e) {
die('連線失敗: ' . $e->getMessage());
}
?>
<?php
class DB extends PDO {
private static $instance = null;
private function __construct() {
$dsn = "sqlsrv:Server=" . getenv('DB_HOST') . ";Database=" . getenv('DB_NAME') . ";CharacterSet=UTF-8";
parent::__construct($dsn, getenv('DB_USER'), getenv('DB_PASS'), [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
}
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
// 安全查詢:自動參數綁定
public function query($sql, $params = []) {
$stmt = $this->prepare($sql);
$stmt->execute($params);
return $stmt;
}
// 單筆查詢
public function fetchOne($sql, $params = []) {
return $this->query($sql, $params)->fetch();
}
// 多筆查詢
public function fetchAll($sql, $params = []) {
return $this->query($sql, $params)->fetchAll();
}
// 執行增刪改
public function execute($sql, $params = []) {
return $this->query($sql, $params)->rowCount();
}
// 最後插入 ID
public function lastInsertId($sequence = null) {
return parent::lastInsertId($sequence);
}
}
// 使用範例
$db = DB::getInstance();
// 查詢
$articles = $db->fetchAll("SELECT * FROM article WHERE status = ? AND category = ?", [1, 'tech']);
// 新增
$db->execute(
"INSERT INTO article (title, content, author_id) VALUES (?, ?, ?)",
['標題', '內容', 1001]
);
$new_id = $db->lastInsertId();
// 更新
$db->execute("UPDATE article SET views = views + 1 WHERE id = ?", [$new_id]);
// 刪除
$db->execute("DELETE FROM article WHERE id = ?", [43]);
?>
| PHP 型別 | PDO 常數 | SQL Server 型別 |
|---|---|---|
| string | PDO::PARAM_STR | NVARCHAR, VARCHAR, CHAR, TEXT |
| int | PDO::PARAM_INT | INT, BIGINT, SMALLINT, TINYINT |
| float | (無專用常數,用 STR) | DECIMAL, FLOAT, REAL, MONEY |
| bool | PDO::PARAM_BOOL | BIT |
| null | PDO::PARAM_NULL | 所有可為 NULL 欄位 |
| resource/stream | PDO::PARAM_LOB | VARBINARY, IMAGE, XML |
明確指定型別:$stmt->bindValue(':id', $id, PDO::PARAM_INT);
<?php
try {
$pdo->beginTransaction();
$pdo->execute("INSERT INTO orders (user_id, total) VALUES (?, ?)", [1001, 999.00]);
$order_id = $pdo->lastInsertId();
foreach ($items as $item) {
$pdo->execute(
"INSERT INTO order_items (order_id, product_id, qty, price) VALUES (?, ?, ?, ?)",
[$order_id, $item['pid'], $item['qty'], $item['price']]
);
}
$pdo->commit();
echo "訂單建立成功,ID: $order_id";
} catch (Exception $e) {
$pdo->rollBack();
echo "訂單建立失敗: " . $e->getMessage();
}
?>
Server=ip,port (如 192.168.1.100,1433) 或 Server=(local) (本機命名管道)CAST(col AS NTEXT)/etc/odbcinst.ini、/etc/odbc.ini 配置、防火牆、SELinux、ODBC Driver 版本closeCursor()) 即建立新的,確保執行完畢再準備下一條