PHP學習筆記13——SQL支持(mysql庫與PDO)

  1 <?php
  2     //1. 使用mysql函數鏈接mysql數據庫
  3         /* mysql_connect(server,username,password)    返回資源標識符,若是隻有一個將做爲默認,多個則要用標識符區分
  4          * mysql_close()                            關閉鏈接
  5          * mysql_error()                            打印錯誤信息
  6          * mysql_select_db(name,resource)            爲後續操做指定數據庫,至關於use xxx 
  7          * mysql_query()                            執行語句,返回結果資源,錯誤返回0
  8          * mysql_affected_rows()                    上一條sql語句影響的行數
  9          * 當mysql_query函數執行的是select語句時,返回的是PHP引用資源指針
 10          * mysql_num_rows(resource)            返回記錄行個數
 11          * mysql_num_fields(resource)        返回記錄列個數
 12          * 如下函數用於讀取一行記錄直到末尾(NULL),每次讀取將指針移到下一行,使用mysql_data_seek()來實現移動指針
 13          * mysql_fetch_row(resource)        返回一個普通索引數組保存一行數據,並將資源指針跳到下一行    
 14          * mysql_fetch_assoc(resource)        返回一個關聯索引數組保存一行數據,並將資源指針跳到下一行
 15          * mysql_fetch_array(resource)        返回一個普通索引數組/關聯索引數組/二者(默認) 保存一行數據,並將資源指針跳到下一行
 16          * mysql_fetch_object(resource)        返回一個對象保存一行數據,並將資源指針跳到下一行
 17          * mysql_free_result(resource)        釋放結果資源
 18          */
 19         //鏈接數據庫
 20     $link = mysql_connect('localhost','root','root');
 21     if (!$link) {
 22         die('鏈接失敗'.mysql_error());
 23     } else {
 24         //顯示一些與mysql數據庫有關的信息
 25         echo '鏈接成功<br/>';
 26         echo mysql_get_client_info()."<br/>";
 27         echo mysql_get_host_info()."<br/>";
 28         echo mysql_get_proto_info()."<br/>";
 29         echo mysql_get_server_info()."<br/>";
 30         echo mysql_client_encoding()."<br/>";
 31         echo mysql_stat()."<br/>";
 32     }
 33     mysql_query('set names utf-8');
 34     
 35         //創建並使用數據庫bookstore
 36     mysql_query("create database bookstore");
 37     mysql_select_db("bookstore", $link);
 38         //增刪改
 39     $create_str = "
 40         create table if not exists books (
 41             id int not null auto_increment,
 42             bookname varchar(80) not null default '',
 43             publisher varchar(60) not null default '',
 44             author varchar(20) not null default '',
 45             price double(5,2) not null default 0.00,
 46             ptime int not null default 0,
 47             detail TEXT,
 48             primary key(id),
 49             index books_bookname(bookname),
 50             index books_publisher(publisher),
 51             index books_price(price)
 52         );";
 53     $insert_str = "
 54         insert into books(bookname,publisher,author,price,detail) values
 55             ('PHP', '電子工業', '高某某', '80.00', '與PHP相關的書'),
 56             ('JSP', '人民郵電', '洛某某', '60.00', '與JSP相關的書'),
 57             ('ASP', '電子工業', '峯某某', '40.00', '與ASP相關的書');";    
 58     $update_str = "update books set price = '79.90' where bookname = 'PHP';";
 59     $delete_str = "delete from books where bookname = 'JSP';";
 60     $res = mysql_query($create_str);
 61     $res = mysql_query($insert_str);
 62     $res = mysql_query($update_str);
 63     $res = mysql_query($delete_str);
 64     
 65         //
 66     $res = mysql_query("select * from books;");
 67     while(@$row = mysql_fetch_assoc($res)) {
 68         print_r($row);
 69         echo "<br/>";
 70     }
 71         //關閉資源
 72     mysql_free_result($res);
 73     mysql_close($link);
 74     
 75     //2. 使用PDO鏈接數據庫
 76         /* 一種通用的鏈接數據庫的方式,爲不一樣的數據庫提供統一接口
 77          * 構造方法 PDO(DSN,username,password,opts)     DSN是數據源名,定義數據庫和用到的驅動程序,opts關聯數組可選,爲一些選項,後面會列舉
 78          * PDO對象中的方法
 79          * getAttribute,setAttribute        得倒以及設置屬性
 80          * errorCode,errorInfo                錯誤碼和錯誤信息
 81          * exec                                處理一條語句,返回影響行數
 82          * query                            處理一條語句,返回PDOStatement
 83          * quote                            爲某個SQL字符串添加引號
 84          * lastInsertId                        獲取插入到表中的最後一條數據的主鍵值
 85          * prepare                            準備要執行的SQL語句
 86          * getAvailableDrivers                獲取有效的PDO驅動器名稱
 87          * beginTransaction                    開始一個事務,標明迴歸起點
 88          * commit                            提交一個事務
 89          * rollback                            回滾一個事務
 90          * 
 91          * query和prepare方法都會返回一個PDOStatement類的實例,該類能夠用來設置query參數以及得到query結果
 92          * 預處理sql語句能夠提升執行效率,尤爲在一個查詢執行屢次是經常使用(和java中得preparestatement同樣),PDOStatemet的成員方法以下
 93          * bindColumn                匹配列名和一個指定的變量名,獲取每行記錄時會將相應列值賦給該變量
 94          * bindParam                將參數綁定到相應的查詢佔位符上
 95          * bindValue                將一值綁定到對應的一個參數中
 96          * closeCursor                關閉遊標
 97          * columnCount,rowCount        結果集中列的數目,行的數目
 98          * errorCode,errorInfo        錯誤碼,錯誤信息
 99          * execute                    執行一個準備好的預查詢
100          * setFetchMode                設置獲取結果集合的類型
101          * fetch                    返回結果下一行
102          * fetchAll                    得到全部行
103          * fetchColumn                返回下一行某列的值
104          * fetchObject                將下一行做爲對象返回
105          * getColumMeta                返回某一列的屬性信息
106          * nextRowset                檢索下一行集(結果集)
107          * getAttribute,setAttrbute    設置和獲得屬性
108          */
109     try{
110         $dbh = new PDO("mysql:host=localhost;dbname=bookstore", "root", "root");
111     } catch(PDOException $e){
112         echo $e->getMessage();
113     }
114         //顯示一些經常使用選項
115     echo "<br>自動提交功能:".$dbh->getAttribute(PDO::ATTR_AUTOCOMMIT);
116     echo "<br>強制大小寫轉換:".$dbh->getAttribute(PDO::ATTR_CASE);
117     echo "<br>錯誤處理模式:".$dbh->getAttribute(PDO::ATTR_ERRMODE);
118     echo "<br>是否持久鏈接:";var_dump($dbh->getAttribute(PDO::ATTR_PERSISTENT));
119     echo "<br>空字符串轉換爲NULL:".$dbh->getAttribute(PDO::ATTR_ORACLE_NULLS);
120     //echo "<br>提早獲取字符串大小:".$dbh->getAttribute(PDO::ATTR_PREFETCH);    這兩個屬性當前驅動不支持
121     //echo "<br>超時等待時間:".$dbh->getAttribute(PDO::ATTR_TIMEOUT);
122     echo "<br>數據庫服務器信息:".$dbh->getAttribute(PDO::ATTR_SERVER_INFO);
123     echo "<br>數據庫服務器版本:".$dbh->getAttribute(PDO::ATTR_SERVER_VERSION);
124     echo "<br>數據庫客戶端版本:".$dbh->getAttribute(PDO::ATTR_CLIENT_VERSION);
125     echo "<br>鏈接狀態信息:".$dbh->getAttribute(PDO::ATTR_CONNECTION_STATUS);
126     
127         //使用exec執行非select操做
128     $res = $dbh->exec("update books set price = '78.80' where bookname = 'PHP';");
129     echo "<br>exec操做影響的行數:".$res;
130     
131         //使用query執行select操做
132     $res = $dbh->query("select * from books;");
133     echo "<br>query操做影響的行數:".$res->rowCount();
134     foreach ($res as $st) {
135         echo "<br>";
136         print_r($st);
137     }
138     echo "<br><br>";
139     
140         //使用prepare和execute函數來執行語句
141         /* prepare能夠用兩種方式來使用佔位符
142          * 1)insert .. values (:name, :address, :phone);
143          * 2)insert .. values (?, ?);
144          * 相應的Bind方法也分爲兩種
145          * 1)bindParam(':name', "ss");
146          * 2)bindParam(1, "ss");
147          * 也能夠在execute中指定參數,分別爲關聯數組和索引數組
148          * 1)execute(array(":name"->ss .. ));
149          * 2)execute(array("ss", ..))
150          * 
151          */
152     $stmt = $dbh->prepare("insert into books(bookname,publisher,author,price,detail) values (?,?,?,?,?)");
153     $book_info = array("bookname"=>"JAVA", "publisher"=>"中國人民", 
154             "author"=>"張某某","price"=>37.80, "detail"=>"與JAVA有關的書");
155     $stmt->bindParam(1, $book_info['bookname']);    //能夠顯式指定類型,BOOL,NULL,INT,STR,LOB(大數據)
156     $stmt->bindParam(2, $book_info['publisher']);
157     $stmt->bindParam(3, $book_info['author']);
158     $stmt->bindParam(4, $book_info['price']);
159     $stmt->bindParam(5, $book_info['detail']);
160     $stmt->execute();
161     
162     $stmt->execute(array("C++","工業機械","李某",45.30,"與C++有關的書"));
163     
164         //使用prepare和execute來查詢
165         /* fetch([fetch_style,cursor_orientation,cursor_offset])    返回一行數據,三個參數都是可選
166          * fetch_style PDO::FETCH_ASSOC(關聯),NUM(索引),OBJ(對象),BOTH(前二者,默認),LAZY(前三者),BOUND(賦值給bindParam中得變量)
167          * cursor_orientation    可滾動遊標時應該獲取哪一行
168          * cursor_offset        獲取的行相對於當前遊標位置的偏移
169          * 
170          * fetchall([fetch_style,column_index])    返回全部數據
171          * column_index返回指定列全部值
172          * 
173          * setfetchmode            設定以上兩個函數的默認參數
174          * bindColumn            綁定列對應變量,每次fetch的數據會自動賦值到對應變量上
175          */
176     
177     $stmt = $dbh->prepare("select * from books");
178     $stmt->execute();
179     while (@$arr = $stmt->fetch()) {
180         print_r($arr);
181         echo "<br>";
182     }
183     echo "<br>";
184     $stmt->execute();
185     print_r($stmt->fetchAll());
186     
187         //PDO事務處理
188         /* 在autocommit爲1時是不須要事務的,須要commit才能提交操做,爲0時須要事務來進行提交和回滾操做
189          * 若是驅動底層不支持事務,會拋出PDOException異常
190          */
191     try{
192         $dbh->beginTransaction();
193         $dbh->exec("delete from books where bookname = 'JAVA';");    //這裏並無在數據庫中有所改動
194         $dbh->commit();                //這裏才被提交執行
195     } catch(PDOException $e){
196         echo $e->getMessage();
197     }
198 ?>

