国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網 會員登陸 & 注冊

PHP數據庫驅動擴展概述與不同方式連接數據庫總結

2020-09-18 22:20 作者:極客小俊GeekerJun  | 我要投稿

極客小俊

?一個專注于web技術的80后

你不用拼過聰明人,你只需要拼過那些懶人 你就一定會超越大部分人!



前言

主要說兩個方面

  1. PHP數據庫驅動的簡介

  2. PHP連接數據庫的不同方式案例比較

PHP數據庫驅動簡介


這里的驅動是指的一段特定類型的數據庫服務器進行交互的軟件代碼。驅動可能會調用一些庫。類似于Java中的數據庫驅動的概念

其實也就是數據庫廠商提供的數據庫操作二進制代碼庫!

例如: Oracle中的oci.dll、

PHP數據庫驅動

數據庫驅動位于PHP和數據庫進行通信的最底層,這一層就是數據庫驅動層, 不同的數據庫廠商都會在基于某個框架的前提下實現自己的驅動,用以提供基本功能、以及特定數據庫的高級功能

PHP連接器

在數據庫驅動層之上是 連接器、或者叫適配器抽象層,或者通俗點叫連接層、用于PHP代碼和數據庫進行連接,

比如PHP開發(fā)者可以使用PDO(PHP Database Object)、或者直接使用擴展接口(mysql、mysqli) 這些暴露出來的API函數來與底層數據庫進行通信。


數據庫驅動層、連接器 、PHP代碼應用層 圖如下

在這里插入圖片描述

小知識:文件類型數據庫

?文件型是一種基于文件的數據庫引擎,而且使用文件I/O(輸入/輸出)函數來存儲和讀取來自磁盤上文件的數據庫。
?它普遍也比關系型數據庫(例如Mysql)小很多! (例如典型的文件型數據庫SQLite命令行版本的大小小于200KB)
?同時,文件型數據庫支持你所熟悉的大部分SQL命令,同時具有易于攜帶的特點


PHP連接數據庫的不同方式、以及不同業(yè)務場景下的優(yōu)缺點


1.使用擴展API接口與數據庫通信


PHP代碼是由一些可選擴展組成的核心功能

PHP 的MySQL數據庫相關擴展,比如mysqli,mysql都是基于PHP擴展框架實現的

這些擴展的作用就是暴露一個API給PHP程序員, 允許擴展自己的功能可以被程序員使用


當然,也有一部分基于PHP擴展框架 開發(fā)的擴展不會給PHP程序員暴露API接口。 比如說PDO MySQL驅動擴展,就沒有向PHP程序員暴露API接口,但是向它上層的PDO層提供了一個接口

在實際編程中,使用頻度最多的還是以擴展API的方式去連接數據庫

mysql擴展

小伙伴是不是經常修改php.ini文件的時候看見了extension=php_mysql.dll 這個東西呢 它就是一個mysql擴展,

這是開發(fā)時允許PHP應用與MySQL數據庫交互的早期擴展 , mysql擴展提供了一個面向過程的接口,并且是針對MySQL4.1.3或更早版本設計的。

mysql擴展的位置是在早期的5.x版本的PHP目錄下的ext/mysql.dll

因此,這個擴展雖然可以與MySQL4.1.3或更新的數據庫服務端進行交互,但并不支持后期最新的MySQL服務端提供的一些特性以及功能, 所以后來大家在現在的php7.x當中就看不見mysql.dll這個擴展了 被官方取消了!

######

