大約 80% 的 Web 應用程序由 PHP 提供支持。相似地,SQL 也是如此。PHP 5.5 版本以前,咱們有用於訪問 MySQL 數據庫的 mysql_ 命令,但因爲安全性不足,它們最終被棄用。mysql
棄用這件事是發生在 2013 年的 PHP 5.5 上,我寫這篇文章的時間是 2018 年,PHP 版本爲 7.2。mysql_ 的棄用帶來了訪問數據庫的兩種主要方法:mysqli 和 PDO 庫。linux
雖然 mysqli 庫是官方指定的,但因爲 mysqli 只能支持 mysql 數據庫,而 PDO 能夠支持 12 種不一樣類型的數據庫驅動程序,所以 PDO 得到了更多的讚譽。此外,PDO 還有其它一些特性,使其成爲大多數開發人員的更好選擇。你能夠在下表中看到一些特性比較:git
PDO | MySQLi | |
---|---|---|
數據庫支持 | 12 種驅動 | 只有 MySQL |
範例 | OOP | 過程 + OOP |
預處理語句(客戶端側) | Yes | No |
1命名參數 | Yes | No |
如今我想對於大多數開發人員來講,PDO 是首選的緣由已經很清楚了。因此讓咱們深刻研究它,並但願在本文中儘可能涵蓋關於 PDO 你須要的瞭解的。github
第一步是鏈接到數據庫,因爲 PDO 是徹底面向對象的,因此咱們將使用 PDO 類的實例。sql
咱們要作的第一件事是定義主機、數據庫名稱、用戶名、密碼和數據庫字符集。數據庫
$host = 'localhost';
$db = 'theitstuff';
$user = 'root';
$pass = 'root';
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$conn = new PDO($dsn, $user, $pass);
複製代碼
以後,正如你在上面的代碼中看到的,咱們建立了 DSN 變量,DSN 變量只是一個保存數據庫信息的變量。對於一些在外部服務器上運行 MySQL 的人,你還能夠經過提供一個 port=$port_number
來調整端口號。數組
最後,你能夠建立一個 PDO 類的實例,我使用了 $conn
變量,並提供了 $dsn
、$user
、$pass
參數。若是你遵循這些步驟,你如今應該有一個名爲 $conn
的對象,它是 PDO 鏈接類的一個實例。如今是時候進入數據庫並運行一些查詢。安全
如今讓咱們運行一個簡單的 SQL 查詢。bash
$tis = $conn->query('SELECT name, age FROM students');
while ($row = $tis->fetch())
{
echo $row['name']."\t";
echo $row['age'];
echo "<br>";
}
複製代碼
這是使用 PDO 運行查詢的最簡單形式。咱們首先建立了一個名爲 tis
(TheITStuff 的縮寫 )的變量,而後你能夠看到咱們使用了建立的 $conn
對象中的查詢函數。服務器
而後咱們運行一個 while
循環並建立了一個 $row
變量來從 $tis
對象中獲取內容,最後經過調用列名來顯示每一行。
很簡單,不是嗎?如今讓咱們來看看預處理語句。
預處理語句是人們開始使用 PDO 的主要緣由之一,由於它提供了能夠阻止 SQL 注入的語句。
有兩種基本方法可供使用,你能夠使用位置參數或命名參數。
讓咱們看一個使用位置參數的查詢示例。
$tis = $conn->prepare("INSERT INTO STUDENTS(name, age) values(?, ?)");
$tis->bindValue(1,'mike');
$tis->bindValue(2,22);
$tis->execute();
複製代碼
在上面的例子中,咱們放置了兩個問號,而後使用 bindValue()
函數將值映射到查詢中。這些值綁定到語句問號中的位置。
我還能夠使用變量而不是直接提供值,經過使用 bindParam()
函數相同例子以下:
$name='Rishabh'; $age=20;
$tis = $conn->prepare("INSERT INTO STUDENTS(name, age) values(?, ?)");
$tis->bindParam(1,$name);
$tis->bindParam(2,$age);
$tis->execute();
複製代碼
命名參數也是預處理語句,它將值/變量映射到查詢中的命名位置。因爲沒有位置綁定,所以在屢次使用相同變量的查詢中很是有效。
$name='Rishabh'; $age=20;
$tis = $conn->prepare("INSERT INTO STUDENTS(name, age) values(:name, :age)");
$tis->bindParam(':name', $name);
$tis->bindParam(':age', $age);
$tis->execute();
複製代碼
你能夠注意到,惟一的變化是我使用 :name
和 :age
做爲佔位符,而後將變量映射到它們。冒號在參數以前使用,讓 PDO 知道該位置是一個變量,這很是重要。
你也能夠相似地使用 bindValue()
來使用命名參數直接映射值。
PDO 在獲取數據時很是豐富,它實際上提供了許多格式來從數據庫中獲取數據。
你能夠使用 PDO::FETCH_ASSOC
來獲取關聯數組,PDO::FETCH_NUM
來獲取數字數組,使用 PDO::FETCH_OBJ
來獲取對象數組。
$tis = $conn->prepare("SELECT * FROM STUDENTS");
$tis->execute();
$result = $tis->fetchAll(PDO::FETCH_ASSOC);
複製代碼
你能夠看到我使用了 fetchAll
,由於我想要全部匹配的記錄。若是隻須要一行,你能夠簡單地使用 fetch
。
如今咱們已經獲取了數據,如今是時候循環它了,這很是簡單。
foreach ($result as $lnu){
echo $lnu['name'];
echo $lnu['age']."<br>";
}
複製代碼
你能夠看到,由於我請求了關聯數組,因此我正在按名稱訪問各個成員。
雖然在定義但願如何傳輸遞數據方面沒有要求,但在定義 $conn
變量自己時,實際上能夠將其設置爲默認值。
你須要作的就是建立一個 $options
數組,你能夠在其中放入全部默認配置,只需在 $conn
變量中傳遞數組便可。
$options = [
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];
$conn = new PDO($dsn, $user, $pass, $options);
複製代碼
這是一個很是簡短和快速的 PDO 介紹,咱們很快就會製做一個高級教程。若是你在理解本教程的任何部分時遇到任何困難,請在評論部分告訴我,我會在那你爲你解答。
via: www.theitstuff.com/easiest-pdo…
做者:Rishabh Kandari 選題:lujun9972 譯者:MjSeven 校對:wxy