執行結果php

鏈接成功
mysqlnd 5.0.10 - 20111026 - $Id: e707c415db32080b3752b232487a435ee0372157 $
localhost via TCP/IP
10
5.5.32
utf8
Uptime: 4406 Threads: 1 Questions: 1676 Slow queries: 0 Opens: 63 Flush tables: 1 Open tables: 4 Queries per second avg: 0.380
Array ( [id] => 1 [bookname] => PHP [publisher] => 電子工業 [author] => 高某某 [price] => 79.90 [ptime] => 0 [detail] => 與PHP相關的書 ) 
Array ( [id] => 3 [bookname] => ASP [publisher] => 電子工業 [author] => 峯某某 [price] => 40.00 [ptime] => 0 [detail] => 與ASP相關的書 ) 

自動提交功能:1
強制大小寫轉換:0
錯誤處理模式:0
是否持久鏈接:bool(false) 
空字符串轉換爲NULL:0
數據庫服務器信息:Uptime: 4407 Threads: 1 Questions: 1686 Slow queries: 0 Opens: 65 Flush tables: 1 Open tables: 5 Queries per second avg: 0.382
數據庫服務器版本:5.5.32
數據庫客戶端版本:mysqlnd 5.0.10 - 20111026 - $Id: e707c415db32080b3752b232487a435ee0372157 $
鏈接狀態信息:localhost via TCP/IP
exec操做影響的行數:1
query操做影響的行數:2
Array ( [id] => 1 [0] => 1 [bookname] => PHP [1] => PHP [publisher] => 電子工業 [2] => 電子工業 [author] => 高某某 [3] => 高某某 [price] => 78.80 [4] => 78.80 [ptime] => 0 [5] => 0 [detail] => 與PHP相關的書 [6] => 與PHP相關的書 ) 
Array ( [id] => 3 [0] => 3 [bookname] => ASP [1] => ASP [publisher] => 電子工業 [2] => 電子工業 [author] => 峯某某 [3] => 峯某某 [price] => 40.00 [4] => 40.00 [ptime] => 0 [5] => 0 [detail] => 與ASP相關的書 [6] => 與ASP相關的書 ) 

