PHP Data Objects(PDO) 很早就隨著PHP 5一起推出,但是多數的人還是使用mysql或mysqli的方式與資料庫進行連結,究竟PDO有什麼更多的好處?又該怎麼使用?我們將在這篇文章中,進行關於PDO簡單的簡介和使用的說明。
為什麼不用mysql或mysqli?
首先,為什麼我們不繼續使用mysql或mysqli就好了呢?
1.PDO為物件導向的設計:使用物件導向的PDO,將可以節省更多的時間。
2.PDO為一抽象概念的設計:過去我們連結不同資料庫時(例如,mysql, PostgreSQL, MS SQL Server、SQLite),都需要使用不同的語法(例如,mysql_connect, mssql_connect, pq_connect)。但PDO的特性,是把存取資料庫的動作抽象化,讓使用者可以使用一致的方式存取和處理資料的作業。
3.你可以將存取出來的資料存入物件當中。
PDO的啟用
檢驗PDO是否啟用
首先,如果你使用的是PHP5.5以上的版本,你很有可能已經有內建PDO,但是你沒使用過,或者還沒啟用而已。
要檢驗PDO是否啟用,請建立一份php文件,輸入
<? phpinfo(); ?>
應該會看到一系列和php有關的資訊,這裡你也可以順便檢視php的版本。
接著搜尋PDO,如果你有找到相對應的欄位和資料庫,表示你的PDO已經啟用了,可以直接進到操作的部分。
如果找不到PDO相關的資料,或者是找到了PDO相關的資料,但是沒有找到你所使用到的資料庫,那麼必須進一步啟用PDO。
開啟PDO
首先透過windows搜尋php.ini,並且打開該文件。
像我的路徑是c:/appserv/php6/ext
我們就到這個資料夾裡面看一下,看看是不是已經有PDO相關的擴充元件了。這裡我可以看到,我的PHP裡面已經有PDO相關的元件了,代表只是未啟用而已。
啟用PDO的方式很簡單,首先一樣回到php.ini這個文件,接著在剛剛找到的extension_dir下方,可以看到許多的extension相關的元件。
只要把和pdo相關字串,最前面的分號(;)拿掉就可以了,如果你找不到和pdo相關的字串,就請自己加上去,讓它長得向這樣(這裡因為我只用到mysql資料庫,所以我只啟用mysql的pdo,若使用的是不同的資料庫,則根據.dll檔的檔名,套用相關的extension就可以了。
接著搜尋PDO,如果你有找到相對應的欄位和資料庫,表示你的PDO已經啟用了,可以直接進到操作的部分。
如果找不到PDO相關的資料,或者是找到了PDO相關的資料,但是沒有找到你所使用到的資料庫,那麼必須進一步啟用PDO。
開啟PDO
首先透過windows搜尋php.ini,並且打開該文件。
搜尋extension_dir,這裡你可以看到你的擴充功能是放在那個資料夾中。
我們就到這個資料夾裡面看一下,看看是不是已經有PDO相關的擴充元件了。這裡我可以看到,我的PHP裡面已經有PDO相關的元件了,代表只是未啟用而已。
啟用PDO的方式很簡單,首先一樣回到php.ini這個文件,接著在剛剛找到的extension_dir下方,可以看到許多的extension相關的元件。
只要把和pdo相關字串,最前面的分號(;)拿掉就可以了,如果你找不到和pdo相關的字串,就請自己加上去,讓它長得向這樣(這裡因為我只用到mysql資料庫,所以我只啟用mysql的pdo,若使用的是不同的資料庫,則根據.dll檔的檔名,套用相關的extension就可以了。
最後重起你的伺服器,再重新去開phpinfo()的頁面,應該就可以看到PDO已經被開啟了。
我這裡使用的apache,所以就直接重新啟動apache伺服器。
沒有PDO套件
如果你們沒有PDO相關的套件的話,除了透過升級PHP來取得之外,可能要自己上網搜尋安裝的方式,這部分就不是這篇文章著墨的地方。
PDO簡易操作
連結資料庫
PDO連結資料庫的方式很簡單,只需要輸入
#連結資料庫 $connection = new PDO('mysql:host=localhost;dbname=pdo_example;charset=utf8', 'root', '12345678');
其中開頭的地方可以選擇資料庫的類型,後面則是資料庫的名稱(dbname),最後則是資料庫的帳號和密碼。
執行Query
首先,我們可以執行插入資料(Insert Into)的指令,我的資料表包含三個欄位,分別是sn, user和pwd,輸入以下指令,我就可以把資料寫進資料庫中:
#執行Query $connection->exec('INSERT INTO pdo VALUES ("","PJCHENder", 12345678)');
透過資料的鍵入,我們最後資料表中包含以下資料:
取得Query的結果
最基本的寫法,我們可以直接透過foreach來獲取資料:
#查詢Query的結果 $statement = $connection->query('select * from pdo'); foreach($statement as $row){ echo $row['user']." ".$row['pwd']."<br>"; }
我們就可以獲得如下的結果:
我們也可以進一步使用while的方式來取的所有的資料:
while($row = $statement->fetch(PDO::FETCH_ASSOC)) { echo $row['user'] . ' ' . $row['pwd']."<br>"; }
這裡可以看到我用了一個函式是PDO::FETCH_ASSOC,這裡和過去相似,我們可以把資料以和資料欄位相關的方式叫出資料:
也可以使用PDO::FETCH_NUM來叫出資料:
或者是前面文章提過的,回傳成一個物件,使用PDO::FETCH_OBJ,也可以套用在類別中PDO::FETCH_CLASS,套用在CLASS中的方法可參考(Re-introducing PDO – the Right Way to Access Databases in PHP),其他的fetch方式,則可參考:PHP PDOStatement:fetch。
在下一篇文章<PHP Data Objects (PDO) 簡易使用說明(2)-使用prepared指令避免sql injection>中,我們會進一步說明如何透過prepare的指令來避免SQL injection還有如何在PDO中使用WHERE IN的指令。
參考資料
Site-Point:Re-introducing PDO – the Right Way to Access Databases in PHP
Site-Point:video: atabase access with php
PHP.net:PHP PDOStatement:fetch
web3.5 : PDO (PHP Data Object) 簡易教學
心情雜物間:PDO學習
Site-Point:video: atabase access with php
PHP.net:PHP PDOStatement:fetch
web3.5 : PDO (PHP Data Object) 簡易教學
心情雜物間:PDO學習
0 意見:
張貼留言