日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

PHP如何初始化PDO及原始SQL語句操作

瀏覽:29日期:2022-09-06 18:57:11
目錄PDO 實例dns 參數PDO 對象屬性查詢語句普通查詢及遍歷查詢結果集(數組、對象)查詢結果集(類)查詢結果集(指定字段)增、刪、改操作增加操作修改操作刪除操作總結PDO 實例

首先來看看一個 PDO 實例是如何初始化的。

$dns = ’mysql:host=localhost;dbname=blog_test;port=3306;charset=utf8’;$pdo = new PDO($dns, ’root’, ’’);

普通情況下,我們直接實例化的時候傳遞構造參數就可以獲得一個 PDO 對象。這樣,我們就和數據庫建立了連接。如果連接失敗,也就是參數寫得有問題的時候,在實例化時直接就會報異常。

PDO 對象的參數包括 DNS 信息、用戶名、密碼,另外還有一個參數就是可以設置 PDO 連接的一些屬性,我們將在后面看到它的使用。

dns 參數

PDO 構造參數的第一個參數是一個 DNS 字符串。在這個字符串中使用分號 ; 分隔不同的參數內容。它里面可以定義的內容包括:

DSN prefix,也就是我們要連接的數據庫類型,MySQL 數據庫一般都是直接使用 mysql: 這樣來定義即可。 host,連接的地址,在這里我們連接的是本地數據庫 localhost port,端口號,MySQL 默認為 3306 ,可以不寫 dbname,要連接的數據庫名稱 unix_socket,可以指定 MySQL 的 Unix Socket 文件 charset,連接的字符集

我們可以通過一個函數來查看當前 PHP 環境中所支持的數據庫擴展都有哪些:

print_r(PDO::getAvailableDrivers());exit;// Array// (// [0] => dblib// [1] => mysql// [2] => odbc// [3] => pgsql// [4] => sqlite// )PDO 對象屬性

PDO 構造參數的最后一個參數可以設置連接的一些屬性,如:

$pdo = new PDO($dns, ’root’, ’’, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);showPdoAttribute($pdo);// ……// PDO::ATTR_ERRMODE: 2// ……

showPdoAttribute() 方法是我們自己封裝的一個展示所有連接屬性的函數。

// 顯示pdo連接屬性function showPdoAttribute($pdo){ $attributes = array('DRIVER_NAME', 'AUTOCOMMIT', 'ERRMODE', 'CASE', 'CLIENT_VERSION', 'CONNECTION_STATUS','ORACLE_NULLS', 'PERSISTENT', 'SERVER_INFO', 'SERVER_VERSION' );foreach ($attributes as $val) {echo 'PDO::ATTR_$val: ';echo $pdo->getAttribute(constant('PDO::ATTR_$val')) . 'n'; }}

在這個函數中,我們使用 PDO 實例的 getAttribute() 方法來獲取相應的屬性值。在沒有設置 PDO::ATTR_ERRMODE 時,它的默認值為 0 ,也就是 PDO::ERRMODE_SILENT 常量所對應的值。在上述代碼中,我們將它設置為了 PDO::ERRMODE_EXCEPTION ,查看屬性輸出的結果就變成了 2 。

除了在構造函數的參數中設置屬性外,我們也可以使用 PDO 實例的 setAttribute() 方法來設置 PDO 的屬性值。

pdo2 = new PDO($dns, ’root’, ’’, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);echo $pdo2->getAttribute(PDO::ATTR_DEFAULT_FETCH_MODE), PHP_EOL;// 4// 設置屬性$pdo2->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);echo $pdo2->getAttribute(PDO::ATTR_DEFAULT_FETCH_MODE), PHP_EOL;// 2

在這段代碼中,我們設置 PDO::ATTR_DEFAULT_FETCH_MODE 為 PDO::FETCH_ASSOC 。這樣,在使用這個 $pdo2 的連接進行查詢時,輸出的結果都會是以數組鍵值對形式返回的內容。我們馬上就進入查詢方面相關函數的學習。

查詢語句

大多數情況下,使用 PDO 我們都會用它的預處理能力來編寫 SQL 語句,一來是性能更好,二來是更加安全。不過我們今天先不講預處理方面的問題,還是以最原始的直接操作 SQL 語句的方式學習相關的一些函數。

普通查詢及遍歷