Array ( [id] => 1 [0] => 1 [bookname] => PHP [1] => PHP [publisher] => 電子工業 [2] => 電子工業 [author] => 高某某 [3] => 高某某 [price] => 78.80 [4] => 78.80 [ptime] => 0 [5] => 0 [detail] => 與PHP相關的書 [6] => 與PHP相關的書 ) 
Array ( [id] => 3 [0] => 3 [bookname] => ASP [1] => ASP [publisher] => 電子工業 [2] => 電子工業 [author] => 峯某某 [3] => 峯某某 [price] => 40.00 [4] => 40.00 [ptime] => 0 [5] => 0 [detail] => 與ASP相關的書 [6] => 與ASP相關的書 ) 
Array ( [id] => 4 [0] => 4 [bookname] => JAVA [1] => JAVA [publisher] => 中國人民 [2] => 中國人民 [author] => 張某某 [3] => 張某某 [price] => 37.80 [4] => 37.80 [ptime] => 0 [5] => 0 [detail] => 與JAVA有關的書 [6] => 與JAVA有關的書 ) 
Array ( [id] => 5 [0] => 5 [bookname] => C++ [1] => C++ [publisher] => 工業機械 [2] => 工業機械 [author] => 李某 [3] => 李某 [price] => 45.30 [4] => 45.30 [ptime] => 0 [5] => 0 [detail] => 與C++有關的書 [6] => 與C++有關的書 ) 

