1、簡介:(PDO數據庫訪問抽象層,統一各種 數據庫的訪問接口)
PHP 數據對象 (PDO) 擴展為PHP訪問數據庫定義了一個輕量級的一致接口。實現 PDO 接口的每個數據庫驅動可以公開具體數據庫的特性作為標準擴展功能。 注意利用 PDO 擴展自身并不能實現任何數據庫功能;必須使用一個 具體數據庫的 PDO 驅動 來訪問數據庫服務。 PDO 提供了一個 數據訪問 抽象層,這意味著,不管使用哪種數據庫,都可以用相同的函數(方法)來查詢和獲取數據。 PDO 不不提供 數據庫 抽象層;它不會重寫 SQL,也不會模擬缺失的特性。如果需要的話,應該使用一個成熟的抽象層。 (http://php.net/manual/zh/intro.pdo.php) 2、特點extension=php_pdo_mysql.dll
extension=php_pdo_pgsql.dll
DLL 文件應該在系統的extension_dir 中存在。更改 php.ini 文件后需要重啟 PHP 服務才能使新的配置指令生效。 1<?php
2// 通過參數形式連接數據庫
3try{
4 $dsn ='mysql:host=localhost;dbname=pdotest';
5 $name ='root';
6 $passwd ='root';
7 $pdo =new PDO($dsn, $name, $passwd);
8 var_dump($pdo);
9}catch(PDOException $e){
10 echo $e->getMessage();
11}
12
4.2、通過URI形式 創建pdo_uri_conn.txt文件mysql:dbname=pdotest;host=localhost;
Uri連接數據庫<?php
// 通過參數形式連接數據庫
try{
$dsn ='uri:/var/www/html/php-code/pdo/pdo_uri_conn.txt';
$name ='root';
$passwd ='root';
$pdo =new PDO($dsn, $name, $passwd);
var_dump($pdo);
}catch(PDOException $e){
echo $e->getMessage();
}
4.3、通過配置php.ini文件的形式連接數據庫 <?php
......
// 現在運行完成,在此關閉連接
$dbh =null;
5、PDO對象使用 1<?php
2// 通過參數形式連接數據庫
3try{
4 $dsn ='mysql:host=localhost;dbname=pdotest';
5 $name ='root';
6 $passwd ='root';
7 $pdo =new PDO($dsn, $name, $passwd);
8 $sql =<<<EOF
9 CREATE TABLE IF NOT EXISTS user(
10 id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
11 name VARCHAR(20) NOT NULL UNIQUE,
12 passwd VARCHAR(32) NOT NULL,
13 email VARCHAR(30) NOT NULL
14);
15 EOF;
16// exec 對于沒有受影響的行數將返回0
17 $res = $pdo->exec($sql);
18 var_dump($res);
19// 現在運行完成,在此關閉連接
20 $pdo =null;
21}catch(PDOException $e){
22 echo $e->getMessage();
23}
24
25
5.1.2、使用exec() 插入數據1<?php
2// 通過參數形式連接數據庫
3try{
4 $dsn ='mysql:host=localhost;dbname=pdotest';
5 $name ='root';
6 $passwd ='root';
7 $pdo =new PDO($dsn, $name, $passwd);
8 $sql ='
9 INSERT INTO user (name, passwd, email)
10 VALUES('wangxb', MD5('123'), 'wangxb@mail.com'),
11 ('wangxb1', MD5('123'), 'wangxb@mail.com'),
12 ('wangxb2', MD5('123'), 'wangxb@mail.com')
13 ';
14// exec 對于沒有受影響的行數將返回0
15 $res = $pdo->exec($sql);
16 var_dump($res);
17// 返回最后插入行的ID或序列值
18 echo $pdo->lastInsertId();
19// 現在運行完成,在此關閉連接
20 $pdo =null;
21}catch(PDOException $e){
22 echo $e->getMessage();
23}
24
返回: 5.3、query()方法執行查詢 query()方法雖然可以執行任何sql語句,但是更多的時候是執行select,對于insert、update、delete等使用exec()方法0: SQLSTATE error code1: specific error code.2: specific error message
1<?php
2/*
3 * 使用errorCode 和 errorInfo 兩個方法顯示錯誤信息
1 <?php
2 /*
3 * 使用errorCode 和 errorInfo 兩個方法顯示錯誤信息
4 */
5try{
6 $dsn ='mysql:host=localhost;dbname=pdotest';
7 $name ='root';
8 $passwd ='root';
9 $pdo =new PDO($dsn, $name, $passwd);
10// 我們這里插入的一個沒有的表 user123 中
11 $sql ='
12 INSERT INTO user123 (name, passwd, email)
13 VALUES('wangxb', MD5('123'), 'wangxb@mail.com')
14 ';
15//
16 $res = $pdo->exec($sql);
17if(false=== $res){
18// errorCode 獲取跟數據庫句柄上一次操作相關的 SQLSTATE
19 echo $pdo->errorCode();
20print' ';
21// errorInfo 返回一個錯誤信息數據:
22// 0: SQLSTATE error code
23// 1: specific error code.
24// 2: specific error message
25 print_r($pdo->errorInfo());
26returnfalse;
27}
28 var_dump($res);
29// 返回最后插入行的ID或序列值
30 echo '最后一天插入的信息ID:'.$pdo->lastInsertId();
31// 現在運行完成,在此關閉連接
32 $pdo =null;
33}catch(PDOException $e){
34 echo $e->getMessage();
35}
36
運行:
我們在mysql客戶端執行相同語句可以看到 errorInfo()返回的信息其實是將mysql錯誤信息以數組的形式返回
1<?php
2/*
3 * 使用exec方法執行插入語句
4 */
5// 通過參數形式連接數據庫
6try{
7 $dsn ='mysql:host=localhost;dbname=pdotest';
8 $name ='root';
9 $passwd ='root';
10 $pdo =new PDO($dsn, $name, $passwd);
11//$sql = 'SELECT * FROM user WHERE id=12';
12 $sql ='SELECT * FROM user';
13// query 方法執行將返回一個PDOStatment對象
14 $stmt = $pdo->query($sql);
15if(!$pdo &&!$stmt){
16 var_dump($pdo->errorInof());
17}
18// 對于query返回的PDOStatment對象,我們同樣可是使用foreach方法來遍歷數據其中的數據
19foreach($stmt as $row){
20 var_dump($row);
21 echo '<hr>';
22}
23
24// 這里注意:雖然手冊上說query返回的是一個PDOStatment對象,但是下面這里使用PDOStatment對象方法時反悔了false,有待以后學習理解
25 echo '-------------------<br>';
26 var_dump($stmt->fetch());
27 echo '-------------------<br>';
28
29// prepare方法是為execute準備一個statmentObj
30 $sth = $pdo -> prepare ('SELECT name, id FROM user');
31 $sth -> execute ();
32 echo '++++++++++++++++++++++++';
33 var_dump($sth->fetch());
34 echo '++++++++++++++++++++++++';
35 var_dump($stmt);
36// 現在運行完成,在此關閉連接
37 $pdo =null;
38}catch(PDOException $e){
39 echo $e->getMessage();
40}
41
42
43
5.4、prepare()和execute()方法1<?php
2/*
3 * 使用exec方法執行插入語句
4 */
5// 通過參數形式連接數據庫
6try{
7 $dsn ='mysql:host=localhost;dbname=pdotest';
8 $name ='root';
9 $passwd ='root';
10 $pdo =new PDO($dsn, $name, $passwd);
11
12/*
13 * 使用prepare和execute方法形式
14 */
15 $id1 =12;
16 $id2 =13;
17// 利用占位符形式
18 $sql ='SELECT * FROM user WHERE id=? OR id=?';
19 $sth = $pdo -> prepare ($sql);
20 $sth -> execute(array($id1, $id2));
21 var_dump($sth->fetchAll(PDO::FETCH_ASSOC));
22
23 echo '<hr>';
24// 使用參數形式
25 $sql_1 ='SELECT id, name FROM user WHERE id= :id';
26 $sth_1 = $pdo -> prepare ($sql_1);
27 $sth_1 -> execute(array('id'=>$id1));
28 var_dump($sth_1->fetchAll(PDO::FETCH_ASSOC));
29
30 echo '<hr>';
31// 使用bindParam方式
32 $sql_2 ='SELECT * FROM user WHERE id=? OR id=?';
33 $sth_2 = $pdo -> prepare ($sql_2);
34 $sth_2->bindParam(1, $id1, PDO::PARAM_INT);
35 $sth_2->bindParam(2, $id2, PDO::PARAM_INT);
36 $sth_2 -> execute();
37 var_dump($sth_2->fetchAll(PDO::FETCH_ASSOC));
38
39// 現在運行完成,在此關閉連接
40 $pdo =null;
41}catch(PDOException $e){
42 echo $e->getMessage();
43}
44
1<?php
2/*
3 * 使用exec方法執行插入語句
4 */
5// 通過參數形式連接數據庫
6try{
7 $dsn ='mysql:host=localhost;dbname=pdotest';
8 $name ='root';
9 $passwd ='root';
10 $pdo =new PDO($dsn, $name, $passwd);
11 $sql ='SELECT * FROM user';
12 echo '自動提交:'.$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);
13 echo '<br/>';
14 echo 'PDO默認的錯誤處理模式:'.$pdo->getAttribute(PDO::ATTR_ERRMODE);
15
16 echo '<br/>';
17//現在我們重設自動提交
18 $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0);
19 echo '重設后的自動提交:'.$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);
20
21// 現在運行完成,在此關閉連接
22 $pdo =null;
23
24// 我們也可以在new一個PDO對象時,利用傳遞參數中的第四個參數(可省略)來設置我們此次連接數據庫時的各項參數
25// (我們可以在這里找到所有的設置項:http://php.net/manual/zh/pdo.constants.php)
26// 就像下面這樣
27 $dsn ='mysql:host=localhost;dbname=pdotest';
28 $name ='root';
29 $passwd ='root';
30 $option = array(
31 PDO::ATTR_AUTOCOMMIT => O,
32 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
33);
34 $pdo =new PDO($dsn, $name, $passwd, $option);
35 echo '<hr/>';
36 echo '使用option設置后';
37 echo '<br/>';
38 echo '自動提交:'.$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);
39 echo '<br/>';
40 echo 'PDO錯誤處理模式:'.$pdo->getAttribute(PDO::ATTR_ERRMODE);
41}catch(PDOException $e){
42 echo $e->getMessage();
43}
44
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答