搜尋
首頁後端開發PHP問題三分鐘帶你了解PHP中MySQLi

從這篇文章開始,我們學習MySQLi擴充。可以說MySQL(原始)擴充是我們很多人剛開始學習PHP時連接資料庫的入門導師。現在如果想要使用過程式的程式碼來操作資料庫,只能使用mysqli擴充了。

三分鐘帶你了解PHP中MySQLi

關於 PDO 的學習我們告一段落,從這篇文章開始,我們繼續學習另外一個 MySQL 擴展,也就是除了 PDO 之外的最核心的 MySQLi 擴展。可以說它的祖先,也就是 MySQL(原始) 擴充功能是我們很多人剛開始學習 PHP 時連接資料庫的入門導師。不過隨著時代的變遷,MySQL(原始) 擴充在 PHP7 中已經被徹底廢棄了。現在如果想要使用過程式的程式碼來操作資料庫,只能使用 mysqli 擴充了。當然,mysqli 擴充也是支援物件導向式的寫法的。

什麼是 MySQLi

MySQLi 擴充功能讓我們可以存取 MySQL4.1 以上版本的資料庫所提供的功能。它是專門針對 MySQL 資料庫的,不像 PDO 可以透過不同的 dns 來連接不同的資料庫。

與 MySQL 與 PDO 的差異與連結

首先,我們還是回顧一下最早的 MySQL 擴充。

  • 只以過程

  • 不支援預存程序、 多語句執行、 預處理語句

  • PHP7 中已經刪除了並且完全不支援

然後是PDO 

  • 只支援物件導向方式使用

  • 可以連接多種資料庫,切換資料庫帶來的變更少,甚至可能不用修改代碼

  • #支援預存程序、 多語句執行、 預處理語句

最後就是MySQLi 。

  • 支援物件導向與過程兩種寫法

  • #僅支援MySQL 資料庫

  • 支持預存程序、 多語句執行、 預處理語句

  • 跟隨PHP 及MySQL 的版本更新,可以更快速地支援更多的MySQL 進階特性

#從它們三個的這些特點來看,MySQL(原始)擴充肯定是不推薦了,就算是老的項目,只要是支援PDO 或MySQLi 的PHP 版本,都應該考慮將資料庫的連線轉換成這兩種方式之一。如果你還在 PHP5 的環境中學習 MySQL(原始)擴充功能的使用的話,也可以放下了。

而對於 PDO 和 MySQLi 的選擇來說,就仁者見智者見智了。本身它們其實並沒有什麼太大的差別,不過現代化的大型框架中基本上都會將 PDO 作為預設的資料庫連接來進行封裝,畢竟它的可移植性可以方便這些通用框架連接不同的資料庫。而在一些小型的框架或專案中,還是能夠見到 MySQLi 的身影。

當然,小眾並不意味著不好,就像日常開發中,我們很少會在PHP 環境中使用別的資料庫,那麼在自己的小專案中完全使用一套MySQLi 來操作資料庫反而更方便快速。同時,舊專案如果要切換到 PHP7 版本的話,如果之前使用的是 MySQL(原始)連接的資料庫,也能夠快速地將 MySQL(原始)的程式碼很方面地替換到 MySQLi 。

擴充功能的安裝及 MySQL8 需要注意的地方

MySQLi 的擴充功能是隨 PHP 原始碼一起發佈的,我們在編譯 PHP 的時候加上 --with-mysqli 就可以了。現在預設的資料庫驅動都是使用的 mysqlnd ,libmysql 也已經基本淘汰了。所以在編譯時不需要再加上其它的參數,直接進行編譯即可。

在連接 MySQL8 的時候需要注意,因為 MySQL8 伺服器會預設使用 caching_sha2_password 作為密碼的加密。而 PHP7.2.4 之前的版本中的 MySQLi 會使用 mysql_native_password 來對連線密碼進行加密,這樣就會導致無法連接到資料庫。大家可以修改 my.cnf 文件,設定 default_authentication_plugin=mysql_native_password ,讓 MySQL8 也用 mysql_native_password 來加密使用者密碼。

針對過程式

上文說過,MySQLi 是支援兩種寫法的,也就是物件導向和物件導向過程。簡單理解就是一種是 MySQL(原始)擴充的寫法,另一種寫法是類似 PDO 的寫法。我們先來看看過程導向的寫法。

$mysqli = mysqli_connect("localhost", "root", "", "blog_test");
$res = mysqli_query($mysqli, "SELECT * FROM zyblog_test_user");
$row = mysqli_fetch_assoc($res);
print_r($row);

是不是感覺 MySQL(原始)擴充功能的程式碼要移植過來真的很方便。方法名稱上全部改成 mysqli_xxx 就可以了。

物件導向式

物件導向式的就有點像 PDO 。我們要先取得一個連接句柄類,然後操作這個類別就可以了。

$mysqli = new mysqli("localhost", "root", "", "blog_test");
$res = $mysqli->query("SELECT * FROM zyblog_test_user");
$row = $res->fetch_assoc();
print_r($row);

面向对象和面向过程混用

另外,这两种方式还可以混合使用,不过并不推荐。混合起来使用的话很容易让看代码的人晕头转向。所以,最好还是在一个项目中就坚持使用一种方式。

$mysqli = new mysqli("localhost", "root", "", "blog_test");
$res = mysqli_query($mysqli, "SELECT * FROM zyblog_test_user");
$row = $res->fetch_assoc();
print_r($row);

在这段代码中,我们实例化了一个 mysqli 对象,然后使用面向过程的 mysqli_query() 函数来执行语句,接着又使用面向对象的方式来获取结果集。是不是很乱?但是它是可以正常运行的。

总结

从上面的内容中可以看出,PDO 的特点是支持多种不同类型的数据库,就像 Java 中的 JDBC 一样。而 MySQLi 虽然只支持 MySQL 数据库,但它却可以同时支持面向对象和面向过程两种写法。是我们针对老项目代码进行升级优化的好帮手。同时,它还是现在入门 PHP 学习相关数据库操作的首选。在接下来的文章中,我们将默认只使用 面向对象 式的写法来继续学习 MySQLi 扩展相关的知识。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/4.PHP中的MySQLi扩展学习(一)MySQLi介绍.php

推荐学习:php视频教程

以上是三分鐘帶你了解PHP中MySQLi的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:segmentfault。如有侵權,請聯絡admin@php.cn刪除
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

php怎么判断有没有小数点php怎么判断有没有小数点Apr 20, 2022 pm 08:12 PM

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

php怎么读取字符串后几个字符php怎么读取字符串后几个字符Apr 22, 2022 pm 08:31 PM

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境