2021-06-17

PHP 操作数据库及 MVC 框架简介

1、PHP 相关环境配置
修改配置文件: php.ini文件中: ;extension=mysqli”,将分号去掉
php无法直接连接数据,需要扩展: mysqli、PDO

2、PHP 连接数据库
实例 (MySQLi - 面向对象)

<?php $servername = "localhost"; $username = "username"; $password = "password"; ​ // 创建连接 $conn = new mysqli($servername, $username, $password); ​ // 检测连接 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } echo "连接成功"; ?>

实例 (MySQLi - 面向过程)

<?php $servername = "localhost"; $username = "username"; $password = "password"; ​ // 创建连接 $conn = mysqli_connect($servername, $username, $password); ​ // 检测连接 if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } echo "连接成功"; ?>

实例 (PDO)

<?php $servername = "localhost"; $username = "username"; $password = "password"; ​ try { $conn = new PDO("mysql:host=$servername;", $username, $password); echo "连接成功"; } catch(PDOException $e) { echo $e->getMessage(); } ?>

关闭连接

连接在脚本执行完后会自动关闭。你也可以使用以下代码来关闭连接:

实例 (MySQLi - 面向对象)

$conn->close();

实例 (MySQLi - 面向过程)

mysqli_close($conn);

实例 (PDO)

$conn = null;

3、 PHP 基础操作数据库

