在PHP中,我們經(jīng)常需要連接數(shù)據(jù)庫(kù)以便獲取和存儲(chǔ)數(shù)據(jù),為了能夠完成這一任務(wù),我們可以使用PHP新擴(kuò)展出來(lái)的PDO類。
把PDO類和PHP中已經(jīng)熟悉的mysql_connect函數(shù)做一個(gè)比較,PDO類可以連接到多種類型的數(shù)據(jù)庫(kù),而mysql_connect函數(shù)只能連接到一個(gè)特定的MySQL數(shù)據(jù)庫(kù)。另外,使用PDO類可以讓我們的代碼更加簡(jiǎn)潔且易于維護(hù)。
下面我們來(lái)看一下如何使用PDO來(lái)連接數(shù)據(jù)庫(kù),并執(zhí)行一些簡(jiǎn)單的查詢操作:
//連接數(shù)據(jù)庫(kù) $dsn = 'mysql:host=localhost;dbname=mydb'; //驅(qū)動(dòng)類型:host=主機(jī)名;dbname=數(shù)據(jù)庫(kù)名 $username = 'username'; $password = 'password'; $options = array(PDO::MYSQL_ATTR_INIT_COMMAND =>'SET NAMES utf8'); try { $pdo = new PDO($dsn, $username, $password, $options); } catch (PDOException $e) { echo 'Connection failed: ' . $e->getMessage(); } //查詢語(yǔ)句 $sql = "SELECT * FROM mytable WHERE id = :id"; $statement = $pdo->prepare($sql); $statement->bindParam(':id', $id); $id = 1; $statement->execute(); $result = $statement->fetch(PDO::FETCH_ASSOC); echo $result['name'];
我們使用PDO的關(guān)鍵是$pdo變量,它代表數(shù)據(jù)庫(kù)連接,我們通過(guò)設(shè)置其參數(shù)來(lái)連接數(shù)據(jù)庫(kù)。$dsn變量指定驅(qū)動(dòng)類型、主機(jī)名和數(shù)據(jù)庫(kù)名,$username和$password變量分別指定連接到數(shù)據(jù)庫(kù)所需的用戶名和密碼,$options變量是可選參數(shù),本例中通過(guò)設(shè)置它,我們指定了使用utf-8編碼。
接著,我們使用prepare()函數(shù)來(lái)創(chuàng)建一個(gè)準(zhǔn)備好的SQL語(yǔ)句,通過(guò)使用bindParam()函數(shù)把變量$id和:id綁定,防止SQL注入攻擊。$id變量的值被賦為1,$statement->execute()函數(shù)執(zhí)行了查詢操作,返回一個(gè)結(jié)果集,我們使用fetch()函數(shù)從結(jié)果集中獲取我們需要的那行記錄。最后,我們用echo語(yǔ)句將該記錄中name字段的值輸出。
在使用PDO時(shí),一定要注意SQL注入攻擊的問(wèn)題,而使用PDO的預(yù)處理語(yǔ)句可以有效地解決這個(gè)問(wèn)題。在上面的例子中,我們使用bindParam()函數(shù)來(lái)綁定變量,這就可以避免同一SQL語(yǔ)句被執(zhí)行多次。PDO預(yù)處理語(yǔ)句還支持在執(zhí)行之后對(duì)結(jié)果集進(jìn)行命名或者改變類型等操作,這些都能夠讓我們的代碼更加健壯,安全和靈活。
總結(jié)來(lái)看,PDO類是PHP中一個(gè)非常有用的類,通過(guò)它,我們可以連接通不同類型的數(shù)據(jù)庫(kù),有效地解決SQL注入攻擊的問(wèn)題,而且使用上也非常簡(jiǎn)單,在很多開發(fā)中都會(huì)很有幫助。