PHP 操作数据库及 MVC 框架简介
1、PHP 相关环境配置
修改配置文件: php.ini文件中: ;extension=mysqli”,将分号去掉
php无法直接连接数据,需要扩展: mysqli、PDO
2、PHP 连接数据库
实例 (MySQLi - 面向对象)
实例 (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 参数获取数据:
使用 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
前后端分离的优缺点?
为优质产品打造精益团队 术业有专攻,通过前后端分离,让前后端工程师只需要专注于前端或者后端的开发工作,有利于编写出高质量的代码,培养开发工程师独特的技术特性,然后构建出一个全栈式的精益开发团队。
提高工作效率,分工更加明确 前后端分离的工作流程可以使得前端专心前端,后端关心后端,两者开发同时进行,提高开发效率,页面的增加和路由的修改也不必再去麻烦后端,开发更加灵活。
降低服务器负载,系统性能提升 通过前端路由的配置,我们可以实现页面的按需加载,无需一开始加载首页便加载网站的所有资源,服务器也不再需要解析前端页面,在页面交互及用户体验上有所提升。
增强代码的可维护性 前后端分离后,应用的代码不再是前后端混合,只有在运行期才会调用依赖关系,并且分层明确,应用代码变得整洁清晰。