// 普通查詢 - 遍歷1$stmt = $pdo->query(’select * from zyblog_test_user limit 5’);foreach ($stmt as $row) { var_dump($row);}// array(8) {// ['id']=>// string(3) '204'// [0]=>// string(3) '204'// ['username']=>// string(5) 'three'// [1]=>// string(5) 'three'// ['password']=>// string(6) '123123'// [2]=>// string(6) '123123'// ['salt']=>// string(3) 'ccc'// [3]=>// string(3) 'ccc'// }// ……// 普通查詢 - 遍歷2$stmt = $pdo->query(’select * from zyblog_test_user limit 5’);while ($row = $stmt->fetch()) { var_dump($row);}// array(8) {// ['id']=>// string(3) '204'// [0]=>// string(3) '204'// ['username']=>// string(5) 'three'// [1]=>// string(5) 'three'// ['password']=>// string(6) '123123'// [2]=>// string(6) '123123'// ['salt']=>// string(3) 'ccc'// [3]=>// string(3) 'ccc'// }// ……

PDO 實例的 query() 方法就是執行一條查詢語句,并返回一個 PDOStatement 對象。通過遍歷這個對象,就可以獲得查詢出來的數據結果集。

在代碼中,我們使用了兩種方式來遍歷,其實它們的效果都是一樣的。在這里,我們要關注的是返回的數據格式??梢钥闯?,數據是以數組格式返回的,并且是以兩種形式,一個是數據庫定義的鍵名,一個是以下標形式。

查詢結果集(數組、對象)

其實大部分情況下,我們只需要數據庫鍵名的那種鍵值對形式的數據就可以了。這個有兩種方式,一是直接使用上文中我們定義好默認 PDO::ATTR_DEFAULT_FETCH_MODE 屬性的 $pdo2 連接,另一個就是在查詢的時候為 query() 方法指定屬性。

$stmt = $pdo2->query(’select * from zyblog_test_user limit 5’);foreach ($stmt as $row) { var_dump($row);}// array(4) {// ['id']=>// string(1) '5'// ['username']=>// string(3) 'two'// ['password']=>// string(6) '123123'// ['salt']=>// string(3) 'bbb'// }// ……$stmt = $pdo->query(’select * from zyblog_test_user limit 5’, PDO::FETCH_ASSOC);foreach ($stmt as $row) { var_dump($row);}// array(4) {// ['id']=>// string(1) '5'// ['username']=>// string(3) 'two'// ['password']=>// string(6) '123123'// ['salt']=>// string(3) 'bbb'// }// ……

當然,我們也可以直接讓數據返回成對象的格式,同樣的也是使用預定義的常量來指定 query() 或者 PDO 實例連接的屬性就可以了。

$stmt = $pdo->query(’select * from zyblog_test_user limit 5’, PDO::FETCH_OBJ);foreach ($stmt as $row) { var_dump($row);}// object(stdClass)#4 (4) {// ['id']=>// string(1) '5'// ['username']=>// string(3) 'two'// ['password']=>// string(6) '123123'// ['salt']=>// string(3) 'bbb'// }// ……查詢結果集(類)

上面返回對象形式的結果集中的對象是 stdClass 類型,也就是 PHP 的默認類類型。那么我們是否可以自己定義一個類,然后在查詢完成后直接生成它的結果集呢?就是像是 ORM 框架一樣,完成數據到對象的映射。既然這么說了,那當然是可以的啦,直接看代碼。

class user{ public $id; public $username; public $password; public $salt; public function __construct() {echo ’func_num_args: ’ . func_num_args(), PHP_EOL;echo ’func_get_args: ’;var_dump(func_get_args()); }}class user2{}// 返回指定對象$u = new user;$stmt = $pdo->query(’select * from zyblog_test_user limit 5’, PDO::FETCH_INTO, $u);foreach ($stmt as $row) { var_dump($row);}// object(user)#3 (4) {// ['id']=>// string(1) '5'// ['username']=>// string(3) 'two'// ['password']=>// string(6) '123123'// ['salt']=>// string(3) 'bbb'// }// ……// 空類測試$u = new user2;$stmt = $pdo->query(’select * from zyblog_test_user limit 5’, PDO::FETCH_INTO, $u);foreach ($stmt as $row) { var_dump($row);}// object(user2)#2 (4) {// ['id']=>// string(1) '5'// ['username']=>// string(3) 'two'// ['password']=>// string(6) '123123'// ['salt']=>// string(3) 'bbb'// }// ……

