簡介:
PDO擴展為PHP存取資料庫定義了一個輕量級的、一致性的接口,它提供了一個資料存取抽象層,這樣,無論使用什麼資料庫,都可以透過一致的函數執行查詢和獲取數據。
即提供了一個資料庫存取抽象層能使得我們透過一致的函數和寫法來操作不同資料庫,有利於日後對資料庫的遷移,當然也有安全方面的提升。
對比:
php 操作資料庫以mysql 為例常用的方法有php_mysql , php_mysqli , pdo
1.php_mysql 和php_mysqli 都是不可以移植的,只能套用在資料庫,而 pdosql 是資料庫,而pdo 是可以輕易移植的。
2.php_mysql 是我們初學php 學的操作資料庫的函數,但是其實他基本上很少使用了,其中最重要的一點就是容易造成安全問題。
存在SQL注入,於是php 提供了函數mysql_real_escape_string 如果存在很多的變數每一個都要經過 mysql_real_escape_string
反而變的很麻煩。
3.pdo 支援預處理,預處理功能可以有效的避免sql注入,並提高效率。
4.php_mysqli 和 pdo 都支援物件導向。
5.pdo 長連接方式性能上優於php_mysqli (參考網上資料)
php_mysql 方式優勢已經不大了,php_mysqli 最致命的就是不能移植到其它數據庫,除非你很確定不會更換。顯然 pdo方式連接資料庫將會是一種趨勢。
pdo簡單操作資料庫:
首先php 要啟用php-pdo 相關擴充
<?php $dbType = 'mysql'; $dbUser = 'root'; $dbPass = 'simael'; $dbhost = 'localhost'; $dbName = 'pdotest'; $dsn="$dbType:host=$dbhost;dbname=$dbName"; try{ $pdo = new PDO($dsn, $dbUser, $dbPass); echo "PDO成功连接MySQL数据库!"; }catch(PDOException $exception){ echo $exception->getMessage(); }
插入資料
<?php //$pdo->query('set names utf8'); $sql = "INSERT INTO la_comments SET nick_name='formPdo',email='pdo@pdo.com',comment='中文comment',page_id='11',created_at=NOW(),updated_at=NOW()"; $res1 = $pdo->exec($sql); var_dump($res1);
可能是此時去資料庫看到資料庫看到錯誤的問題原因
添加代碼
$pdo->query('set names utf8');數據存儲仍存在錯誤,是因為有可能你的header 是gbk 編碼
網上總結的編碼需要注意的問題如下:
一、服務端程序聲明編碼,例如header("Content-type: text/html; charset=utf-8");
二、客戶端宣告編碼,如
三、資料庫編碼、表格以及欄位的編碼
四、檔案本身編碼屬性
五、連接資料庫時請聲明編碼,例如$pdo->query('set names utf8');
只要上述都一致了編碼問題一般都會解決的。
完整範例程式碼:(檔案本身也應該使用utf8 編碼)
$dbType = 'mysql'; $dbUser = 'root'; $dbPass = 'simael'; $dbhost = 'localhost'; $dbName = 'pdotest'; $dsn="$dbType:host=$dbhost;dbname=$dbName"; try{ $pdo = new PDO($dsn, $dbUser, $dbPass,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES'utf8';")); //$pdo = new PDO($dsn, $dbUser, $dbPass); echo "PDO成功连接MySQL数据库!"; }catch(PDOException $exception){ echo $exception->getMessage(); } $pdo->query('set names utf8'); $sql = "INSERT INTO la_comments SET nick_name='formPdo',email='pdo@pdo.com',comment='中文comment',page_id='11',created_at=NOW(),updated_at=NOW()"; $res1 = $pdo->exec($sql); var_dump($res1); $sql = "SELECT * FROM la_comments"; $res2 = $pdo->query($sql); while($row = $res2->fetch()){ print_r($row); echo '
'; } $pdo = null; ?>