【相關(guān)學(xué)習(xí)推薦:php編程(視頻)】
前面給大家簡單介紹了如何在本地安裝 MySQL 以及通過命令行和 GUI 客戶端軟件與 MySQL 服務(wù)器進(jìn)行交互。
在命令行可以通過命令與 MySQL 交互,在客戶端軟件可以通過圖形化界面與 MySQL 交互,那么在 PHP 程序中如何建立與 MySQL 的連接和交互呢?實(shí)際上,我們完全可以把 PHP 應(yīng)用看作是 MySQL 服務(wù)器的客戶端,然后通過封裝好的 PHP 擴(kuò)展包提供的 API 與 MySQL 服務(wù)器進(jìn)行交互,就好像我們?cè)诿钚泻涂蛻舳塑浖兴龅囊粯?,只不過現(xiàn)在這種交互由手動(dòng)操作轉(zhuǎn)變成了通過編寫對(duì)應(yīng)的 PHP 代碼來完成。
PHP MySQLi 擴(kuò)展PHP 官方提供了很多用于與 MySQL 服務(wù)器進(jìn)行交互的擴(kuò)展,從最早的 mysql 到后來增強(qiáng)版的 mysqli(更加安全),它們都是 PHP 函數(shù)式編程時(shí)代的擴(kuò)展包,一般來說,本地 PHP 集成開發(fā)環(huán)境都會(huì)自帶 mysqli
擴(kuò)展:
下面我們通過一個(gè)簡單的示例來演示如何通過 mysqli
擴(kuò)展與 MySQL 服務(wù)器交互。
示例代碼
在 php_learning
目錄下新增一個(gè) mysql
子目錄,然后在該子目錄下新建一個(gè) mysqli.php
文件,編寫一段通過 mysqli
擴(kuò)展 API 建立數(shù)據(jù)庫連接和查詢的代碼:
<?php $host = '127.0.0.1'; // MySQL 服務(wù)器主機(jī)地址 $port = 3306; // MySQL 服務(wù)器進(jìn)程端口號(hào) $user = 'root'; // 用戶名 $password = 'root'; // 密碼 $dbname = 'test'; // 使用的數(shù)據(jù)庫名稱 // 通過 mysqli 擴(kuò)展建立與 mysql 服務(wù)器的連接 $conn = mysqli_connect($host, $user, $password, $dbname, $port); // 在連接實(shí)例上進(jìn)行查詢 $sql = 'SELECT * FROM `post`'; $res = mysqli_query($conn, $sql); // 獲取所有結(jié)果 $rows = mysqli_fetch_all($res); var_dump($rows); // 釋放資源 mysqli_free_result($res); // 關(guān)閉連接 mysqli_close($conn);
可以看到,通過 mysqli_connect 函數(shù)即可建立與 MySQL 數(shù)據(jù)庫的連接,我們傳入了5個(gè)參數(shù),依次是數(shù)據(jù)庫主機(jī)、用戶名、密碼、數(shù)據(jù)庫名稱和端口號(hào),建立連接成功后,就可以持有這個(gè)連接實(shí)例通過 mysqli_query 函數(shù)執(zhí)行數(shù)據(jù)庫查詢了,我們將 SQL 語句作為第二個(gè)參數(shù)傳入,該函數(shù)的返回結(jié)果是一個(gè)查詢結(jié)果集實(shí)例,拿到這個(gè)實(shí)例之后,就可以通過 mysqli_fetch_*
系列函數(shù)獲取結(jié)果數(shù)據(jù)了。
這里我們通過 mysqli_fetch_all
函數(shù)獲取所有查詢結(jié)果,通過 php -S localhost:9000
啟動(dòng) PHP 內(nèi)置 HTTP 服務(wù)器:
就可以在瀏覽器中通過 http://localhost:9000/mysql/mysqli.php
打印的查詢結(jié)果了:
優(yōu)化渲染效果
這個(gè)時(shí)候頁面樣式可讀性很差,可以在源碼中打印輸出結(jié)果之前,插入一段 echo '<pre>'
代碼優(yōu)化渲染效果:
// 獲取所有結(jié)果 $rows = mysqli_fetch_all($res); echo '<pre>'; var_dump($rows);
刷新瀏覽器頁面,就可以看到如下打印效果:
相關(guān)學(xué)習(xí)推薦:mysql教程(視頻)
設(shè)置字符編碼
這里有個(gè)小問題,那就是 Emoji 表情符號(hào)沒有正常顯示出來,亂碼了,我們可以像在命令行中設(shè)置默認(rèn)字符編碼一樣,通過 mysqli_set_charset 函數(shù)設(shè)置字符編碼為 utf8mb4
:
// 通過 mysqli 擴(kuò)展建立與 mysql 服務(wù)器的連接 $conn = mysqli_connect($host, $user, $password, $dbname, $port); // 設(shè)置字符編碼為 utf8mb4 mysqli_set_charset($conn, 'utf8mb4'); ... // 獲取所有結(jié)果 $rows = mysqli_fetch_all($res); echo '<pre>'; var_dump($rows[2]);
刷新頁面就可以看到 Emoji 表情了:
返回關(guān)聯(lián)數(shù)組
目前返回的結(jié)果是索引數(shù)組,無法得知數(shù)值對(duì)應(yīng)的字段名,要獲取完整的字段名與字段值映射,可以將傳入 mysqli_fetch_all
函數(shù)的第二個(gè)參數(shù)值設(shè)置為 MYSQLI_ASSOC
來實(shí)現(xiàn)(默認(rèn)是 MYSQLI_NUM
):
// 獲取所有結(jié)果(關(guān)聯(lián)數(shù)組) $rows = mysqli_fetch_all($res, MYSQLI_ASSOC); echo '<pre>'; var_dump($rows[2]);
返回單條結(jié)果
上面返回的都是多條結(jié)果(即使只返回一條記錄,返回的也是多維數(shù)組),有時(shí)候,我們只想返回結(jié)果集中的第一條結(jié)果,這時(shí)候可以通過 mysqli_fetch_row 函數(shù)來實(shí)現(xiàn):
// 在連接實(shí)例上進(jìn)行查詢 $sql = 'SELECT * FROM `post` WHERE id = 1'; $res = mysqli_query($conn, $sql); // 獲取所有結(jié)果 /* $rows = mysqli_fetch_all($res, MYSQLI_ASSOC); echo '<pre>'; var_dump($rows);*/ // 獲取單條結(jié)果 $row = mysqli_fetch_row($res); echo '<pre>'; var_dump($row);
刷新瀏覽器測(cè)試頁面,打印結(jié)果如下:
可以看到返回結(jié)果已經(jīng)是一個(gè)一維數(shù)組了,只包含一條記錄。如果想要返回關(guān)聯(lián)數(shù)組結(jié)果,需要通過一個(gè)新的函數(shù) mysqli_fetch_assoc 函數(shù)來實(shí)現(xiàn):
// 獲取單條結(jié)果 // $row = mysqli_fetch_row($res); $row = mysqli_fetch_assoc($res); echo '<pre>'; var_dump($row);
對(duì)應(yīng)的打印結(jié)果如下:
將返回結(jié)果映射到指定對(duì)象
除了返回?cái)?shù)組格式結(jié)果外,還可以借助 mysqli_fetch_object 函數(shù)將數(shù)據(jù)庫查詢結(jié)果映射到指定對(duì)象實(shí)例并返回:
class Post { public $id; public $title; public $content; public $created_at; public function __toString() { return '[#' . $this->id . ']' . $this->title; } } // 將數(shù)據(jù)庫返回結(jié)果映射到指定個(gè)對(duì)象 $post = mysqli_fetch_object($res, Post::class); echo $post;
對(duì)應(yīng)的打印結(jié)果如下,說明對(duì)象映射成功(調(diào)用了對(duì)象的魔術(shù)方法 __toString
打印輸出該對(duì)象):
在上述數(shù)據(jù)庫查詢操作中,我們直接將原生 SQL 語句傳遞給 MySQL 數(shù)據(jù)庫執(zhí)行,如果 SQL 語句中包含了用戶傳遞的參數(shù),則存在 SQL 注入風(fēng)險(xiǎn),要避免 SQL 注入攻擊,在 mysqli
擴(kuò)展中,可以通過構(gòu)建預(yù)處理語句的方式實(shí)現(xiàn):
下面,我們以插入記錄到數(shù)據(jù)庫為例,演示如何通過預(yù)處理語句的方式與數(shù)據(jù)庫交互,提高代碼安全性。
插入記錄到數(shù)據(jù)庫我們首先基于預(yù)處理語句編寫插入記錄到數(shù)據(jù)庫的代碼如下(基于上面的 $conn
連接實(shí)例):
// 插入記錄到數(shù)據(jù)庫 $sql = 'INSERT INTO `post` (title, content, created_at) VALUES (?, ?, ?)'; // 構(gòu)建預(yù)處理 SQL 語句 $stmt = mysqli_prepare($conn, $sql); // 綁定參數(shù)值 $title = '這是一篇測(cè)試文章'; $content = '測(cè)試文章啊啊啊分享文章:借助PHPMysqli擴(kuò)展實(shí)現(xiàn)MySQL數(shù)據(jù)庫交互
路徑分享:http://www.rwnh.cn/article20/cgpijo.html成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、定制開發(fā)、App設(shè)計(jì)、微信公眾號(hào)、響應(yīng)式網(wǎng)站、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)