在這段代碼中,我們定義了兩個類,user 類有完整的和數據庫字段對應的屬性,還定義了一個構造方法(后面會用到)。而 user2 類則是一個空的類。通過測試結果來看,類的屬性對于 PDO 來說并不重要。它會默認創建數據庫查詢到的字段屬性,并將它賦值給對象。那么假如我們定義了一個 const 常量屬性并給予相同的字段名稱呢?大家可以自己嘗試一下。

對于 user 和 user2 來說,我們將它實例化了并傳遞給了 query() ,并且指定了結果集格式為 PDO::FETCH_INTO ,這樣就實現了獲取對象結果集的能力。但是 PDO 遠比你想象的強大,我們還可以直接用類模板來獲取查詢結果集。

// 根據類返回指定對象$stmt = $pdo->query(’select * from zyblog_test_user limit 5’, PDO::FETCH_CLASS, ’user’, [’x1’, ’x2’]);foreach ($stmt as $row) { var_dump($row);}// func_num_args: 2// func_get_args: array(2) {// [0]=>// string(2) 'x1'// [1]=>// string(2) 'x2'// }// object(user)#4 (4) {// ['id']=>// string(1) '5'// ['username']=>// string(3) 'two'// ['password']=>// string(6) '123123'// ['salt']=>// string(3) 'bbb'// }// ……

