如何取得PDO物件並設定屬性? (代碼詳解)
與任何其他資料庫擴充一樣,PDO可以直接從所選資料建立現有類別的實例。但是,與其他擴充不同的是,PDO為強大而靈活的物件操作提供了許多特性。
取得單一物件
#要從查詢結果建立單一對象,有兩種方法。
1.使用熟悉的fetch()方法:
class User {}; $stmt = $pdo->query('SELECT name FROM users LIMIT 1'); $stmt->setFetchMode(PDO::FETCH_CLASS, 'User'); $user = $stmt->fetch();
2.專用的fetchObject()方法:
class User {}; $user = $pdo->query('SELECT name FROM users LIMIT 1')->fetchObject('User');
雖然這兩個程式碼段都將為你提供相同的User類別實例,
/* object(User)#3 (1) { ["name"] => string(4) "John" } */
後一種方法看起來絕對更簡潔。此外,如果使用了fetch()方法,但是沒有使用這樣的名稱定義類,則將靜默傳回一個數組,而使用fetchObject()將拋出一個適當的錯誤。
取得物件陣列
當然,上面描述的兩種方法都可以與一個熟悉的while語句一起使用,從資料庫中取得結果行。
使用一個方便的fetchAll()方法一次取得物件陣列中所有傳回的記錄:
class User {}; $users = $pdo->query('SELECT name FROM users')->fetchAll(PDO::FETCH_CLASS, 'User');
將給你一個數組,由一個User類別的物件組成,返回資料填充屬性:
/* array(2) { [0]=> object(User)#3 (1) { ["name"] => string(4) "John" } [1]=> object(User)#4 (1) { ["name"]=> string(4) "Mike" } } */
注意,你可以將此模式與PDO::FETCH_UNIQUE和PDO::FETCH_GROUP組合使用,以獲得由唯一欄位索引的結果數組,或分別使用非唯一欄位對結果進行分組。
例如,下面的程式碼將傳回一個數組,其中記錄id將用作數組索引而不是連續數字。
class User {}; $stmt = $pdo->query('SELECT id, id, name, car FROM users'); $users = ->fetchAll(PDO::FETCH_CLASS|PDO::FETCH_UNIQUE, 'User');
指派類別屬性
無論選擇哪一種方法,查詢傳回的所有欄位都會依照下列規則指派給對應的類別屬性:
1.如果有一個類別屬性,它的名稱與列名相同,則將為該屬性分配列值
2.如果沒有這樣的屬性,那麼將呼叫一個魔術方法__set()
3.如果沒有為該類別定義__set()方法,那麼將建立一個公共屬性並為其指派一個列值。
例如,這段程式碼
class User { public $name; } $user = $pdo->query('SELECT * FROM users LIMIT 1')->fetchObject('User');
將給你一個對象,所有屬性自動分配,無論它們是否存在於類別中:
/* object(User)#3 (4) { ["id"] => string(3) "104" ["name"] => string(4) "John" ["sex"] => string(4) "male" ["car"] => string(6) "Toyota" } */
從這一點可以看出,為了避免自動建立屬性,你可以使用魔術方法__set()過濾掉屬性。最簡單的過濾技巧就是一個空的__set()方法。使用它,只會設定現有的屬性:
class User { private $name; public function __set($name, $value) {} } $user = $pdo->query('SELECT * FROM users LIMIT 1')->fetchObject('User'); /* array(1) { [0]=> object(User)#3 (1) { ["name":"User":private]=> string(4) "John" } } */
如上PDO還可以為私有屬性指派值。
將建構子參數傳遞給物件
#當然,對於新建立的對象,我們可能需要提供建構子參數。為此,fetchObject()和fetchAll()方法都有一個專用的參數,你可以用它以陣列的形式傳遞建構函式參數。
假設我們有一個類別User,它有一個car屬性,可以透過提供的變數在建構函數中設定:
class User { public function __construct($car) { $this->car = $car; } }
在取得記錄時,我們應該加入一個帶有建構函數參數的陣列:
$users = $pdo->query('SELECT name FROM users LIMIT 1') ->fetchAll(PDO::FETCH_CLASS, 'User', ['Caterpillar']); $user = $pdo->query('SELECT name FROM users LIMIT 1') ->fetchObject('User',['Caterpillar']);
/* object(User)#3 (2) { ["name"] => string(4) "John" ["car"] => string(11) "Caterpillar" } */
可以看到,資料庫中的值被覆寫了,因為預設情況下PDO在呼叫建構子之前分配類別屬性。這可能是一個問題,但很容易解決:
在呼叫建構子後設定類別屬性
##mysql_fetch_object()註解:
如果你使用mysql_fetch_object並指定一個類別-屬性將在建構子執行之前設定。這通常不是問題,但是如果你的屬性是透過__set()魔術方法設定的,那必須先執行建構函數邏輯,否則可能會導致一些主要問題。
可惜mysql是一個mysqli擴展,但我們使用的是PDO。因此,有一種方法可以告訴PDO在建構子執行之後分配屬性。為此,必須使用PDO::FETCH_PROPS_LATE常數。 使用fetchAll()會非常簡單,class User { public function __construct($car) { $this->car = $car; } } $stmt = $pdo->query('SELECT name, car FROM users LIMIT 1'); $users = $stmt->fetchAll(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, 'User', ['Caterpillar']);
class User { public function __construct($car) { $this->car = $car; } } $stmt = $pdo->query('SELECT name, car FROM users LIMIT 1'); $stmt->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, 'User'); $user = $stmt->fetchObject('User', ['Caterpillar']); /* object(User)#3 (2) { ["car"] => string(6) "Toyota" ["name"] => string(4) "John" } */
$stmt = $pdo->query('SELECT name, car FROM users LIMIT 1'); $stmt->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, 'User', ['Caterpillar']); $user = $stmt->fetch();
從資料庫中取得類別名稱
還有一個更有趣的標誌,它告訴PDO從第一列的值中取得類名。使用這個標誌,可以避免使用setFetchMode()和fetch():$data = $pdo->query("SELECT 'User', name FROM users") ->fetch(PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE); /* object(User)#3 (1) { ["name"]=> string(4) "John" } */
class Male {}; class Female {}; $stmt = $pdo->query('SELECT sex, name FROM users'); $users = $stmt->fetchAll(PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE); /* array(6) { [0]=> object(Male)#3 (1) { ["name"]=> string(4) "John" } [1]=> object(Male)#4 (1) { ["name"]=> string(4) "Mike" } [2]=> object(Female)#5 (1) { ["name"]=> string(4) "Mary" } [3]=> object(Female)#6 (1) { ["name"]=> string(5) "Kathy" } }*/
更新現有物件#
除了创建新对象,PDO还可以更新现有对象。只使用setFetchMode(),它将现有变量作为参数。显然,使用fetchAll()是无用的。
class User { public $name; public $state; public function __construct() { $this->name = NULL; } } $user = new User; $user->state = "up'n'running"; var_dump($user); $stmt = $pdo->query('SELECT name FROM users LIMIT 1'); $stmt->setFetchMode(PDO::FETCH_INTO, $user); $data = $stmt->fetch(); var_dump($data, $user); /* object(Foo)#2 (2) { ["name"] => NULL ["state"] => string(12) "up'n'running" } object(Foo)#2 (2) { ["name"] => string(4) "John" ["state"] => string(12) "up'n'running" } object(Foo)#2 (2) { ["name"] => string(4) "John" ["state"] => string(12) "up'n'running" } */
如上,fetch()调用返回的是相同的对象,这在我看来是多余的。还要注意,与PDO::FETCH_CLASS不同,这种模式不分配私有属性。
以上是如何取得PDO物件並設定屬性? (代碼詳解)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。