? //連接數據庫
? ? ?$link = mysql_connect('主機地址', '數據庫用戶名', '密碼') or die('Could not connect: ' . mysql_error());
? ? ?echo 'Connected successfully';
?
? //選擇數據庫
? ? ?mysql_select_db('數據庫名稱') or die('錯誤信息');
?
? ? ?// 執(zhí)行 SQL 查詢
? ? ?$query = 'SELECT * FROM 表名稱';
? ? ?$result = mysql_query($query) or die('錯誤信息' . mysql_error());
?
? ? ?// 以 HTML 打印查詢結果
?
? ? ?echo "<table>\n";
?
? //循環(huán)的從結果集當中一條一條的獲取數據 渲染遍歷輸出!
? ? ?while ($line = mysql_fetch_array($result, MYSQL_ASSOC))
? ? ?{
? ? ? ? ?echo "\t<tr>\n";
? ? ? ? ?foreach ($line as $col_value)
? ? ? ? ?{
? ? ? ? ? ? ?echo "\t\t<td>$col_value</td>\n";
? ? ? ? ?}
? ? ? ? ?echo "\t</tr>\n";
? ? ?}
? ? ?echo "</table>\n";
?
? ? ?//釋放結果集
? ? ?mysql_free_result($result);
?
? ? ?//關閉連接
? ? ?mysql_close($link);


mysqli擴展

mysqli擴展,我們有時稱之為MySQL增強擴展,可以用于使用MySQL4.1.3或更新版本中新的高級特性, 所以大家能夠在php7.x的ext擴展目錄中找到php_mysqli.dll 這個擴展, ?mysqli擴展在PHP 5及以后版本中都會包含!

mysqli擴展有一系列的優(yōu)勢,相對于mysql擴展的提升主要有如下:

?. 面向對象接口 ?可以理解成有面向對象的方式來書寫代碼
?. prepared語句支持(即參數編譯預處理,可以有效防御SQL注入的發(fā)生)
?. 多語句執(zhí)行支持
?. 事務支持
?. 增強的調試能力
?. 嵌入式服務支持
?. 在提供了面向對象接口的同時也提供了一個面向過程的接口。

所以這也大大提高了開發(fā)者的可選擇性. 和性能的優(yōu)越性

mysqli擴展是使用PHP擴展框架構建的,它的在PHP目錄下的ext/mysqli.dll中

使用案例

? ?$con = new mysqli("數據庫主機名", "用戶名", "密碼", "數據庫名稱");
? ? ?/* check connection */
?
? ? ? //判斷返回的值是否大于0 大于0就說明有錯誤 ?
? ? ?if (mysqli_connect_errno())
? ? ?{
? ? ? ? ?printf("Connect failed: %s\n", mysqli_connect_error());
? ? ? ? ?exit();
? ? ?}
?
? //預處理SQL
? ? ?$sql = "select name from users where name = ? and pass = ?";
? ? ?$cmd = $con->prepare($sql);
?
? //接收數據
? ? ?$name = $_GET['name'];
? ? ?$pass = $_GET['pass'];
?
? ? ?//向sql查詢添加綁定參數
? ? ?$cmd->bind_param("ss", $name, $pass);
?
? //執(zhí)行準備好的預處理查詢語句
? ? ?$cmd->execute();
?
? //將變量綁定到準備好的語句以進行結果存儲, 其實就是拿一個變量來保存結果
? ? ?$cmd->bind_result($result);
?
? //將準備好的語句的結果提取到綁定變量中
? ? ?$cmd->fetch();
?
? //判斷結果是否已經存在? 存在就打印出來
? ? ?if($result)
? ? ?{
? ? ? ? ?var_dump($result);
? ? ?}

mysqli除了可以使用參數編譯預處理來進行數據庫的信息通信交互,同時也兼容使用面向過程的編碼方式

這個就看開發(fā)者的個人習慣而定了 你喜歡這么使用就怎么使用

使用案例

