摘要:操作數(shù)據(jù)庫(kù)的種形式使用擴(kuò)展類(lèi)庫(kù)推薦使用擴(kuò)展類(lèi)庫(kù)這是類(lèi)庫(kù)的升級(jí)版,但已經(jīng)不推薦使用擴(kuò)展包含哪三個(gè)類(lèi)與區(qū)別可以支持多種數(shù)據(jù)庫(kù),而且操作方法一致只支持?jǐn)?shù)據(jù)庫(kù)如何使用連接數(shù)據(jù)庫(kù)什么是如何關(guān)閉連接通過(guò)來(lái)連接數(shù)據(jù)庫(kù),其中必須傳入數(shù)據(jù)源名稱(chēng)數(shù)據(jù)源名稱(chēng)是
PHP操作數(shù)據(jù)庫(kù)的2種形式
使用 PDO 擴(kuò)展類(lèi)庫(kù)(推薦)
使用 Mysqli 擴(kuò)展類(lèi)庫(kù)(這是Mysql類(lèi)庫(kù)的升級(jí)版,但已經(jīng)不推薦使用)
PDO 擴(kuò)展包含哪三個(gè)類(lèi)PDO
PDOStatement
PDOException
PDO 與 Mysqli 區(qū)別PDO 可以支持多種數(shù)據(jù)庫(kù),而且操作方法一致
Mysqli 只支持Mysql數(shù)據(jù)庫(kù)
如何使用PDO連接數(shù)據(jù)庫(kù)?什么是DSN?如何關(guān)閉連接?通過(guò)new PDO()來(lái)連接數(shù)據(jù)庫(kù),其中必須傳入DSN數(shù)據(jù)源名稱(chēng)
try { $db = new PDO($dsn, $user, $password); } catch (PDOException $e) { echo "Connection failed: " . $e->getMessage(); }
DSN(數(shù)據(jù)源名稱(chēng))是告訴PDO使用哪款驅(qū)動(dòng)來(lái)連接數(shù)據(jù)庫(kù),每一種數(shù)據(jù)庫(kù)DSN都不同
Mysql的DSN mysql:host=localhost;dbname=test
oracle的DSN oci:dbname=//localhost:232/mydb;charset=utf-8
關(guān)閉連接: $db = null;
PDO 與連接相關(guān)的選項(xiàng)如何設(shè)置?設(shè)置連接選項(xiàng)的2種方式
1、new PDO()的第四參數(shù)
//設(shè)置持久數(shù)據(jù)庫(kù)連接必須使用這種方式,否則無(wú)效 $opt = array( PDO::ATTR_PERSISTENT => true, PDO::ATTR_TIMEOUT => 3600, PDO::ATTR_AUTOCOMMIT => true ); try { $db = new PDO($dsn,$user,$password,$opt); } catch (PDOException $e) { echo "Connection failed: " . $e->getMessage(); }
2、使用PDO對(duì)象的setAttribute()方法
try { $db = new PDO($dsn,$user,$password); $db -> setAttribute(PDO::ATTR_TIMEOUT, 3600); } catch (PDOException $e) { echo "Connection failed: " . $e->getMessage(); } //與getAttribute()方法配套PDO 錯(cuò)誤處理模式該如何設(shè)置?
錯(cuò)誤處理模式有哪三種?
1、PDO::ERRMODE_SILENT (默認(rèn),不提示,需要結(jié)合errorCode()與errorInfo())
2、PDO::ERRMODE_WARNING (警告)
3、PDO::ERRMODE_EXCEPTION (報(bào)異常,推薦使用)
一般使用案例
try { $db = new PDO($dsn,$user,$password); $db -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { echo "Connection failed: " . $e->getMessage(); }PDO 執(zhí)行SQL有哪些方法?
exec() ----不推薦,后面會(huì)有解釋
exec() 主要:執(zhí)行無(wú)結(jié)果集的SQL語(yǔ)句 增刪改創(chuàng)建 返回影響行數(shù)
query() ----不推薦,后面會(huì)有解釋
query() 主要:執(zhí)行有結(jié)果集的SQL語(yǔ)句 查詢 返回PDOStatement對(duì)象
對(duì)于某些SQL 既不是操作,也沒(méi)有返回結(jié)果,使用上面某種方法都可以
prepare() ----推薦,后面會(huì)有解釋
PDO 事務(wù)如何實(shí)現(xiàn)?操作的Mysql的數(shù)據(jù)表必須是InnoDB
關(guān)閉自動(dòng)提交 $db->setAttribute(PDO::ATTR_AUTOCOMMIT, 0);
開(kāi)啟事務(wù) $db->beginTransaction();
手動(dòng)提交 $db->commit();
事務(wù)回滾 $db->rollBack();
什么是SQL注入?SQL注入如何防止?事務(wù)完成后,最好把自動(dòng)提交開(kāi)啟 $db->setAttribute(PDO::ATTR_AUTOCOMMIT, 1);
SQL注入其實(shí)就是用戶輸入的數(shù)據(jù)帶有攻擊成分,所以用戶輸入的信息都是不可靠的
由于以上原因,導(dǎo)致之前exec()和query()方法不常用,因?yàn)椴话踩?,但只要不是用過(guò)用戶數(shù)據(jù)生成的SQL都可以使用exec()和query()
使用預(yù)處理語(yǔ)句來(lái)防止SQL注入
try{ //只是將這個(gè)語(yǔ)句放到數(shù)據(jù)庫(kù)上,編譯后等待,沒(méi)有執(zhí)行 $stmt = $db -> prepare("insert into user(name,pwd,age) values(?,?,?)"); //綁定參數(shù)(?) $stmt -> bindParam(1,$name); $stmt -> bindParam(2,$pwd); $stmt -> bindParam(3,$age); $name = "wwww"; $pwd = "12112"; $age = 18; //執(zhí)行存儲(chǔ)在數(shù)據(jù)庫(kù)中的語(yǔ)句 $stmt -> execute(); $name = "bbb"; $pwd = "ad22121"; $age = 20; //執(zhí)行存儲(chǔ)在數(shù)據(jù)庫(kù)中的語(yǔ)句 $stmt -> execute(); }catch(PDOException $e){ echo $e->getMessage(); exit(); }
簡(jiǎn)化模式:
try{ //只是將這個(gè)語(yǔ)句放到數(shù)據(jù)庫(kù)上,編譯后等待,沒(méi)有執(zhí)行 $stmt = $db -> prepare("insert into user(name,pwd,age) values(?,?,?)"); //執(zhí)行存儲(chǔ)在數(shù)據(jù)庫(kù)中的語(yǔ)句 $stmt -> execute(array("wwww","12112",18)); }catch(PDOException $e){ echo $e->getMessage(); exit(); }預(yù)處理語(yǔ)句中有哪兩種占位符?注意事項(xiàng)是什么?
2種占位符:命名占位符和問(wèn)號(hào)占位符
問(wèn)號(hào)占位符就是上面那種
命名占位符,如下,推薦使用命名控制符
try{ //只是將這個(gè)語(yǔ)句放到數(shù)據(jù)庫(kù)上,編譯后等待,沒(méi)有執(zhí)行 $stmt = $db -> prepare("insert into user(name,pwd,age) values(:name,:pwd,:age)"); //綁定參數(shù)(?) $stmt -> bindParam(1,$name); $stmt -> bindParam(2,$pwd); $stmt -> bindParam(3,$age); $name = "wwww"; $pwd = "12112"; $age = 18; //執(zhí)行存儲(chǔ)在數(shù)據(jù)庫(kù)中的語(yǔ)句 $stmt -> execute(); $name = "bbb"; $pwd = "ad22121"; $age = 20; //執(zhí)行存儲(chǔ)在數(shù)據(jù)庫(kù)中的語(yǔ)句 $stmt -> execute(); }catch(PDOException $e){ echo $e->getMessage(); exit(); }
注意事項(xiàng)
參數(shù)綁定不能應(yīng)用到表名上
//錯(cuò)誤 $sth = $dbh->prepare("SELECT name, colour, calories FROM ? WHERE calories < ?"); //正確 $sth = $dbh->prepare("SELECT name, colour, calories FROM fruit WHERE calories < ?");
參數(shù)綁定不能應(yīng)用到列名
//錯(cuò)誤 $sth = $dbh->prepare("SELECT name, colour, calories FROM fruit WHERE ? < ?"); //正確 $sth = $dbh->prepare("SELECT name, colour, calories FROM fruit WHERE calories < ?");PDO 預(yù)處理語(yǔ)句如何增刪改查?
增刪改
try{ $db = new PDO($dsn,$name,$pwd); $db -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); }catch(PDOException $e){ echo "Connection failed: " . $e->getMessage(); } try{ $stmt = $db -> prepare("insert into user(name,pwd,age) values(?,?,?)"); $stmt -> execute(array("wtao","23232",14)); $count = $stmt -> rowCount(); if($count === 0){ throw new PDOException(); } $id = $db -> lastInsertId(); }catch(PDOException $e){ echo "Connection failed: " . $e->getMessage(); }
查
try{ $db = new PDO($dsn,$name,$pwd); $db -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); }catch(PDOException $e){ echo "Connection failed: " . $e->getMessage(); } try{ $stmt = $db -> prepare("SELECT name, age, title FROM fruit WHERE id < ?"); $stmt -> execute(array(14)); while(list($name,$age,$title) = $stmt->fetch(PDO::FETCH_NUM)){ } }catch(PDOException $e){ echo "Connection failed: " . $e->getMessage(); }注意事項(xiàng)
$stmt -> execute()的返回值,如果在異常模式下,可以不用處理返回值的,只有在不是異常處理的模式下才需要判斷處理
$db -> prepare(); 準(zhǔn)備預(yù)處理語(yǔ)句都是多帶帶的,返回PDOStatement對(duì)象也就是多帶帶的,如果某個(gè)功能需要執(zhí)行多條SQL語(yǔ)句,請(qǐng)先準(zhǔn)備好多個(gè)PDOStatement對(duì)象,然后分別執(zhí)行
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/25644.html
摘要:而是說(shuō),程序的外部資源,往往是影響性能的重要因素,尤其是當(dāng)外部資源的連接和數(shù)據(jù)獲取本身速度達(dá)不到理想的結(jié)果時(shí)。 暫且不討論「PHP 是不是最好的編程語(yǔ)言」,本文我們將分別分析一下在 PHP 程序的后端外圍資源和前端外圍資源,它們對(duì)整個(gè) PHP Web 應(yīng)用體驗(yàn)的影響,這往往比語(yǔ)言本身大得多。 首先,后端外圍資源,是指跟 PHP 運(yùn)行過(guò)程中與語(yǔ)言本身無(wú)關(guān)的網(wǎng)絡(luò)與 IO 操作、存儲(chǔ)服務(wù)、中...
摘要:下面程序員雷雪松就詳細(xì)的看看下如何配置支持下載并安裝,是一套為和允許程序來(lái)跟微軟和數(shù)據(jù)庫(kù)交互的動(dòng)態(tài)庫(kù)。注意的路徑重啟查看已經(jīng)安裝的擴(kuò)展這樣擴(kuò)展就安裝完成了,就可以使用相關(guān)函數(shù)操作數(shù)據(jù)庫(kù)了。原文來(lái)源程序員雷雪松的個(gè)人博客 因?yàn)轫?xiàng)目以前的數(shù)據(jù)庫(kù)為SQLServer(MSSql),客戶希望不要換數(shù)據(jù)庫(kù)。在當(dāng)今客戶就是上帝的理念下,于是只能采用Linux下PHP操作MSSql。由于之前沒(méi)什么經(jīng)...
摘要:本文先簡(jiǎn)要跟蹤底層流的原理,再回到用戶態(tài)中流的使用。底層流我們知道中的函數(shù)可以打開(kāi)本地文件等并返回一個(gè)句柄,函數(shù)能對(duì)資源句柄進(jìn)行讀寫(xiě),用于關(guān)閉資源。更多關(guān)于底層流的操作可參考官方文檔中開(kāi)發(fā)者的流章節(jié),本文不再深入。 轉(zhuǎn)載請(qǐng)注明文章出處: https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎(chǔ) web請(qǐng)求 cookie web響應(yīng) sessi...
摘要:如何構(gòu)建一個(gè)自己的框架為什么我們要去構(gòu)建一個(gè)自己的框架可能絕大多數(shù)的人都會(huì)說(shuō)市面上已經(jīng)那么多的框架了,還造什么輪子。 showImg(https://segmentfault.com/img/bVNg9F?w=500&h=500); 如何構(gòu)建一個(gè)自己的PHP框架 為什么我們要去構(gòu)建一個(gè)自己的PHP框架?可能絕大多數(shù)的人都會(huì)說(shuō)市面上已經(jīng)那么多的框架了,還造什么輪子?。我的觀點(diǎn)造輪子不是目...
摘要:權(quán)限中心的依賴(lài)聲明聲明依賴(lài)關(guān)系檢查代碼規(guī)范聲明開(kāi)發(fā)依賴(lài)命名空間檢查代碼規(guī)范,執(zhí)行單元測(cè)試。單元測(cè)試持續(xù)交付一切都如此的完美,沒(méi)有測(cè)試,又如何可以證明這件事情的完美,又如何可以保障交付的質(zhì)量。 序 權(quán)限管理是無(wú)線運(yùn)營(yíng)系統(tǒng)中的核心模塊,通過(guò)訪問(wèn)控制策略的配置,來(lái)約定人與資源的訪問(wèn)關(guān)系。 本文著重講解如何通過(guò)PHP來(lái)構(gòu)建一個(gè)靈活、通用、安全的權(quán)限管理系統(tǒng)。 關(guān)于權(quán)限 首先我們來(lái)聊聊權(quán)限。 權(quán)...
摘要:性能問(wèn)題一般不會(huì)超過(guò)占整個(gè)項(xiàng)目性能的,一般在。內(nèi)置函數(shù)的性能優(yōu)劣。幾乎與在函數(shù)中調(diào)用局部變量的速度相當(dāng)。遞增一個(gè)全局變量要比遞增一個(gè)局部變量慢倍。類(lèi)似的方法調(diào)用所花費(fèi)的時(shí)間接近于次的局部變量遞增操作。 php性能怎么優(yōu)化?性能是網(wǎng)站運(yùn)行是否良好的關(guān)鍵因素, 網(wǎng)站的性能與效率影響著公司的運(yùn)營(yíng)成本及長(zhǎng)遠(yuǎn)發(fā)展,編寫(xiě)出高質(zhì)高效的代碼是我們每個(gè)開(kāi)發(fā)人員必備的素質(zhì),也是我們良好...
閱讀 2448·2021-11-12 10:34
閱讀 1500·2019-08-29 16:15
閱讀 2708·2019-08-29 15:17
閱讀 1386·2019-08-23 17:09
閱讀 414·2019-08-23 11:37
閱讀 2478·2019-08-23 10:39
閱讀 516·2019-08-22 16:43
閱讀 3140·2019-08-22 14:53