PDO(PHP Data Object) 是PHP 5新出來的東西,在PHP 6都要出來的時候,PHP 6只默認使用PDO來處理數據庫,將把全部的數據庫擴展移到了PECL,那麼默認就是沒有了咱們喜好的php_mysql.dll之類的了。PDO是PHP 5新加入的一個重大功能,由於在PHP 5之前的php4/php3都是一堆的數據庫擴展來跟各個數據庫的鏈接和處理,什麼 php_mysql.dll、php_pgsql.dll、php_mssql.dll、php_sqlite.dll等等擴展來鏈接MySQL、 PostgreSQL、MS SQL Server、SQLite,一樣的,咱們必須藉助 ADOdb、PEAR::DB、PHPlib::DB之類的數據庫抽象類來幫助咱們,無比煩瑣和低效,畢竟,php代碼的效率怎麼可以咱們直接用 C/C++寫的擴展斜率高捏?因此嘛,PDO的出現是必然的,你們要平靜學習的心態去接受使用,也許你會發現可以減小你很多功夫哦。php
PHP 數據對象 (PDO) 擴展爲PHP訪問數據庫定義了一個輕量級的一致接口。實現 PDO 接口的每一個數據庫驅動能夠公開具體數據庫的特性做爲標準擴展功能。 注意利用 PDO 擴展自身並不能實現任何數據庫功能;必須使用一個 具體數據庫的 PDO 驅動 來訪問數據庫服務。html
PDO 提供了一個 數據訪問 抽象層,這意味着,無論使用哪一種數據庫,均可以用相同的函數(方法)來查詢和獲取數據。 PDO 不不提供 數據庫 抽象層;它不會重寫 SQL,也不會模擬缺失的特性。若是須要的話,應該使用一個成熟的抽象層。(相似python DB-2 API).python
從 PHP 5.1 開始附帶了 PDO,在 PHP 5.0 中是做爲一個 PECL 擴展使用。 PDO 須要PHP 5 核心的新 OO 特性,所以不能在較早版本的 PHP 上運行。mysql
啓用PDO,打開php.ini文件,去掉下面的註釋:sql
php.ini 中的 php_pdo.dll後面啓用。例如:數據庫
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
各類PHP PDO的驅動,能給加上的全給加上,不事後面的php_pdo_oci8.dll,由於我沒有安裝Oralce數據庫,因此沒有這個,就使用分號註釋掉它。而後重啓咱們的Web服務器。
簡單使用例子:
<?php try { $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass); foreach($dbh->query('SELECT * from FOO') as $row) { print_r($row); } $dbh = null; } catch (PDOException $e) { print "Error!: " . $e->getMessage() . "<br/>"; die(); } ?>
(php中unset()是用來銷燬變量的,但不少時候,這個函數只把變量給銷燬了,內存中存放的該變量的值仍然沒有銷燬,也就是沒能達到咱們想要的釋放內存的效果。這裏我建議你們用 $變量=null 的方法來釋放其內存)。數組
注意:若是出現亂碼,咱們最好設置utf-8:服務器
$pdo->query('set names utf8');函數
還有,在foreach中能夠$pdo->query;此時獲得的並非list,而是statement對象。學習
獲取list數據
$pdo->query($list)->fectchAll()
注意,默認包含關聯和數值數組:
'id' => '4',
0 => '4',
、徹底沒必要要,設置PDO::FETCH_ASSOC
$pdo->query($list)->fectchAll(PDO::FETCH_ASSOC)
http://php.net/manual/en/pdostatement.fetchall.php
Example #4 持久化鏈接
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
PDO::ATTR_PERSISTENT => true
));
?>
Note:
若是想使用持久鏈接,必須在傳遞給 PDO 構造函數的驅動選項數組中設置
PDO::ATTR_PERSISTENT
。若是是在對象初始化以後用 PDO::setAttribute() 設置此屬性,則驅動程序將不會使用持久鏈接。
$pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME,DB_USER,DB_PWD); $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $pdo->query("set names utf8");
PDO經常使用方法及其應用
PDO::query() 主要是用於有記錄結果返回的操做,特別是SELECT操做
PDO::exec() 主要是針對沒有結果集合返回的操做,如INSERT、UPDATE等操做
PDO::prepare() 主要是預處理操做,須要經過$rs->execute()來執行預處理裏面的SQL語句,這個方法能夠綁定參數,功能比較強大(防止sql注入就靠這個)
PDO::lastInsertId() 返回上次插入操做,主鍵列類型是自增的最後的自增ID
PDOStatement::fetch() 是用來獲取一條記錄
PDOStatement::fetchAll() 是獲取全部記錄集到一個集合
PDOStatement::fetchColumn() 是獲取結果指定第一條記錄的某個字段,缺省是第一個字段
PDOStatement::rowCount() :主要是用於PDO::query()和PDO::prepare()進行DELETE、INSERT、UPDATE操做影響的結果集,對PDO::exec()方法和SELECT操做無效。
操做實例:
if($pdo -> exec("insert into db_demo(name,content) values('title','content')")){
echo "插入成功!";
echo $pdo -> lastinsertid();
}
$rs = $pdo -> query("select * from test"); $rs->setFetchMode(PDO::FETCH_ASSOC); //關聯數組形式 //$rs->setFetchMode(PDO::FETCH_NUM); //數字索引數組形式 while($row = $rs -> fetch()){ print_r($row);
PDOStatement::rowCount()。
統計有多少行數據:
咱們使用setFetchMode方法來設置獲取結果集的返回值的類型,一樣類型還有:
PDO::FETCH_ASSOC -- 關聯數組形式
PDO::FETCH_NUM -- 數字索引數組形式
PDO::FETCH_BOTH -- 二者數組形式都有,這是缺省的
PDO::FETCH_OBJ -- 按照對象的形式,相似於之前的 mysql_fetch_object()
固然,通常狀況下咱們是使用PDO::FETCH_ASSOC,具體使用什麼,按照你本身的須要,其餘獲取類型參考手冊。
insert插入:
//數據插入 //準備SQL語句 $sql = "INSERT INTO `test`(`name`) VALUES (:name)"; //調用prepare方法準備查詢 $stmt = $pdo->prepare($sql); //傳遞一個數組爲預處理查詢中的命名參數綁定值,並執行SQL $stmt->execute(array(':name' => '王五')); //獲取最後一個插入數據的ID值 echo $pdo->lastInsertId() . '<br />';
或者:
<?php
/* Execute a prepared statement by binding PHP variables */
$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();
?>
<?php
/* Execute a prepared statement by passing an array of insert values */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour');
// instead of:
// $sth->execute(array(':calories' => $calories, ':colour' => $colour));
// this works fine, too:
$sth->execute(array('calories' => $calories, 'colour' => $colour));
?>
批量插入:
foreach($line as $l){ $stmt->bindParam(':title', $l['title']); $stmt->bindParam(':content', $l['content']); $stmt->bindParam(':created', $l['created']); $stmt->excute(); }
stmt->execute()可能執行失敗,要檢查返回值
$flag=$stmt->execute();
if(!$flag)
{
echo '<h1 style="color:red;font-weight:bold">插入數據庫錯誤!!!!!!!!!!!.</h1><br/>';
$errorInfoArr=$stmt->errorInfo();
print_r($errorInfoArr);
}
執行某條語句一直失敗,爲何?最後終於找到緣由
,由於字段名name,group是mysql關鍵字,換個字段名或用`name`括起來。
$pdo->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE,\PDO::FETCH_OBJ);
$rawSql="select * from users where id=:id";
$sth=$pdo->prepare($rawSql);
$id=1;
$sth->bindParam(':id',$id);
$flag= $sth->execute();
$row=$sth->fetch();
批量插入:http://www.jb51.net/article/51975.htm 。