? /* ?連接數據庫服務器 */ ?
? ? ?$link = mysqli_connect( ?
? ? ? ? ? ? ? ? ?'連接MySQL地址', ? ? /* The host to connect to 連接MySQL地址 */ ?
? ? ? ? ? ? ? ? ?'用戶名', ? ? ? ? ? /* The user to connect as 連接MySQL用戶名 */ ?
? ? ? ? ? ? ? ? ?'密碼', ? ? /* The password to use 連接MySQL密碼 */ ?
? ? ? ? ? ? ? ? ?'連接數據庫名稱'); ? ?/* The default database to query 連接數據庫名稱*/ ?
? ? ? ?
? //判斷是否成功 失敗輸出失敗錯誤代碼
? ? ?if (!$link)
? ? ?{ ?
? ? ? ? ?printf("Can't connect to MySQL Server. Errorcode: %s ", mysqli_connect_error()); ?
? ? ? ? ?exit; ?
? ? ?} ?
? ? ? ?
? ? ?/* 向服務器發(fā)送查詢SQL語句請求*/ ?
? ? ?if ($result = mysqli_query($link, 'SELECT * from 表名稱'))
? ? ?{ ? ?
? ? ? ? ?/* 返回查詢的結果 并遍歷結果集 一條一條的循環(huán)遍歷輸出 */ ?
? ? ? ? ?while( $row = mysqli_fetch_assoc($result) )
? ? ? ? ?{ ?
? ? ? ? ? ? ?printf("%s (%s) ", $row['字段名'], $row['字段名']); ?
? ? ? ? ?} ?
? ? ? ?
? ? ? ? ?/* 結束查詢釋放內存*/ ?
? ? ? ? ?mysqli_free_result($result); ?
? ? ?} ?
? ? ? ?
? ? ?/* 關閉連接*/ ?
? ? ?mysqli_close($link); ?

PHP還支持很多其他的數據庫連接擴展,使用方法都類似,只要遵循函數調用規(guī)范即可!

更多詳情參考官方文檔: ?https://www.php.net/manual/zh/refs.database.php


2.使用PDO抽象層與數據庫通信


PDO中文簡稱數據對象, 英文全稱:PHP Database Object

PDO數據庫訪問抽象層是統(tǒng)一各種數據庫的訪問接口、是PHP應用中的一個數據庫抽象層規(guī)范

PDO提供了一個統(tǒng)一的API接口, 可以使得你的PHP應用不去關心具體要連接的數據庫服務器系統(tǒng)類型

通俗點說, 也就是如果你使用PDO的API,可以在任何需要的時候 無縫切換數據庫服務器,比如從Firebird到MySQL,僅僅需要修改很少的PHP 代碼就可以辦到! 是不是很方便呢 ?


小提示: 利用 PDO 擴展自身并不能實現任何數據庫功能, 注意是功能! 必須使用一個具體數據庫的PDO驅動來訪問想要的數據庫服務(它只是一個接口規(guī)范)


但是一個接口提供的兼容性越強,它的定制性、特異性就相應越弱(這個應該不難理解吧)

PDO接口API的主要缺點是會限制讓你不能使用MySQL服務端提供所有的數據庫高級特性。

比如,PDO不允許使用MySQL支持的多語句執(zhí)行, 如下圖

clipboard.png


在PHP5中,PDO目前已經支持大量數據庫, 例如

?1. sqlite
?2. mysql
?3. pgsql
?4. mssql
?...


PDO是基于PHP擴展框架實現的,它的源碼在PHP目錄的ext/php_pdo_*

再一次強調,PDO只是一個接口規(guī)范,它自身并不實現任何的數據庫功能,開發(fā)者必須使用一個具體數據庫的"PDO驅動"來訪問特定的數據庫


php_pdo_mysql擴展

PDO連接MySQL要在php.ini中的配置參數是: extension=php_pdo_mysql.dll ?這個配置必須要打開才能連接MySQL服務

基本使用案例如下

? ? ?$dbhost="主機名";
? ? ?$dbname="數據庫名稱";
? ? ?$dbusr="用戶名";
? ? ?$dbpwd="密碼";
? ? ?$dbhdl=NULL;
? ? ?$dbstm=NULL;
?
? //連接數據庫參數配置
? ? ?$opt = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',);
? ? ?$dsn='mysql:host=' . $dbhost . ';port=3306;dbname=' . $dbname;
? ? ?try
? ? ?{
? ? ? ? ?$dbhdl = new PDO($dsn, $dbusr, $dbpwd, $opt);
? ? ? ? ?//設置屬性 ?錯誤報告 和 錯誤拋出異常
? ? ? ? ?$dbhdl->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
? ? ?}
? ? ?catch (PDOExceptsddttrtion $e)
? ? ?{
? ? ? ? ?//return PDOException
? ? ? ? ?print "Error!: " . $e->getMessage() . "<br>";
? ? ? ? ?die();
? ? ?}
?
? // 執(zhí)行SQL語句,將結果集作為PDOStatement對象返回
? ? ?$dbstm = $dbhdl->query('SELECT * from p8_ad_user LIMIT 0,1');
?
? //從包含的結果集當中取出所有行并且返回數組
? ? ?$rows = $dbstm->fetchAll(PDO::FETCH_ASSOC);//也可以使用$rows = $dbhdl->Fetch();
? //打印結果
? ? ?print_r($rows);
?
?


