您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“PHP連接和操作MySQL數(shù)據(jù)庫(kù)的方法”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“PHP連接和操作MySQL數(shù)據(jù)庫(kù)的方法”吧!
從這里開(kāi)始
PHP和MySQL就像夫妻一樣,總是在一起干活?,F(xiàn)在這里,就集合PHP,總結(jié)一下MySQL的實(shí)際使用,也算作是MySQL開(kāi)發(fā)的入門(mén)。關(guān)于PHP與MySQL的合作,不外乎以下三種方法:
1.mysql擴(kuò)展;但是目前已經(jīng)不推薦使用;
2.mysqli擴(kuò)展;同時(shí)提供面向?qū)ο箫L(fēng)格和面向過(guò)程的風(fēng)格;要求MySQL版本是4.1及以上的;
3.PDO擴(kuò)展為PHP訪問(wèn)數(shù)據(jù)庫(kù)定義了一種輕量級(jí)的一致接口;PDO_MYSQL是對(duì)其的具體實(shí)現(xiàn)。這里暫時(shí)只關(guān)心開(kāi)發(fā)。由于mysql擴(kuò)展已經(jīng)不推薦使用了,我也會(huì)與時(shí)俱進(jìn),不做總結(jié);而mysqli和PDO方式用的比較多,所以這篇將會(huì)總結(jié)如何使用mysqli擴(kuò)展來(lái)連接數(shù)據(jù)庫(kù)服務(wù)器,如何查詢(xún)和獲取數(shù)據(jù),以及如何執(zhí)行其它重要任務(wù)。下一篇博文將會(huì)總結(jié)PDO的相關(guān)內(nèi)容。
使用mysqli擴(kuò)展
先看以下測(cè)試數(shù)據(jù)庫(kù)db_test中的測(cè)試數(shù)據(jù):
復(fù)制代碼 代碼如下:
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.建立和斷開(kāi)連接
與MySQL數(shù)據(jù)庫(kù)交互時(shí),首先要建立連接,最后要斷開(kāi)連接;這包括與服務(wù)器連接并選擇一個(gè)數(shù)據(jù)庫(kù),以及最后關(guān)閉連接,釋放資源。選擇使用面向?qū)ο蠼涌谂cMySQL服務(wù)器交互,首先需要通過(guò)其構(gòu)造函數(shù)實(shí)例化mysqli類(lèi)。
復(fù)制代碼 代碼如下:
<?php
// 實(shí)例化mysqli類(lèi)
$mysqliConn = new mysqli();
// 連接服務(wù)器,并選擇一個(gè)數(shù)據(jù)庫(kù)
$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');
// 與數(shù)據(jù)庫(kù)交互
// 關(guān)閉連接
$mysqliConn->close();
?>
一旦成功的選擇了數(shù)據(jù)庫(kù),然后就可以對(duì)這個(gè)數(shù)據(jù)庫(kù)執(zhí)行數(shù)據(jù)庫(kù)查詢(xún)了。一旦腳本執(zhí)行完畢,所有打開(kāi)的數(shù)據(jù)庫(kù)連接都會(huì)自動(dòng)關(guān)閉,并釋放資源。不過(guò),有可能一個(gè)頁(yè)面在執(zhí)行期間需要多個(gè)數(shù)據(jù)庫(kù)連接,各個(gè)連接都應(yīng)當(dāng)適當(dāng)?shù)募右躁P(guān)閉。即使只使用一個(gè)連接,也應(yīng)該在腳本的最后將其關(guān)閉,這是一種很好的實(shí)踐方法。在任何情況下,都由close()負(fù)責(zé)關(guān)閉連接。
2.處理連接錯(cuò)誤
當(dāng)然,如果無(wú)法連接MySQL數(shù)據(jù)庫(kù),那么不大可能在這個(gè)頁(yè)面繼續(xù)完成預(yù)期的工作了。因此,一定要注意監(jiān)視連接錯(cuò)誤并相應(yīng)地做出反應(yīng)。mysqli擴(kuò)展包包含很多可以用來(lái)捕獲錯(cuò)誤消息的特性,另外也可以使用異常來(lái)做到這一點(diǎn)。例如,可以使用mysqli_connect_errno()和mysqli_connect_error()方法診斷并顯示一個(gè)MySQL連接錯(cuò)誤的有關(guān)信息。
關(guān)于mysqli的具體信息可以在這里查看:http://php.net/manual/zh/book.mysqli.php
與數(shù)據(jù)庫(kù)交互
絕大多數(shù)查詢(xún)都與創(chuàng)建、獲取、更新和刪除任務(wù)有關(guān),這些任務(wù)統(tǒng)稱(chēng)為CRUD。這里就開(kāi)始總結(jié)CRUD相關(guān)的內(nèi)容。
1.向數(shù)據(jù)庫(kù)發(fā)送查詢(xún)
方法query()負(fù)責(zé)將query發(fā)送給數(shù)據(jù)庫(kù)。它的定義如下:
復(fù)制代碼 代碼如下:
mixed mysqli::query ( string $query [, int $resultmode = MYSQLI_STORE_RESULT ] )
可選參數(shù)resultmode可以用于修改這個(gè)方法的行為,它接受兩個(gè)可取值。這篇文章總結(jié)了二者之間的區(qū)別。https://www.jb51.net/article/55792.htm;下面是一個(gè)簡(jiǎn)單的使用例子:
復(fù)制代碼 代碼如下:
<?php
// 實(shí)例化mysqli類(lèi)
$mysqliConn = new mysqli();
// 連接服務(wù)器,并選擇一個(gè)數(shù)據(jù)庫(kù)
// 錯(cuò)誤的密碼
$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();
}
// 與數(shù)據(jù)庫(kù)交互
$query = 'select firstname, lastname, email from tb_test;';
// 發(fā)送查詢(xún)給MySQL
$result = $mysqliConn->query($query);
// 迭代處理結(jié)果集
while (list($firstname, $lastname, $email) = $result->fetch_row())
{
printf("%s %s's email:%s<br/>", $firstname, $lastname, $email);
}
// 關(guān)閉連接
$mysqliConn->close();
?>
2.插入、更新和刪除數(shù)據(jù)
插入、更新和刪除使用的是insert、update和delete查詢(xún)完成的,其做法實(shí)際上與select查詢(xún)相同。示例代碼如下:
復(fù)制代碼 代碼如下:
<?php
// 實(shí)例化mysqli類(lèi)
$mysqliConn = new mysqli();
// 連接服務(wù)器,并選擇一個(gè)數(shù)據(jù)庫(kù)
// 錯(cuò)誤的密碼
$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();
}
// 與數(shù)據(jù)庫(kù)交互
$query = 'select firstname, lastname, email from tb_test;';
// 發(fā)送查詢(xún)給MySQL
$result = $mysqliConn->query($query);
// 迭代處理結(jié)果集
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);
// 告訴用戶(hù)影響了多少行
printf("%d row(s) have been deleted.<br/>", $mysqliConn->affected_rows);
// 重新查詢(xún)結(jié)果集
$query = 'select firstname, lastname, email from tb_test;';
// 發(fā)送查詢(xún)給MySQL
$result = $mysqliConn->query($query);
// 迭代處理結(jié)果集
while (list($firstname, $lastname, $email) = $result->fetch_row())
{
printf("%s %s's email:%s<br/>", $firstname, $lastname, $email);
}
// 關(guān)閉連接
$mysqliConn->close();
?>
3.釋放查詢(xún)內(nèi)存
有時(shí)可能會(huì)獲取一個(gè)特別龐大的結(jié)果集,此時(shí)一旦完成處理,很有必要釋放該結(jié)果集所請(qǐng)求的內(nèi)存。free()方法可以為我們完成這個(gè)任務(wù)。例如:
復(fù)制代碼 代碼如下:
// 與數(shù)據(jù)庫(kù)交互
$query = 'select firstname, lastname, email from tb_test;';
// 發(fā)送查詢(xún)給MySQL
$result = $mysqliConn->query($query);
// 迭代處理結(jié)果集
while (list($firstname, $lastname, $email) = $result->fetch_row())
{
printf("%s %s's email:%s<br/>", $firstname, $lastname, $email);
}
$result->free();
4.解析查詢(xún)結(jié)果
一旦執(zhí)行了查詢(xún)并準(zhǔn)備好結(jié)果集,下面就可以解析獲取到的結(jié)果行了。你可以使用多個(gè)方法來(lái)獲取各行中的字段,具體選擇哪一個(gè)方法主要取決于個(gè)人喜好,因?yàn)橹皇且米侄蔚姆椒ㄓ兴煌?/p>
(1)將結(jié)果放到對(duì)象中
使用fetch_object()方法來(lái)完成。fetch_object()方法通常在一個(gè)循環(huán)中調(diào)用,每次調(diào)用都使得返回結(jié)果集中的下一行被填入一個(gè)對(duì)象,然后可以按照PHP典型的對(duì)象訪問(wèn)語(yǔ)法來(lái)訪問(wèn)這個(gè)對(duì)象。例如:
復(fù)制代碼 代碼如下:
// 與數(shù)據(jù)庫(kù)交互
$query = 'select firstname, lastname, email from tb_test;';
// 發(fā)送查詢(xún)給MySQL
$result = $mysqliConn->query($query);
// 迭代處理結(jié)果集
while ($row = $result->fetch_object())
{
$firstname = $row->firstname;
$lastname = $row->lastname;
$email = $row->email;
}
$result->free();
(2)使用索引數(shù)組和關(guān)聯(lián)數(shù)組獲取結(jié)果
mysqli擴(kuò)展包還允許通過(guò)fetch_array()方法和fetch_row()方法分別使用關(guān)聯(lián)數(shù)組和索引數(shù)組來(lái)管理結(jié)果集。fetch_array()方法實(shí)際上能夠?qū)⒔Y(jié)果集的各行獲取為一個(gè)關(guān)聯(lián)數(shù)組、一個(gè)數(shù)字索引數(shù)組,或者同時(shí)包括二者,可以說(shuō),fetch_row()是fetch_array的一個(gè)子集。默認(rèn)地,fetch_array()會(huì)同時(shí)獲取關(guān)聯(lián)數(shù)組和索引數(shù)組,可以在fetch_array中傳入?yún)?shù)來(lái)修改這個(gè)默認(rèn)行為。
MYSQLI_ASSOC,將行作為一個(gè)關(guān)聯(lián)數(shù)組返回,鍵由字段名表示,值由字段內(nèi)容表示;
MYSQLI_NUM,將行作為一個(gè)數(shù)字索引數(shù)組返回,其元素順序由查詢(xún)中指定的字段名順序決定;
MYSQLI_BOTH,就是默認(rèn)的選項(xiàng)。
確定所選擇的行和受影響的行
通常希望能夠確定select查詢(xún)返回的行數(shù),或者受insert、update或delete影響的行數(shù)。
(1)確定返回的行數(shù)
如果希望了解select查詢(xún)語(yǔ)句返回了多少行,num_rows屬性很有用。例如:
復(fù)制代碼 代碼如下:
// 與數(shù)據(jù)庫(kù)交互
$query = 'select firstname, lastname, email from tb_test;';
// 發(fā)送查詢(xún)給MySQL
$result = $mysqliConn->query($query);
// 獲取行數(shù)
$result->num_rows;
記住,num_rows只在確定select查詢(xún)所獲取的行數(shù)時(shí)有用,如果要獲得受insert、update或delete影響的行數(shù),就要使用下面總結(jié)的affected_rows屬性。
(2)確定受影響的行數(shù)
affected_rows屬性用來(lái)獲取受insert、update或delete影響的行數(shù)。代碼示例見(jiàn)上面的代碼。
執(zhí)行數(shù)據(jù)庫(kù)事務(wù)
有3個(gè)新方法增強(qiáng)了PHP執(zhí)行MySQL事務(wù)的功能,分別為:
1.autocommit函數(shù),啟用自動(dòng)提交模式;
autocommit()函數(shù)控制MySQL自動(dòng)提交模式的行為,由傳入的參數(shù)決定啟動(dòng)還是禁用自動(dòng)提交;傳入TRUE,則啟動(dòng)自動(dòng)提交,傳入false則禁用自動(dòng)提交。無(wú)論啟用還是禁用,成功時(shí)都將返回TRUE,失敗時(shí)返回FALSE。
2.commit函數(shù),提交事務(wù);將當(dāng)前事務(wù)提交給數(shù)據(jù)庫(kù),成功時(shí)返回TRUE,否則返回FALSE。
3.rollback函數(shù),回滾當(dāng)前事務(wù),成功時(shí)返回TRUE,否則返回FALSE。
到此,相信大家對(duì)“PHP連接和操作MySQL數(shù)據(jù)庫(kù)的方法”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。