您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關php中PDO對象如何安裝配置與使用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
PHP 數據對象 (PDO) 擴展為PHP訪問數據庫定義了一個輕量級的一致接口。實現 PDO 接口的每個數據庫驅動可以公開具體數據庫的特性作為標準擴展功能。 注意利用 PDO 擴展自身并不能實現任何數據庫功能;必須使用一個 具體數據庫的 PDO 驅動 來訪問數據庫服務。
PDO 提供了一個 數據訪問 抽象層,這意味著,不管使用哪種數據庫,都可以用相同的函數(方法)來查詢和獲取數據。 PDO 不提供 數據庫 抽象層;它不會重寫 SQL,也不會模擬缺失的特性。如果需要的話,應該使用一個成熟的抽象層。
PDO 和所有主要的驅動作為共享擴展隨 PHP 一起發布,要激活它們只需簡單地編輯 php.ini 文件:
extension=php_pdo.dll
注意:這一步在 PHP 5.3及更高版本中不是必須的,對于 PDO 不再需要做為一個 DLL 文件。
若要連接數據庫,還需要去掉與PDO相關的數據庫擴展前面的”;"號,然后重啟Apache服務器即可。
extension=php_pdo.dll extension=php_pdo_firebird.dll extension=php_pdo_informix.dll extension=php_pdo_mssql.dll extension=php_pdo_mysql.dll extension=php_pdo_oci.dll extension=php_pdo_oci8.dll extension=php_pdo_odbc.dll extension=php_pdo_pgsql.dll extension=php_pdo_sqlite.dll
PDO::__construct — 創建一個表示數據庫連接的 PDO 實例
說明
PDO::__construct ( string $dsn , string $username = ? , string $password = ? , array $driver_options = ? )
參數
dsn
數據源名稱或叫做 DSN,包含了請求連接到數據庫的信息。 通常,一個 DSN 由 PDO 驅動名、緊隨其后的冒號、以及具體 PDO 驅動的連接語法組成。示例:
mysql:host=localhost;dbname=pxscj
username
DSN字符串中的用戶名。對于某些PDO驅動,此參數為可選項。
password
DSN字符串中的密碼。對于某些PDO驅動,此參數為可選項。
driver_options
一個具體驅動的連接選項的鍵=>值數組。
返回值
成功則返回一個PDO對象。
示例
<?php/* Connect to an ODBC database using driver invocation */$dsn = 'mysql:host=localhost;dbname=pxscj';$user = 'user';$password = '123456';try { $dbh = new PDO($dsn, $user, $password);} catch (PDOException $e) { echo 'Connection failed: ' . $e->getMessage();}?>
PDO::exec — 執行一條 SQL 語句,并返回受影響的行數
說明
PDO::exec ( string $statement ) : int
參數
statement
要被預處理和執行的 SQL 語句。
見解:此處statement應妥善處理用戶的輸入防止被SQL注入
返回值
PDO::exec() 返回受修改或刪除 SQL 語句影響的行數。如果沒有受影響的行,則 PDO::exec() 返回 0。
示例
<?php$db=new PDO("mysql:host=localhost;dbname=PXSCJ","user","123456");$delete_sql="delete from userinfo where username='user1'"; //注銷自己的SQL語句$affected=$db->exec($delete_sql); //執行沒有返回的sql語句$delete_sqlif($affected) //如果受影響記錄數不為0 echo "注銷用戶成功!";else echo "注銷用戶失敗!";?>
PDO::query — 執行 SQL 語句,以 PDOStatement 對象形式返回結果集
說明
public PDO::query ( string $statement ) : PDOStatement
參數
statement
需要準備、執行的 SQL 語句。
返回值
PDO::query() 返回 PDOStatement 對象,或在失敗時返回 false。
示例
<?php$db=new PDO("mysql:host=localhost;dbname=pxscj","user","123456");$query="select * from kcb"; //SQL語句foreach($db->query($query) as $row) { //執行SQL語句$query--執行有結果集的SQL語句 echo "課程號:".$row[0]."<br>"; //返回的是一個PDOStatement類(型)的對象 echo "課程名:".$row[1]."<br>"; //還可以用PDOStatement類的方法fetch()行讀 echo "開課日期:".$row[2]."<br>"; echo "學時:".$row[3]."<br><br>";}?>
PDO::prepare — 準備要執行的語句,并返回語句對象
說明
public PDO::prepare ( string $statement , array $driver_options = array() ) : PDOStatement
為PDOStatement::execute() 方法準備待執行的 SQL 語句。 SQL 語句可以包含零個或多個參數占位標記,格式是命名(:name)或問號(?)的形式,當它執行時將用真實數據取代。 在同一個 SQL 語句里,命名形式和問號形式不能同時使用;只能選擇其中一種參數形式。 注:用參數形式綁定用戶輸入的數據,不要直接字符串拼接到查詢里,防SQL注入
參數
statement
必須是對目標數據庫服務器有效的 SQL 語句模板。
driver_options
數組包含一個或多個 key=>value 鍵值對,為返回的 PDOStatement 對象設置屬性。
返回值
如果數據庫服務器完成準備了語句, PDO::prepare() 返回 PDOStatement 對象。 如果數據庫服務器無法準備語句, PDO::prepare() 返回 false 或拋出 PDOException (取決于 錯誤處理器)。
注:模擬模式下的 prepare 語句不會和數據庫服務器交互,所以 PDO::prepare() 不會檢查語句。
示例
$db=new PDO("mysql:host=localhost;dbname=pxscj","user","123456");$in_sql="insert into userinfo(username,password,sex,age,email) values(?,?,?,?,?)"; $in_result=$db->prepare($in_sql); //預處理SQL語句$in_sql$userid="php3"; $pwd1="111111"; $sex=0; $age=36; $email="php3@qq.com";$in_result->bindParam(1, $userid); //PDOStatement的bindParam()的作用是綁定參數給execute()$in_result->bindParam(2, $pwd1); //SQL語句使用問號參數時--bindParam()第一個參數是問號索引偏移(第幾個)$in_result->bindParam(3, $sex); //bindParam()第二個參數是賦值給SQL語句參數(問號)的變量$in_result->bindParam(4, $age); $in_result->bindParam(5, $email);$in_result->execute(); //執行經過預處理的SQL語句$in_resultif($in_result->rowCount()==0) //用PDOStatement的rowCount()返回結果集行的總數 echo "插入記錄失敗!";else echo "插入記錄成功!";
PDO::beginTransaction — 啟動一個事務
說明
PDO::beginTransaction():bool
返回值
成功時返回 true, 或者在失敗時返回 false。
PDO::rollBack — 回滾一個事務
說明
PDO::rollBack():bool
回滾由 PDO::beginTransaction() 發起的當前事務。如果沒有事務激活,將拋出一個 PDOException 異常。
如果數據庫被設置成自動提交模式,此函數(方法)在回滾事務之后將恢復自動提交模式。
返回值
成功時返回 true, 或者在失敗時返回 false。
示例
<?php/* 開始一個事務,關閉自動提交 */$dbh->beginTransaction();/* 更改數據庫架構和數據 */$sth = $dbh->exec("DROP TABLE fruit");$sth = $dbh->exec("UPDATE dessert SET name = 'hamburger'");/* 識別錯誤且回滾更改 */$dbh->rollBack();/* 此時數據庫連接恢復到自動提交模式 */?>
PDO::beginTransaction — 啟動一個事務 PDO::commit — 提交一個事務 PDO::__construct — 創建一個表示數據庫連接的 PDO 實例 PDO::errorCode — 獲取跟數據庫句柄上一次操作相關的 SQLSTATE PDO::errorInfo — Fetch extended error information associated with the last operation on the database handle PDO::exec — 執行一條 SQL 語句,并返回受影響的行數 PDO::getAttribute — 取回一個數據庫連接的屬性 PDO::getAvailableDrivers — 返回一個可用驅動的數組 PDO::inTransaction — 檢查是否在一個事務內 PDO::lastInsertId — 返回最后插入行的ID或序列值 PDO::prepare — 準備要執行的語句,并返回語句對象 PDO::query — 執行 SQL 語句,以 PDOStatement 對象形式返回結果集 PDO::quote — 為 SQL 查詢里的字符串添加引號 PDO::rollBack — 回滾一個事務 PDO::setAttribute — 設置屬性
PDOStatement::bindParam — 綁定一個參數到指定的變量名
說明
PDOStatement::bindParam ( mixed $parameter , mixed &$variable , int $data_type = PDO::PARAM_STR , int $length = ? , mixed $driver_options = ? ):bool
綁定一個PHP變量到用作預處理的SQL語句中的對應命名占位符或問號占位符。 不同于 PDOStatement::bindValue() ,此變量作為引用被綁定,并只在 PDOStatement::execute() 被調用的時候才取其值。
返回值
成功時返回 true, 或者在失敗時返回 false。
參數
parameter
參數標識符。對于使用命名占位符的預處理語句,應是類似 :name 形式的參數名。對于使用問號占位符的預處理語句,應是以1開始索引的參數位置。
variable
綁定到 SQL 語句參數的 PHP 變量名。
data_type
使用 PDO::PARAM_* 常量明確地指定參數的類型。要從一個存儲過程中返回一個 INOUT 參數,需要為 data_type 參數使用按位或操作符去設置 PDO::PARAM_INPUT_OUTPUT 位。
length
數據類型的長度。為表明參數是一個存儲過程的 OUT 參數,必須明確地設置此長度。
driver_options
示例
<?php/* 通過綁定的 PHP 變量執行一條預處理語句 */$calories = 150;$colour = 'red';$sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour');$sth->bindParam(':calories', $calories, PDO::PARAM_INT);$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);$sth->execute();?>
PDOStatement::bindParam — 綁定一個參數到指定的變量名
說明
PDOStatement::execute ( array $input_parameters = ? ) : bool
執行預處理過的語句。如果預處理過的語句含有參數標記,必須選擇下面其中一種做法:
1)調用 PDOStatement::bindParam() 綁定 PHP 變量到參數標記:如果有的話,通過關聯參數標記綁定的變量來傳遞輸入值和取得輸出值
2)或傳遞一個只作為輸入參數值的數組
返回值
成功時返回 true, 或者在失敗時返回 false。
參數
input_parameters
示例
<?php/* 通過傳遞一個含有插入值的數組執行一條預處理語句 */$calories = 150;$colour = 'red';$sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour');$sth->execute(array(':calories' => $calories, ':colour' => $colour));?>
PDOStatement::fetch — 從結果集中獲取下一行
說明
PDOStatement::fetch ( int $fetch_style = ? , int $cursor_orientation = PDO::FETCH_ORI_NEXT , int $cursor_offset = 0 ):mixed
從一個 PDOStatement 對象相關的結果集中獲取下一行。fetch_style 參數決定 POD 如何返回行。
返回值
此函數(方法)成功時返回的值依賴于提取類型。在所有情況下,失敗都返回 false 。
參數
fetch_style
控制下一行如何返回給調用者。此值必須是 PDO::FETCH_* 系列常量中的一個,缺省為 PDO::ATTR_DEFAULT_FETCH_MODE 的值 (默認為 PDO::FETCH_BOTH )。
PDO::FETCH_ASSOC:返回一個索引為結果集列名的數組 PDO::FETCH_BOTH(默認):返回一個索引為結果集列名和以0開始的列號的數組 PDO::FETCH_BOUND:返回 true ,并分配結果集中的列值給 PDOStatement::bindColumn() 方法綁定的 PHP 變量。 PDO::FETCH_CLASS:返回一個請求類的新實例,映射結果集中的列名到類中對應的屬性名。如果 fetch_style 包含 PDO::FETCH_CLASSTYPE(例如:PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE),則類名由第一列的值決定 PDO::FETCH_INTO:更新一個被請求類已存在的實例,映射結果集中的列到類中命名的屬性 PDO::FETCH_LAZY:結合使用 PDO::FETCH_BOTH 和 PDO::FETCH_OBJ,創建供用來訪問的對象變量名 PDO::FETCH_NUM:返回一個索引為以0開始的結果集列號的數組 PDO::FETCH_OBJ:返回一個屬性名對應結果集列名的匿名對象
cursor_orientation
對于 一個 PDOStatement 對象表示的可滾動游標,該值決定了哪一行將被返回給調用者。此值必須是PDO::FETCH_ORI_* 系列常量中的一個,默認為 PDO::FETCH_ORI_NEXT。
offset
對于一個 cursor_orientation 參數設置為 PDO::FETCH_ORI_ABS 的PDOStatement 對象代表的可滾動游標,此值指定結果集中想要獲取行的絕對行號。
示例
<?php$sth = $dbh->prepare("SELECT name, colour FROM fruit");$sth->execute();/* 運用 PDOStatement::fetch 風格 */print("PDO::FETCH_ASSOC: ");print("Return next row as an array indexed by column name\n");$result = $sth->fetch(PDO::FETCH_ASSOC);print_r($result);print("\n");?>
PDOStatement::fetchAll — 返回一個包含結果集中所有行的數組
說明
PDOStatement::fetchAll ( int $fetch_style = ? , mixed $fetch_argument = ? , array $ctor_args = array() ):array
返回值
PDOStatement::fetchAll() 返回一個包含結果集中所有剩余行的數組。此數組的每一行要么是一個列值的數組,要么是屬性對應每個列名的一個對象。
注:使用此方法獲取大結果集將導致系統負擔加重且可能占用大量網絡資源。與其取回所有數據后用PHP來操作,倒不如考慮使用數據庫服務來處理結果集。例如,在取回數據并通過PHP處理前,在 SQL 中使用 WHERE 和 ORDER BY 子句來限定結果。
參數
fetch_style
控制返回數組的內容如同 PDOStatement::fetch()一樣。默認為 PDO::ATTR_DEFAULT_FETCH_MODE 的值( 其缺省值為 PDO::FETCH_BOTH )想要返回一個包含結果集中單獨一列所有值的數組,需要指定 PDO::FETCH_COLUMN 。通過指定 column-index 參數獲取想要的列。
fetch_argument
根據 fetch_style 參數的值,此參數有不同的意義:
PDO::FETCH_COLUMN:返回指定以0開始索引的列。
PDO::FETCH_CLASS:返回指定類的實例,映射每行的列到類中對應的屬性名。
PDO::FETCH_FUNC:將每行的列作為參數傳遞給指定的函數,并返回調用函數后的結果。
ctor_args
當 fetch_style 參數為 PDO::FETCH_CLASS 時,自定義類的構造函數的參數。
示例
<?php$sth = $dbh->prepare("SELECT name, colour FROM fruit");$sth->execute();/* 獲取結果集中所有剩余的行 */print("Fetch all of the remaining rows in the result set:\n");$result = $sth->fetchAll();print_r($result);?>
PDOStatement::rowCount — 返回受上一個 SQL 語句影響的行數
說明
PDOStatement::rowCount():int
PDOStatement::rowCount() 返回上一個由對應的 PDOStatement 對象執行DELETE、 INSERT、或 UPDATE 語句受影響的行數。
如果上一條由相關 PDOStatement 執行的 SQL 語句是一條 SELECT 語句,有些數據可能返回由此語句返回的行數。但這種方式不能保證對所有數據有效,且對于可移植的應用不應依賴于此方式。
返回值
返回行數。
示例
<?php/* 從 FRUIT 數據表中刪除所有行 */$del = $dbh->prepare('DELETE FROM fruit');$del->execute();/* 返回被刪除的行數 */print("Return number of rows that were deleted:\n");$count = $del->rowCount();print("Deleted $count rows.\n");?>
PDOStatement::bindColumn — 綁定一列到一個 PHP 變量 PDOStatement::bindParam — 綁定一個參數到指定的變量名 PDOStatement::bindValue — 把一個值綁定到一個參數 PDOStatement::closeCursor — 關閉游標,使語句能再次被執行。 PDOStatement::columnCount — 返回結果集中的列數 PDOStatement::debugDumpParams — 打印一條 SQL 預處理命令 PDOStatement::errorCode — 獲取跟上一次語句句柄操作相關的 SQLSTATE PDOStatement::errorInfo — 獲取跟上一次語句句柄操作相關的擴展錯誤信息 PDOStatement::execute — 執行一條預處理語句 PDOStatement::fetch — 從結果集中獲取下一行 PDOStatement::fetchAll — 返回一個包含結果集中所有行的數組 PDOStatement::fetchColumn — 從結果集中的下一行返回單獨的一列。 PDOStatement::fetchObject — 獲取下一行并作為一個對象返回。 PDOStatement::getAttribute — 檢索一個語句屬性 PDOStatement::getColumnMeta — 返回結果集中一列的元數據 PDOStatement::nextRowset — 在一個多行集語句句柄中推進到下一個行集 PDOStatement::rowCount — 返回受上一個 SQL 語句影響的行數 PDOStatement::setAttribute — 設置一個語句屬性 PDOStatement::setFetchMode — 為語句設置默認的獲取模式。
以上PDO類及PDOStatement類的說明摘錄自php開發手冊,詳細描述只摘錄了常用的幾個內部函數。實話實說對于一個程序員最好的提升技術的方法之一就是看文檔,通過查閱文檔可以解決我們在開發中遇到的許多問題,而且通過文檔我們可以知道很多api使用的細節和注意點,幫助我們規避很多錯誤。總而言之遇到問題看文檔,多百度,多看博客,多總結,這才是長久的學習之道。
多說不做也是不行的,練習才是技術提升的必由之路,練習實踐才可以在其中發現問題,提升自己,下面代碼是我對PDO的一些常見用法的整理:
try { $db=new PDO("mysql:host=localhost;dbname=pxscj","user","123456"); }catch (PDOException $e) { echo "數據庫連接失敗:".$e->getMessage(); }$db->exec("set names utf-8"); //插入 $query="insert into kcb values('606','PHP程序設計',6,48,3)"; if($affCount=$db->exec($query)) { echo "插入成功,受影響條數為:".$affCount."<br><br>"; }//查詢$query="select * from kcb"; foreach($db->query($query) as $row) { echo "課程號:".$row[0]."<br>"; echo "課程名:".$row[1]."<br>"; echo "開課日期:".$row[2]."<br>"; echo "學時:".$row[3]."<br><br>";}//事務處理try { $db->exec("set names utf-8"); $db->beginTransaction(); $affrows=$db->exec("insert into kcb values('506','UML系統分析',5,48,3)"); if(!$affrows) throw new PDOException("插入失敗1"); $affrows=$db->exec("insert into kcb values('606','PHP程序設計',6,32,2)"); if(!$affrows) throw new PDOException("插入失敗2"); echo "插入成功!"; $db->commit(); }catch (PDOException $e) { echo $e->getMessage(); $db->rollBack(); //回滾(要么成功要么失敗)}//prepare 可以防sql注入$in_sql="insert into userinfo(username,password,sex,age,email) values(?,?,?,?,?)"; $in_result=$db->prepare($in_sql); $userid="php3"; $pwd1="111111"; $sex=0; $age=36; $email="php3@qq.com";$in_result->bindParam(1, $userid); $in_result->bindParam(2, $pwd1); $in_result->bindParam(3, $sex); $in_result->bindParam(4, $age); $in_result->bindParam(5, $email);$in_result->execute(); if($in_result->rowCount()==0) echo "插入記錄失敗!";else echo "插入記錄成功!";//更新 改密碼$oldpwd=$_POST['oldpwd']; //原密碼$newpwd=$_POST['newpwd']; //新密碼$s_sql="select * from userinfo where username='$username'"; //SQL語句$s_result=$db->query($s_sql); list($username,$password,$sex,$age,$email)=$s_result->fetch(PDO::FETCH_NUM);if($password!=$oldpwd) //判斷原密碼是否正確 echo "原密碼錯誤!";else { $checkpwd=preg_match('/^\w{6,20}$/',$newpwd);if(!$checkpwd) echo "新密碼格式不滿足要求!";else { $update_sql="update userinfo set password='$newpwd' where username='$username'"; $affected=$db->exec($update_sql); if($affected) echo"密碼修改成功!"; else echo "密碼修改失敗!"; }}//刪除 注銷session_start();$username=@$_SESSION['userid'];$delete_sql="delete from userinfo where username='$username'"; //注銷自己的SQL語句$affected=$db->exec($delete_sql); if($affected) echo "注銷用戶成功!";else echo "注銷用戶失敗!";
軟件開發框架總是有很多互通的地方,因為無論任何開發語言,java或者php底層實現都離不開數據結構,算法,還有軟件設計模式,而這些都是互通的,而好的軟件框架離不開設計模式運用.
自從學習php接觸了解到PDO對象擴展時我便聯想到我曾使用的springboot JPA持久層框架,于是我查了些資料,以下便是我的個人理解:
首先先解釋一下PDO和JPA的概念
PDO
PHP 數據對象(PHP Data Objects) 擴展為PHP訪問數據庫定義了一個輕量級的一致接口。
PDO 提供了一個 數據訪問 抽象層,這意味著,不管使用哪種數據庫,都可以用相同的函數(方法)來查詢和獲取數據。PDO 不提供 數據庫 抽象層;它不會重寫 SQL,也不會模擬缺失的特性。如果需要的話,應該使用一個成熟的抽象層。
PDO架構概念圖
JPA
JPA是Java Persistence API的簡稱,中文名Java持久層API,是JDK 5.0注解或XML描述對象-關系表的映射關系,并將運行期的實體對象持久化到數據庫中。
JPA僅僅是一種規范,也就是說JPA僅僅定義了一些接口,而接口是需要實現才能工作的。所以底層需要某種實現,而Hibernate就是實現了JPA接口的ORM框架。
JPA 概念關系圖
從上述概念和架構圖可以看出PDO和JPA還是有一定區別的。首先PHP的PDO只是一個抽象的數據訪問接口層,它對數據庫的訪問還要依賴相應的數據庫驅動,而且需要自行編寫操作數據的SQL語句。
而java的JPA則是一個持久層規范,也就是說JPA僅僅定義了一些接口,這些接口是關于類和數據庫表的映射的,也就是說,JPA這個規范在數據訪問接口層之上,而真正實現這個規范和底層數據訪問接口是在如Hibernate的這些數據持久層框架內.
以Hibernate這個持久層框架為例,它實現了對象和數據庫表的映射關系,僅需要操作相應的訪問DAO層接口即可實現數據庫的查詢并轉換為java對象內部屬性數據。而Hibernate底層對數據庫的訪問還得依賴JDBC接口。
由此可見PDO和JPA規范完全處于兩個不同層次,JPA是數據訪問方法底層的高層次抽象,而PDO僅相當于java的JDBC接口層。PDO的抽象層次相對較低,這也符合PHP的輕量級web開發語言
的特點,這也是它的一個優點,可以方便清晰地實現一些復雜的數據庫訪問操作,但不利于復雜的高抽象度的大型項目的開發.
以上內容為個人對PHP PDO對象和java JPA規范的一些理解和比較,水平有限,可能會有不準確的地方。
php使用mysql原生密碼連接如
$conn=mysqli_connect('localhost','user','123456')or die('連接失敗');
會出現錯誤:The server requested authentication method unknown to the client.
原因:
由于本地使用mysql版本在8.0以上,而mysql 8升級了密碼的驗證方式 caching_sha2_password,所以原生連接會失敗,解決辦法使用sql修改用戶登錄驗證方式:
use mysql;ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密碼';
php使用mysqli或pdo的query方法查詢時,如未對用戶表單輸入數據進行處理可能會存在SQL注入隱患,如
$username=$_POST['username'];$password=$_POST['password']; //magic_quotes_gpc設為off的情況下//mysql$conn = mysqli_connect("localhost", "user" ,"123456") or die('連接失敗'); //mysql_connect()鏈接MySQL服務器mysqli_select_db($conn,'PXSCJ') or die('選擇數據庫失敗'); //mysql_select_db()選擇數據庫mysqli_query($conn,"SET NAMES utf-8");//設置字符集為utf-8$str="select * from userinfo where username='$username' and password='$password'";$result=mysqli_query($conn,$str); //PDO//連接數據庫,新建PDO對象$pdo=new PDO("mysql:host=localhost;dbname=pxscj","user","123456");$str="select * from userinfo where username='$username' and password='$password'";$result=$pdo->query($str);
當用戶輸入username值為user
,password值為123 ' or 1=1
,即查詢sql被轉義為:
select * from userinfo where username='user' and password='123 ' or ' 1=1'
則用戶將跳過密碼的查詢驗證得到所有userinfo的數據,并且還存在其他SQL語句越權執行的風險
處理風險的方法有以下幾種:
addslashes()函數轉義
$password=addslashes($password);
addslashes()
函數返回在預定義字符之前添加反斜杠的字符串。預定義字符是:單引號(')
雙引號(")
反斜杠(\)
NULL
使用PDO對象的prepare()方法
$sql="select * from userinfo where username='$username' and password='$password'";//注意不是中文狀態下的問號? $result=$pdo->prepare($sql); //按照?的順序綁定參數值 $result->bindParam(1,$username); $result->bindParam(2,$password); $result->execute();
關于“php中PDO對象如何安裝配置與使用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。