query() 方法直接使用查詢結果集模式為 PDO::FETCH_CLASS ,并傳遞一個類模板的名稱,PDO 就會在當前代碼中查找有沒有對應的類模板,獲得的每個結果都會實例化一次。在這里,我們又多了一個參數,最后一個參數是一個數組,并且給了兩個元素。估計有不少小伙伴已經看出來了,這個參數是傳遞給類的構造方法的。記住,使用這個模式,每個元素都會實例化一次,結果集中的每個元素都是新創建的類(object(user2)#3,#號后面的數字是不同的對象句柄id),而 PDO::FETCH_INTO 則是以引用的形式為每個元素賦值(object(user2)#3,#號后面的數字是相同的對象句柄id)。也就是說,我們使用 PDO::FETCH_INTO 模式的時候,修改一個元素的值,其它的元素也會跟著改變,如果使用一個數組去記錄遍歷的元素值,最后數組的結果也會是相同的最后一個元素的內容。

$stmt = $pdo->query(’select * from zyblog_test_user limit 5’, PDO::FETCH_INTO, $u);$resArr = [];foreach ($stmt as $row) { var_dump($row); $resArr[] = $row;}$resArr[0]->id = 55555;print_r($resArr);// Array// (// [0] => user2 Object// (// [id] => 55555// [username] => two// [password] => 123123// [salt] => bbb// )// [1] => user2 Object// (// [id] => 55555// [username] => two// [password] => 123123// [salt] => bbb// )// [2] => user2 Object// (// [id] => 55555// [username] => two// [password] => 123123// [salt] => bbb// )// [3] => user2 Object// (// [id] => 55555// [username] => two// [password] => 123123// [salt] => bbb// )// [4] => user2 Object// (// [id] => 55555// [username] => two// [password] => 123123// [salt] => bbb// )// )

如何解決這個問題呢?最簡單的方式就是在數組賦值的時候加個 clone 關鍵字唄!

查詢結果集(指定字段)

最后輕松一點,我們看下 query() 方法還可以指定查詢的某一個字段。

// 只返回第幾個字段$stmt = $pdo->query(’select * from zyblog_test_user limit 5’, PDO::FETCH_COLUMN, 2);foreach ($stmt as $row) { var_dump($row);}// string(32) 'bbff8283d0f90625015256b742b0e694'// string(6) '123123'// string(6) '123123'// string(6) '123123'// string(6) '123123'增、刪、改操作

除了查詢之外的操作,我們也可以使用 exec() 方法來執行其他一些相應的 SQL 語句。

增加操作

$count = $pdo->exec('insert into zyblog_test_user(`username`, `password`, `salt`) value(’akk’, ’bkk’, ’ckk’)');$id = $pdo->lastInsertId();var_dump($count); // int(1)var_dump($id); // string(3) '205'

exec() 返回的是影響的行數,如果我們執行這一條 SQL ,返回的就是成功添加了一行數據。如果要獲得新增加數據的 id ,就要使用 lastInserId() 方法來獲取。

$count = $pdo->exec('insert into zyblog_test_user(`username`, `password`, `salt`) value(’akk’, ’bkk’, ’ckk’, ’dkk’)');// Fatal error: Uncaught PDOException: SQLSTATE[21S01]: Insert value list does not match column list: 1136 Column count doesn’t match value count at row 1

執行錯誤的 SQL 語句,就像根據 PDO::ATTR_ERRMODE 屬性的設置來返回錯誤信息。我們在最上面的實例化 PDO 代碼中指定了錯誤形式是異常處理模式,所以這里直接就會報 PDOException 異常。

修改操作

// 正常更新$count = $pdo->exec('update zyblog_test_user set `username`=’aakk’ where id=’{$id}’');var_dump($count); // int(1)// 數據不變更新$count = $pdo->exec('update zyblog_test_user set `username`=’aakk’ where id=’{$id}’');var_dump($count); // int(0)// 條件錯誤更新$count = $pdo->exec('update zyblog_test_user set `username`=’aakk’ where id=’123123123123’');var_dump($count); // int(0)echo ’===============’, PHP_EOL;

同樣的,在執行更新操作的時候,exec() 返回的也是受影響的行數。很多小伙伴會以這個進行判斷是否更新成功,但如果數據沒有修改,那么它返回的將是 0 ,SQL 語句的執行是沒有問題的,邏輯上其實也沒有問題。比如我們在后臺打開了某條數據查看,然后并不想更新任何內容就直接點了提交,這時候不應該出現更新失敗的提示。也就是說,在前端判斷更新操作的時候,需要判斷字段是否都有改變,如果沒有改變的話那么不應該提示更新失敗。這一點是業務邏輯上的考慮問題,如果你認為這樣也是更新失敗的話,那么這么報錯也沒有問題,一切以業務形式為主。

刪除操作

$count = $pdo->exec('delete from zyblog_test_user where id = ’{$id}’');var_dump($count); // int(1)// 條件錯誤刪除$count = $pdo->exec('delete from zyblog_test_user where id = ’5555555555’');var_dump($count); // int(0)

刪除操作需要注意的問題和更新操作是一樣的,那就是同樣的 exec() 只是返回影響行數的問題,不過相對于更新操作來說,沒有受影響的行數那肯定是刪除失敗的,沒有數據被刪除。同樣的,這個失敗的提示也請根據業務情況來具體分析。

總結

不學不知道,一學嚇一跳吧,簡簡單的一個 PDO 的創建和語句執行竟然有這么多的內容。對于我們的日常開發來說,掌握這些原理能夠避免很多莫名其妙的問題,比如上面 exec() 只是返回影響行數在業務開發中如何判斷操作是否成功的問題就很典型。好了,這只是第一篇,后面的學習不要落下了哦!

測試代碼

以上就是PHP如何初始化PDO及原始SQL語句操作的詳細內容,更多關于PHP 初始化PDO及原始SQL語句操作的資料請關注好吧啦網其它相關文章!

標簽: PHP
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久亚洲精品中文字幕蜜潮电影| 免费久久99精品国产自在现线| 亚洲在线观看| 国产传媒在线观看| 成人免费一区| 日本一二区不卡| 色综合狠狠操| 日韩高清欧美| 激情欧美日韩一区| 伊人影院久久| 视频在线在亚洲| 亚洲一区二区三区在线免费| 亚洲欧美网站在线观看| 欧美在线看片| 久久精品女人| 日本精品在线中文字幕| 欧美精选一区二区三区| 亚洲女人av| 亚洲资源av| 日韩精品欧美大片| 久久a爱视频| 日韩理论片av| 午夜在线精品| 欧美日韩亚洲一区三区| 精品国产一区二区三区2021| 欧美男人天堂| 精品一区在线| 综合亚洲视频| 美腿丝袜在线亚洲一区| 日本免费一区二区三区四区| 女人天堂亚洲aⅴ在线观看| 亚洲天堂日韩在线| 麻豆精品新av中文字幕| 国产拍在线视频| 一区二区视频欧美| 国产亚洲观看| 91精品精品| 日韩三级精品| 欧美好骚综合网| 夜夜嗨一区二区| 国产精品欧美三级在线观看 | 噜噜噜久久亚洲精品国产品小说| 日韩高清在线一区| 9999国产精品| 在线精品一区二区| 久久精品国产久精国产爱| 香蕉久久99| 亚洲午夜国产成人| 久久精品网址| 久久午夜精品| 成人日韩av| 亚洲精品一级二级三级| 美女视频黄免费的久久| 日韩视频一区| 久久99影视| 午夜在线播放视频欧美| 高清日韩欧美| 亚洲精品第一| 秋霞影院一区二区三区| 欧美一区91| 欧美日韩国产综合网| 精品72久久久久中文字幕| 一区视频在线| 久久久久伊人| 亚洲综合婷婷| 99精品一区| 国产精品115| 合欧美一区二区三区| 日韩国产在线观看| 国产成人精品一区二区免费看京| 亚洲天堂免费电影| 国产日韩欧美在线播放不卡| 自由日本语亚洲人高潮| 国产成人精品福利| 亚洲精品大全| 伊人精品一区| 久久精品国产亚洲一区二区三区| 日韩视频在线一区二区三区 | 日韩成人亚洲| 美女视频免费精品| 日韩av一区二区在线影视| 欧美午夜精彩| 日本一区二区高清不卡| 日本精品一区二区三区在线观看视频 | 亚洲人www| 精品一区三区| 欧美成人精品三级网站| 国产极品模特精品一二| 午夜久久美女| 亚洲成人va| 97精品在线| 精品国内亚洲2022精品成人| 91福利精品在线观看| 一本色道精品久久一区二区三区| 偷拍精品精品一区二区三区| 久久影视三级福利片| 日本综合精品一区| 午夜在线播放视频欧美| 红桃视频国产精品| 日本欧美不卡| 黑人精品一区| 国产福利91精品一区二区| 国产精品毛片久久久| 青草国产精品久久久久久| 蜜臀av性久久久久蜜臀aⅴ四虎| 在线国产一区二区| 久久精品国产68国产精品亚洲| 97国产成人高清在线观看| 久久99精品久久久久久园产越南 | 中文不卡在线| 伊人久久成人| 91精品高清| 欧美一级精品| 欧美一区二区三区高清视频| 久久九九精品| 亚洲天堂1区| 日本蜜桃在线观看视频| 高清在线一区| 国产h片在线观看| 在线手机中文字幕| 日韩久久电影| 久久精品国产99久久| 136国产福利精品导航网址| 久久精品播放| 亚洲激情二区| 午夜精品影院| 亚洲免费影院| 日韩欧美另类中文字幕| 欧美日韩中出| 国产精品成人3p一区二区三区| 久久精品av麻豆的观看方式| 青青草91久久久久久久久| 国产精品一国产精品k频道56| 国产精品亚洲人成在99www| 欧美激情日韩| 岛国av在线播放| 久久精品免费一区二区三区| 午夜欧美精品| 亚洲综合婷婷| 久久狠狠亚洲综合| 久久av超碰| 91欧美在线| 亚洲香蕉网站| 蜜桃久久精品一区二区| 日韩不卡在线观看日韩不卡视频| 欧美精品观看| 中文字幕色婷婷在线视频| 亚洲午夜久久久久久尤物| 日韩在线卡一卡二| 国产日韩视频在线| 日本综合字幕| 在线视频亚洲欧美中文| 国产精品网在线观看| 国产粉嫩在线观看| 亚洲国产一区二区在线观看 | 亚洲va久久久噜噜噜久久| 久久国产精品免费一区二区三区| 精品视频一区二区三区四区五区| 在线看片福利| 夜夜嗨一区二区三区| 欧美日韩一区二区三区不卡视频| 国产成年精品| 午夜精品婷婷| 国产伦精品一区二区三区在线播放 | 免费av一区二区三区四区| 玖玖精品视频| 久久不见久久见中文字幕免费| 亚洲精品一级二级| 亚洲一二av| 国产第一亚洲| 免费视频最近日韩| 精品淫伦v久久水蜜桃| 激情综合在线| 国产欧美一区二区精品久久久| 日韩欧美一区二区三区在线视频 | 日本午夜精品一区二区三区电影| 精品国产欧美日韩一区二区三区| 国精品一区二区| 国产欧美日韩影院| 亚洲午夜黄色| 国产精品极品在线观看| 欧美+日本+国产+在线a∨观看| 清纯唯美亚洲综合一区| 欧美日韩中文一区二区| 欧美一级久久| 极品日韩av| 国产精品15p| 丝袜亚洲精品中文字幕一区| 国产成人77亚洲精品www| 蜜臀精品一区二区三区在线观看 | 婷婷亚洲五月| 国产精品17p| 丝袜脚交一区二区| 欧美男人天堂| 国产精品综合| 久久福利影视| 日韩中文首页| 国产精品成人一区二区网站软件| 亚洲一区二区三区高清| 精品日韩在线|