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