内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

借助PHPMysqli擴(kuò)展實(shí)現(xiàn)MySQL數(shù)據(jù)庫交互

【相關(guān)學(xué)習(xí)推薦:php編程(視頻)】

創(chuàng)新互聯(lián)建站長期為數(shù)千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為麥蓋提企業(yè)提供專業(yè)的成都做網(wǎng)站、成都網(wǎng)站建設(shè),麥蓋提網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。引言

前面給大家簡單介紹了如何在本地安裝 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ù)器交互。

數(shù)據(jù)庫連接與查詢

示例代碼

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ì)象):

避免 SQL 注入攻擊

在上述數(shù)據(jù)庫查詢操作中,我們直接將原生 SQL 語句傳遞給 MySQL 數(shù)據(jù)庫執(zhí)行,如果 SQL 語句中包含了用戶傳遞的參數(shù),則存在 SQL 注入風(fēng)險(xiǎn),要避免 SQL 注入攻擊,在 mysqli擴(kuò)展中,可以通過構(gòu)建預(yù)處理語句的方式實(shí)現(xiàn):

首先通過 mysqli_prepare 函數(shù)構(gòu)建包含占位符(替代具體參數(shù)值)的預(yù)處理 SQL 語句;然后通過 mysqli_stmt_bind_param 函數(shù)將參數(shù)值綁定到預(yù)處理語句;最后通過 mysqli_stmt_execute 函數(shù)執(zhí)行填充參數(shù)值之后的完整 SQL 語句,由于底層做了轉(zhuǎn)化處理,所以這時(shí)候執(zhí)行的 SQL 語句不存在 SQL 注入風(fēng)險(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)

綿陽服務(wù)器托管
科尔| 巢湖市| 集贤县| 临桂县| 建阳市| 富蕴县| 武汉市| 衡山县| 蒲江县| 六盘水市| 湾仔区| 乐都县| 玉田县| 陇川县| 苗栗市| 图木舒克市| 肇庆市| 务川| 柳林县| 鹿邑县| 和静县| 车险| 米易县| 大方县| 高阳县| 甘孜县| 梓潼县| 长泰县| 江门市| 酒泉市| 郸城县| 德安县| 赞皇县| 襄汾县| 丹凤县| 江油市| 唐河县| 巴彦淖尔市| 友谊县| 云安县| 明水县|