|
從這里開始
我的博客,后臺數據庫是什么?沒錯,就是MySQL,服務器端使用的腳本就是php,整個框架使用的是WordPress。php和MySQL就像夫妻一樣,總是在一起干活。現在這里,就集合php,總結一下MySQL的實際使用,也算作是MySQL開發的入門。關于php與MySQL的合作,不外乎以下三種方法:
1.mysql擴展;但是目前已經不推薦使用;
2.mysqli擴展;同時提供面向對象風格和面向過程的風格;要求MySQL版本是4.1及以上的;
3.PDO擴展為php訪問數據庫定義了一種輕量級的一致接口;PDO_MYSQL是對其的具體實現。這里暫時只關心開發。由于mysql擴展已經不推薦使用了,我也會與時俱進,不做總結;而mysqli和PDO方式用的比較多,所以這篇將會總結如何使用mysqli擴展來連接數據庫服務器,如何查詢和獲取數據,以及如何執行其它重要任務。下一篇博文將會總結PDO的相關內容。
使用mysqli擴展
先看以下測試數據庫db_test中的測試數據:
復制代碼 代碼如下:
mysql> select * from tb_test;
+----+-----------+----------+------------+------------+
| id | firstname | lastname | email | phone |
+----+-----------+----------+------------+------------+
| 1 | Young | Jelly | 123@qq.com | 1384532120 |
| 3 | Fang | Jone | 456@qq.com | 1385138913 |
| 4 | Yuan | Su | 789@qq.com | 1385138913 |
+----+-----------+----------+------------+------------+
3 rows in set (0.00 sec)
1.建立和斷開連接
與MySQL數據庫交互時,首先要建立連接,最后要斷開連接;這包括與服務器連接并選擇一個數據庫,以及最后關閉連接,釋放資源。選擇使用面向對象接口與MySQL服務器交互,首先需要通過其構造函數實例化mysqli類。
復制代碼 代碼如下:
<?php
// 實例化mysqli類
$mysqliConn = new mysqli();
// 連接服務器,并選擇一個數據庫
$mysqliConn->connect('127.0.0.1', 'root', 'root', 'db_test');
printf("MySQL error number:%d", $mysqliConn->errno);
// 或者
// $mysqliConn->connect("http://127.0.0.1", 'root', 'root');
// $mysqliConn->select_db('db_test');
// 與數據庫交互
// 關閉連接
$mysqliConn->close();
?>
一旦成功的選擇了數據庫,然后就可以對這個數據庫執行數據庫查詢了。一旦腳本執行完畢,所有打開的數據庫連接都會自動關閉,并釋放資源。不過,有可能一個頁面在執行期間需要多個數據庫連接,各個連接都應當適當的加以關閉。即使只使用一個連接,也應該在腳本的最后將其關閉,這是一種很好的實踐方法。在任何情況下,都由close()負責關閉連接。
2.處理連接錯誤
當然,如果無法連接MySQL數據庫,那么不大可能在這個頁面繼續完成預期的工作了。因此,一定要注意監視連接錯誤并相應地做出反應。mysqli擴展包包含很多可以用來捕獲錯誤消息的特性,另外也可以使用異常來做到這一點。例如,可以使用mysqli_connect_errno()和mysqli_connect_error()方法診斷并顯示一個MySQL連接錯誤的有關信息。
關于mysqli的具體信息可以在這里查看:http://php.NET/manual/zh/book.mysqli.php
與數據庫交互
絕大多數查詢都與創建、獲取、更新和刪除任務有關,這些任務統稱為CRUD。這里就開始總結CRUD相關的內容。
1.向數據庫發送查詢
方法query()負責將query發送給數據庫。它的定義如下:
復制代碼 代碼如下:
mixed mysqli::query ( string $query [, int $resultmode = MYSQLI_STORE_RESULT ] )
可選參數resultmode可以用于修改這個方法的行為,它接受兩個可取值。這篇文章總結了二者之間的區別。http://www.jb51.NET/article/55792.htm;下面是一個簡單的使用例子:
復制代碼 代碼如下:
<?php
// 實例化mysqli類
$mysqliConn = new mysqli();
// 連接服務器,并選擇一個數據庫
// 錯誤的密碼
$mysqliConn->connect('127.0.0.1', 'root', 'root', 'db_test');
if ($mysqliConn->connect_error)
{
printf("Unable to connect to the database:%s", $mysqliConn->connect_error);
exit();
}
// 與數據庫交互
$query = 'select firstname, lastname, email from tb_test;';
// 發送查詢給MySQL
$result = $mysqliConn->query($query);
// 迭代處理結果集
while (list($firstname, $lastname, $email) = $result->fetch_row())
{
printf("%s %s's email:%s<br/>", $firstname, $lastname, $email);
}
// 關閉連接
$mysqliConn->close();
?>
2.插入、更新和刪除數據
插入、更新和刪除使用的是insert、update和delete查詢完成的,其做法實際上與select查詢相同。示例代碼如下:
復制代碼 代碼如下:
<?php
// 實例化mysqli類
$mysqliConn = new mysqli();
// 連接服務器,并選擇一個數據庫
// 錯誤的密碼
$mysqliConn->connect('127.0.0.1', 'root', 'root', 'db_test');
if ($mysqliConn->connect_error)
{
printf("Unable to connect to the database:%s", $mysqliConn->connect_error);
exit();
}
// 與數據庫交互
$query = 'select firstname, lastname, email from tb_test;';
// 發送查詢給MySQL
$result = $mysqliConn->query($query);
// 迭代處理結果集
while (list($firstname, $lastname, $email) = $result->fetch_row())
{
printf("%s %s's email:%s<br/>", $firstname, $lastname, $email);
}
$query = "delete from tb_test where firstname = 'Yuan';";
$result = $mysqliConn->query($query);
// 告訴用戶影響了多少行
printf("%d row(s) have been deleted.<br/>", $mysqliConn->affected_rows);
// 重新查詢結果集
$query = 'select firstname, lastname, email from tb_test;';
// 發送查詢給MySQL
$result = $mysqliConn->query($query);
// 迭代處理結果集
while (list($firstname, $lastname, $email) = $result->fetch_row())
{
printf("%s %s's email:%s<br/>", $firstname, $lastname, $email);
}
// 關閉連接
$mysqliConn->close();
?>
3.釋放查詢內存
有時可能會獲取一個特別龐大的結果集,此時一旦完成處理,很有必要釋放該結果集所請求的內存。free()方法可以為我們完成這個任務。例如:
復制代碼 代碼如下:
// 與數據庫交互
$query = 'select firstname, lastname, email from tb_test;';
// 發送查詢給MySQL
$result = $mysqliConn->query($query);
// 迭代處理結果集
while (list($firstname, $lastname, $email) = $result->fetch_row())
{
printf("%s %s's email:%s<br/>", $firstname, $lastname, $email);
}
$result->free();
4.解析查詢結果
一旦執行了查詢并準備好結果集,下面就可以解析獲取到的結果行了。你可以使用多個方法來獲取各行中的字段,具體選擇哪一個方法主要取決于個人喜好,因為只是引用字段的方法有所不同。
(1)將結果放到對象中
使用fetch_object()方法來完成。fetch_object()方法通常在一個循環中調用,每次調用都使得返回結果集中的下一行被填入一個對象,然后可以按照php典型的對象訪問語法來訪問這個對象。例如:
復制代碼 代碼如下:
// 與數據庫交互
$query = 'select firstname, lastname, email from tb_test;';
// 發送查詢給MySQL
$result = $mysqliConn->query($query);
// 迭代處理結果集
while ($row = $result->fetch_object())
{
$firstname = $row->firstname;
$lastname = $row->lastname;
$email = $row->email;
}
$result->free();
(2)使用索引數組和關聯數組獲取結果
mysqli擴展包還允許通過fetch_array()方法和fetch_row()方法分別使用關聯數組和索引數組來管理結果集。fetch_array()方法實際上能夠將結果集的各行獲取為一個關聯數組、一個數字索引數組,或者同時包括二者,可以說,fetch_row()是fetch_array的一個子集。默認地,fetch_array()會同時獲取關聯數組和索引數組,可以在fetch_array中傳入參數來修改這個默認行為。
MYSQLI_ASSOC,將行作為一個關聯數組返回,鍵由字段名表示,值由字段內容表示;
MYSQLI_NUM,將行作為一個數字索引數組返回,其元素順序由查詢中指定的字段名順序決定;
MYSQLI_BOTH,就是默認的選項。
確定所選擇的行和受影響的行
通常希望能夠確定select查詢返回的行數,或者受insert、update或delete影響的行數。
(1)確定返回的行數
如果希望了解select查詢語句返回了多少行,num_rows屬性很有用。例如:
復制代碼 代碼如下:
// 與數據庫交互
$query = 'select firstname, lastname, email from tb_test;';
// 發送查詢給MySQL
$result = $mysqliConn->query($query);
// 獲取行數
$result->num_rows;
記住,num_rows只在確定select查詢所獲取的行數時有用,如果要獲得受insert、update或delete影響的行數,就要使用下面總結的affected_rows屬性。
(2)確定受影響的行數
affected_rows屬性用來獲取受insert、update或delete影響的行數。代碼示例見上面的代碼。
執行數據庫事務
有3個新方法增強了php執行MySQL事務的功能,分別為:
1.autocommit函數,啟用自動提交模式;
autocommit()函數控制MySQL自動提交模式的行為,由傳入的參數決定啟動還是禁用自動提交;傳入TRUE,則啟動自動提交,傳入false則禁用自動提交。無論啟用還是禁用,成功時都將返回TRUE,失敗時返回FALSE。
2.commit函數,提交事務;將當前事務提交給數據庫,成功時返回TRUE,否則返回FALSE。
3.rollback函數,回滾當前事務,成功時返回TRUE,否則返回FALSE。
關于事務,我后面還要繼續總結,這里就簡要的總結了一下這三個API。
不會結束
這只是MySQL學習的開始,不會結束。再接再勵。
php技術:PHP連接和操作MySQL數據庫基礎教程,轉載需保留來源!
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。