Array ( [0] => Array ( [id] => 1 [0] => 1 [bookname] => PHP [1] => PHP [publisher] => 電子工業 [2] => 電子工業 [author] => 高某某 [3] => 高某某 [price] => 78.80 [4] => 78.80 [ptime] => 0 [5] => 0 [detail] => 與PHP相關的書 [6] => 與PHP相關的書 ) [1] => Array ( [id] => 3 [0] => 3 [bookname] => ASP [1] => ASP [publisher] => 電子工業 [2] => 電子工業 [author] => 峯某某 [3] => 峯某某 [price] => 40.00 [4] => 40.00 [ptime] => 0 [5] => 0 [detail] => 與ASP相關的書 [6] => 與ASP相關的書 ) [2] => Array ( [id] => 4 [0] => 4 [bookname] => JAVA [1] => JAVA [publisher] => 中國人民 [2] => 中國人民 [author] => 張某某 [3] => 張某某 [price] => 37.80 [4] => 37.80 [ptime] => 0 [5] => 0 [detail] => 與JAVA有關的書 [6] => 與JAVA有關的書 ) [3] => Array ( [id] => 5 [0] => 5 [bookname] => C++ [1] => C++ [publisher] => 工業機械 [2] => 工業機械 [author] => 李某 [3] => 李某 [price] => 45.30 [4] => 45.30 [ptime] => 0 [5] => 0 [detail] => 與C++有關的書 [6] => 與C++有關的書 ) ) 
相關文章
相關標籤/搜索