php_pdo_pgsql擴展

extension=php_pdo_pgsql.dll

PDO連接PostgreSQL 要在php.ini中的配置參數是: extension=php_pdo_pgsql.dll ?這個配置必須要打開才能連接PostgreSQL 服務

這個其實我也沒怎么常用!

基本使用案例如下

? ? ?$host = "主機地址";
? ? ?$user = "用戶名";
? ? ?$pass = "密碼";
? ? ?$db = "數據庫名稱";
? ? ?$cursor = "cr_123456";
?
? ? ?try
? ? ?{
? ? ? ? ?//連接配置
? ? ? ? ?$dbh = new PDO("pgsql:host=$host;port=5432;dbname=$db;user=$user;password=$pass");
? ? ? ? ?echo "Connected<p>";
? ? ?}
? ? ?catch (Exception $e)
? ? ?{
? ? ? ? ?echo "Unable to connect: " . $e->getMessage() ."<p>";
? ? ?}
? ? ?$dbh->beginTransaction();
? ? ?
? //執(zhí)行查詢
? ? ?$query = "SELECT * from p8_ad_user LIMIT 0,1";
? ? ?$dbh->query($query);
? ? ?$query = "FETCH ALL IN \"$cursor\"";
?
? ? ?echo "begin data<p>";
? ? ?//遍歷結果
? ? ?foreach ($dbh->query($query) as $row)
? ? ?{
? ? ? ? ?echo "$row[0] $row[1] $row[2] <br>";
? ? ?} ?
? ? ?echo "end data";

這里只簡單的說一說Mysql、PostGreSQL的案例,事實上,PDO這種抽象層方式可以訪問目前主流的大多數的數據庫


3.使用ODBC抽象層與數據庫通信

ODBC基本介紹

ODBC在PHP的手冊上基本上都全是英文的 所以對一些英文不好的小白可能不太友好 ,在這里我也簡單的說一下


ODBC的英文全稱 (Open Database Connectivity) 是一種開放數據庫互連 也就是一個應用程序編程接口(Application Programming Interface,簡稱API),使我們有能力連接到某個數據源、它為編寫關系數據庫的客戶軟件提供了一種統(tǒng)一的接口。


使用ODBC API 的應用程序可以與任何具有ODBC驅動程序的關系數據庫進行通信、

ODBC 是為客戶應用程序訪問關系數據庫時提供的一個標準的接口、對于不同的數據庫,ODBC 提供了統(tǒng)一的 API,使用該 API 來訪問任何提供了 ODBC 驅動程序的數據庫

圖解如下

在這里插入圖片描述


總的來說和之前說的擴展API接口、PDO抽象層 略有不同,使用ODBC連接數據庫要稍微麻煩一點

使用ODBC需要對目標數據庫服務器的操作系統(tǒng)進行一些配置,即創(chuàng)建ODBC數據源,然后才可以進行ODBC連接, 就如同上面的圖中 我們要在接口驅動程序管理器中配置ODBC數據源, 比如我們要使用ODBC連接MySQL就要先安裝MySQL的ODBC驅動程序!


MySQL ODBC驅動安裝和配置數據源

第一步

  1. 驅動程序下載地址https://dev.mysql.com/downloads/connector/odbc/

  2. 選擇適合自己電腦版本(我的操作系統(tǒng)是Win10,64位)

在這里插入圖片描述


進入下載界面后,我們不登錄(Login)也不注冊(Sign Up)。直接點左下角的【No thanks,just start my download.】即可開始下載。

在這里插入圖片描述

下載完安裝包后,雙擊打開安裝包,按照默認選項進行安裝即可。


第二步

配置數據源