面向对象方式创建数据库
// 创建数据库
s q l = " C R E A T E D A T A B A S E m y D B " ; i f ( sql = "CREATE DATABASE myDB"; if ( sql="CREATEDATABASEmyDB";if(conn->query($sql) === TRUE) {
echo “数据库创建成功”;
} else {
echo "Error creating database: " . $conn->error;
}

面向对象方式创建数据表
// 使用 sql 创建数据表
s q l = " C R E A T E T A B L E M y G u e s t s ( i d I N T ( 6 ) U N S I G N E D A U T O I N C R E M E N T P R I M A R Y K E Y , f i r s t n a m e V A R C H A R ( 30 ) N O T N U L L , l a s t n a m e V A R C H A R ( 30 ) N O T N U L L , e m a i l V A R C H A R ( 50 ) , r e g d a t e T I M E S T A M P ) " ; ​ i f ( sql = "CREATE TABLE MyGuests ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(30) NOT NULL, lastname VARCHAR(30) NOT NULL, email VARCHAR(50), reg_date TIMESTAMP )"; ​ if ( sql="CREATETABLEMyGuests(idINT(6)UNSIGNEDAUTOINCREMENTPRIMARYKEY,firstnameVARCHAR(30)NOTNULL,lastnameVARCHAR(30)NOTNULL,emailVARCHAR(50),regdateTIMESTAMP)";if(conn->query($sql) === TRUE) {
echo “Table MyGuests created successfully”;
} else {
echo "创建数据表错误: " . $conn->error;
}
面向对象方式插入一条或者多条数据
s q l = " I N S E R T I N T O M y G u e s t s ( f i r s t n a m e , l a s t n a m e , e m a i l ) V A L U E S ( ′ J o h n ′ , ′ D o e ′ , ′ j o h n @ e x a m p l e . c o m ′ ) " ; ​ i f ( sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', 'john@example.com')"; ​ if ( sql="INSERTINTOMyGuests(firstname,lastname,email)VALUES(John,Doe,john@example.com)";if(conn->query($sql) === TRUE) {
echo “新记录插入成功”;
} else {
echo "Error: " . $sql . “
” . $conn->error;
}
$sql = “INSERT INTO MyGuests (firstname, lastname, email)
VALUES (‘John’, ‘Doe’, ‘john@example.com’);”;
$sql .= “INSERT INTO MyGuests (firstname, lastname, email)
VALUES (‘Mary’, ‘Moe’, ‘mary@example.com’);”;
s q l . = " I N S E R T I N T O M y G u e s t s ( f i r s t n a m e , l a s t n a m e , e m a i l ) V A L U E S ( ′ J u l i e ′ , ′ D o o l e y ′ , ′ j u l i e @ e x a m p l e . c o m ′ ) " ; ​ i f ( sql .= "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('Julie', 'Dooley', 'julie@example.com')"; ​ if ( sql.="INSERTINTOMyGuests(firstname,lastname,email)VALUES(Julie,Dooley,julie@example.com)";if(conn->multi_query($sql) === TRUE) {
echo “新记录插入成功”;
} else {
echo "Error: " . $sql . “
” . $conn->error;
}

4、预处理语句及绑定参数

预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高。

INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
预处理语句的工作原理如下:

预处理:创建 SQL 语句模板并发送到数据库。预留的值使用参数 “?” 标记 。例如:
数据库解析,编译,对SQL语句模板执行查询优化,并存储结果不输出。
执行:最后,将应用绑定的值传递给参数("?" 标记),数据库执行语句。应用可以多次执行语句,如果参数的值不一样。
相比于直接执行SQL语句,预处理语句有两个主要优点:

预处理语句大大减少了分析时间,只做了一次查询(虽然语句多次执行)。
绑定参数减少了服务器带宽,你只需要发送查询的参数,而不是整个语句。
预处理语句针对SQL注入是非常有用的,因为参数值发送后使用不同的协议,保证了数据的合法性。
// 预处理及绑定
$stmt = $conn->prepare(“INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)”);
$stmt->bind_param(“sss”, $firstname, $lastname, $email);
// 设置参数并执行
$firstname = “John”;
$lastname = “Doe”;
$email = “john@example.com”;
$stmt->execute();
$firstname = “Mary”;
$lastname = “Moe”;
$email = “mary@example.com”;
$stmt->execute();
$firstname = “Julie”;
$lastname = “Dooley”;
$email = “julie@example.com”;
$stmt->execute();
echo “新记录插入成功”;

5、MySQL 查询数据

在MySQL数据库中查询数据通用的 SELECT 语法:
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]
查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
SELECT 命令可以读取一条或者多条记录。
你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
你可以使用 WHERE 语句来包含任何条件。
你可以使用 LIMIT 属性来设定返回的记录数。
你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。
使用 mysqli_fetch_array MYSQLI_ASSOC 参数获取数据:

<?php $dbhost = 'localhost'; // mysql服务器主机地址 $dbuser = 'root'; // mysql用户名 $dbpass = '123456'; // mysql用户名密码 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('连接失败: ' . mysqli_error($conn)); } // 设置编码,防止中文乱码 mysqli_query($conn , "set names utf8"); ​ $sql = 'SELECT runoob_id, runoob_title, runoob_author, submission_date FROM runoob_tbl'; ​ mysqli_select_db( $conn, 'RUNOOB' ); $retval = mysqli_query( $conn, $sql ); if(! $retval ) { die('无法读取数据: ' . mysqli_error($conn)); } while($row = mysqli_fetch_array($retval, MYSQLI_ASSOC)) { echo $row; } mysqli_close($conn); ?>

使用 mysqli_fetch_assoc 获取数据

<?php $dbhost = 'localhost:3306'; // mysql服务器主机地址 $dbuser = 'root'; // mysql用户名 $dbpass = '123456'; // mysql用户名密码 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('连接失败: ' . mysqli_error($conn)); } // 设置编码,防止中文乱码 mysqli_query($conn , "set names utf8"); ​ $sql = 'SELECT runoob_id, runoob_title, runoob_author, submission_date FROM runoob_tbl'; ​ mysqli_select_db( $conn, 'RUNOOB' ); $retval = mysqli_query( $conn, $sql ); if(! $retval ) { die('无法读取数据: ' . mysqli_error($conn)); } while($row = mysqli_fetch_assoc($retval)) { echo $row; } mysqli_close($conn); ?>

6、PDO 使用

PHP PDO

PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。

PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。

PDO 链接数据库

<?php $dbms='mysql'; //数据库类型 $host='localhost'; //数据库主机名 $dbName='test'; //使用的数据库 $user='root'; //数据库连接用户名 $pass=''; //对应的密码 $dsn="$dbms:host=$host;dbname=$dbName"; ​ ​ try { $dbh = new PDO($dsn, $user, $pass); //初始化一个PDO对象 echo "连接成功
"; /*你还可以进行一次搜索操作 foreach ($dbh->query('SELECT * from FOO') as $row) { print_r($row); //你可以用 echo($GLOBAL); 来看到这些值 } */ $dbh = null; } catch (PDOException $e) { die ("Error!: " . $e->getMessage() . "
"); } //默认这个不是长连接,如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true) 变成这样: $db = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true)); ​ ?>

执行sql语句
$result = $pdo->query(sql); query方法通常用来执行查询
$row = $pdo->exec(sql); exec方法用来执行增删改,返回受影响行数
预处理语句: 为了减轻服务器压力,先发送带有占位符的sql语句给服务器,再将参数给服务器
$sql = “select * from userinfo where username = ? and password = ?”;
$stmt = p d o − > p r e p a r e ( pdo->prepare( pdo>prepare(sql); //将sql语句发送给服务器,服务器返回预处理结果
$username = “wjk”; $password = “123”;
s t m t − > b i n d P a r a m ( 1 , stmt->bindParam(1, stmt>bindParam(1,username); //bindParam方法第二个参数,必须传递变量
s t m t − > b i n d P a r a m ( 2 , stmt->bindParam(2, stmt>bindParam(2,password);
$result = $stmt->execute();//执行sql语句,返回true或false
pdo解析结果集
$result->fetch(PDO::FETCH_ASSOC); //以关联式数组返回数据
$result->fetch(PDO::FETCH_NUM); //以索引数组返回数据
$result->fetch(PDO::FETCH_OBJ); //以对象返回数据
fetchAll: 用法同上,返回所有行数
fetchColumn(第几列) :返回第几列数据

7、MVC 三层架构简介

什么是 MVC 框架?
MVC 框架 Model View Controller,是模型-视图-控制器的缩写。

model 是应用程序中用于处理数据逻辑的部分,通常模型对象负责在数据库中存取数据。
view 是应用程序中处理数据显示的部分,通常视图是依据数据模型创建的。
controller 是应用程序中处理数据交互的部分,通常控制器负责从视图读取数据,控制用户输入,并向模型发送。
mvc 的优点

多个视图共享一个模型,大大提高代码的可重用性。
三个模块相互独立,改变其中一个不会影响其他两,所以依据这种设计模式能构建良好的松耦合性的组件。
控制器提高了应用程序的灵活性和可控制性。控制器可以用来连接不同的模型和视图去完成用户的需求,这样控制器可以为构造应用程序提高强有力的手段。
mvc的缺点

增加了系统结构和实现的复杂性,对于简单页面,严格遵循 mvc,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。
视图与控制器过于紧密的连接,视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。
视图对模型数据的低效率访问,依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。
什么是前后端分离开发?
传统的开发模式下的系统数据交互图:

mvc-01

传统开发模式的劣势和不足:

开发出的软件响应速度慢,质量差,用户体现差。 前后端严重耦合,代码混乱,可维护性差。 研发人员前后端兼顾,开发效率低下,研发周期变长。

为了解决传统开发模式中的这些病痛,前后端分离框架应用而生。 从项目维护的角度上,传统的开发模式,前端代码和后端代码耦合在一起,导致代码混乱不堪,极大的降低了项目的可维护性,增加了维护成本。

从开发角度来看,研发人员在开发过程中,不仅要设计后端架构还要兼顾前端展示,导致开发效率低下,延长开发周期。扬长避短,为什么不让专业的人去做专业的事?

什么是前后端分离? 在前后端分离的开发模式中,后端仅返回前端所需的数据,前端负责渲染HTML页面,后端不再控制前端的效果,用户看到什么样的效果,从后端请求的数据如何加载到前端中,都由前端自己决定,后端仅仅需要提供一套逻辑对外提供数据即可,并且前端与后端的耦合度相对较低,在这种模式中,我们通常将后端开发的每个视图都成为一个接口,或者API,前端通过访问接口来对数据进行增删改查。总结一句话,后台负责提供数据,前端负责数据展示,职责分离,分工明确。

对应的数据交互如下图:

mvc-02

前后端分离的优缺点?

为优质产品打造精益团队 术业有专攻,通过前后端分离,让前后端工程师只需要专注于前端或者后端的开发工作,有利于编写出高质量的代码,培养开发工程师独特的技术特性,然后构建出一个全栈式的精益开发团队。
提高工作效率,分工更加明确 前后端分离的工作流程可以使得前端专心前端,后端关心后端,两者开发同时进行,提高开发效率,页面的增加和路由的修改也不必再去麻烦后端,开发更加灵活。
降低服务器负载,系统性能提升 通过前端路由的配置,我们可以实现页面的按需加载,无需一开始加载首页便加载网站的所有资源,服务器也不再需要解析前端页面,在页面交互及用户体验上有所提升。
增强代码的可维护性 前后端分离后,应用的代码不再是前后端混合,只有在运行期才会调用依赖关系,并且分层明确,应用代码变得整洁清晰。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金石不渝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值