打開控制面板\所有控制面板項\管理工具\ODBC 數據源

在這里插入圖片描述


在控制面板下的管理工具,找到ODBC數據源后 雙擊打開

在這里插入圖片描述

?在【用戶DSN】選項卡中單擊【添加】按鈕,然后選擇MySQL ODBC 8.0 Unicode Driver ?單擊完成!

在這里插入圖片描述

注意 :這里要說明一下“MYSQL ODBC 8.0 ANSI Driver”和“MySQL ODBC 8.0 Unicode Driver”的區(qū)別: ①MySQL ODBC 8.0 ANSI Driver 只針對有限的字符集的范圍; ②MySQL ODBC 8.0 Unicode Driver 提供了更多字符集的支持,也就是提供了多語言的支持


單擊完成后會彈出填寫配置信息對話框 前兩個選項可根據項目功能信息填寫, 然后按具體情況填寫TCP/IP Server和Port, 然后是MySQL用戶名、密碼、數據庫名稱。

在這里插入圖片描述

Data Source Name: ? //數據源名稱,可自擬(最好跟項目功能掛鉤) Description: ? ? ? //關于此數據源的描述,主要功能等,可不填寫 TCP/IP Server: ? ? //服務器名稱,可以是機器名,也可以是IP地址;若是本地可填寫“l(fā)ocalhost” Port: ? ? ? ? ? ? ?//MySQL服務的端口號,默認是3306,也可在安裝MySQL時自己設定 User: ? ? ? ? ? ? ?//用戶名,默認是root,也可在安裝MySQL時自己設定 Password: ? ?//密碼 Database: ? ?//數據庫名稱


填寫完后可點擊【Test】按鈕,測試一下連接是否配置成功!如果成功會有連接成功的提示!

在這里插入圖片描述

若測試成功,再點擊 OK 按鈕即可!在用戶DSN處即可查看到最新創(chuàng)建的ODBC

在這里插入圖片描述

到這里就配置好了 MySQL ODBC驅動程序了


PHP用ODBC連接MySQL

首先檢查PHP目錄下的php.ini中,extension=odbc 擴展是否打開!

代碼案例如下:

$dsn="Driver={MySQL ODBC 8.0 Unicode Driver};Server=localhost;Database=shop;charset=utf8"; $conn_odbc = odbc_connect($dsn, "root", "密碼"); //如果SQL命令執(zhí)行成功,則返回ODBC結果標識符 $row = odbc_do($conn_odbc,"SELECT * FROM test4"); //獲取數據總條數 $odbc_num_rows = odbc_num_rows($row); echo "找到記錄數量:".$odbc_num_rows; echo "<br>"; //從標識當中判斷是否有行 if (odbc_fetch_row($row)){ ? ? //獲取結果數據 ? ? echo '名稱:'.odbc_result($row,"brand"); ? ? echo '<br>'; ? ? echo '顏色:'.odbc_result($row,"color"); }

特別注意: 編碼的一定要統(tǒng)一!


總結

差不多了吧。。以上就是PHP連接數據庫的不同方式

目前PHP開發(fā)中主流使用的連接數據庫的技術是?

1. Mysqli擴展API?

2. PDO抽象層




如果喜歡話請 點贊 ?投幣 ?收藏 一鍵三連 ?

大家的支持就是我堅持下去的動力!

不要忘了?? 關注 ??哦!






PHP數據庫驅動擴展概述與不同方式連接數據庫總結的評論 (共 條)

分享到微博請遵守國家法律
瓮安县| 如东县| 南川市| 阿鲁科尔沁旗| 双城市| 平顶山市| 临夏市| 西乌| 右玉县| 资中县| 视频| 垦利县| 咸阳市| 达州市| 祥云县| 饶阳县| 旌德县| 海丰县| 平果县| 宣汉县| 晋江市| 惠东县| 奉贤区| 廊坊市| 平潭县| 界首市| 遂昌县| 高邑县| 紫阳县| 阳朔县| 双峰县| 延长县| 平乡县| 曲麻莱县| 万源市| 夹江县| 凭祥市| 兴宁市| 龙口市| 武汉市| 梧州市|