赞
踩
一、
PHP作为一门编程语言,其本身并不具备操作数据库的功能。因此,若想要在项目开发中完成PHP应用和MySQL数据库之间的交互,就需要借助PHP提供的数据库扩展。
学习目标:
熟悉PHP中的数据库扩展;
能够归纳MySQLi扩展和PDO扩展的区别
二、MySQLi扩展的使用
MySQLi扩展只支持MySQL数据库,如果不考虑其他数据库,该扩展是一个非常好的选择。
MySQLi扩展提供了大量的函数操作MySQL,使得在PHP中操作数据库变得轻松便捷,本节将对MySQLi扩展的使用进行详细讲解。
1.开启MySQLi的扩展
打开配置文件php.ini,找到如下一行
;extension=mysqli
删除";",重新启动Apache。
2.MySQLi常用函数
MySQLi扩展还提供了很多简化开发的其他常用操作函数。
2.1 连接数据库
掌握连接数据库操作,能够运用mysqli_connect()函数完成数据库的连接。
PHP访问MySQL数据库之前,需要先连接数据库。
mysqli_connect()函数共有6个可选参数,当省略参数时,将自动使用php.ini中配置的默认值。参数$socket表示mysql.sock文件路径(用于Linux环境),通常不需要手动设置。
若数据库连接成功,则返回数据库连接的对象。
若数据库连接失败,则返回false并提示Warning级别的错误信息。
任务1:连接数据库itcast
资源:
代码:
<?php
$link = mysqli_connect('localhost','root','123456','itcast','3306');
//查看数据库是否连接成功
echo $link?'连接数据库成功':'连接数据库失败';
2.2 执行sql语句
数据库连接成功后,就可以执行SQL语句进行数据操作。
掌握SQL语句的执行,能够运用mysqli_query()函数执行SQL语句。
当函数执行写操作时,成功返回true,失败返回false。
当函数执行读操作时,返回值是查询结果集,结果集模式可以是以下两种常量。
2.3 处理结果集
使用mysqli_query()函数执行读操作时,返回的是一个资源类型的结果集,需要对结果集作进一步处理,获取结果集中的数据。
MySQLi扩展提供了处理结果集函数。
三、预处理
在项目开发中,执行添加数据操作时,需要拼接SQL语句。这种方法不仅效率低,而且安全性差,一旦忘记转义外部数据中的特殊符号,就会导入SQL注入的问题。MySQLi提供了预处理方式,实现SQL语句与数据的分离,解决了SQL注入的问题,本节将介绍预处理的具体操作。
在了解什么时预处理前,先来了解传统的SQL语句处理方式。当PHP执行SQL语句时,传统的SQL语句处理方式是将SQL语句和要发送的数据拼接在一起,
每一条SQL语句都需要经过分析、编译和优化。
预处理方式则是先编译一次用户提交的SQL语句模板,再发送相关数据。
预处理的实现思路:
首先需要定义一个SQL语句模板。
然后为该模板进行参数绑定。
最后将用户提交的数据内容发送给MySQL执行。
使用预处理方式执行sql语句,运行效率高,无需考虑数据中包含特殊字符而导致的SQL注入问题。
扩展:SQL注入问题
某个网站的登录验证的SQL查询代码为:
1 |
|
恶意填入
1 |
|
与
1 |
|
时,将导致原本的SQL字符串被填为
1 |
|
也就是实际上运行的SQL命令会变成下面这样的
1 |
|
因此达到无账号密码,亦可登录网站。所以SQL注入攻击被俗称为黑客的填空游戏。
5.3.1 实现预处理的常用函数
5.3.2 参数绑定
下面通过代码演示;
数据库资源:
CREATE DATABASE IF NOT EXISTS `mydb`;
use mydb;
CREATE TABLE IF NOT EXISTS `student` (
`id` INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '学号',
`name` VARCHAR(32) NOT NULL COMMENT '姓名',
`gender` ENUM('男', '女') DEFAULT '男' NOT NULL COMMENT '性别'
) DEFAULT CHARSET=utf8;
INSERT INTO `student` (`name`, `gender`) VALUES
('Tom', '男'), ('Lucy', '女'), ('Jimmy', '男'), ('Amy', '女');
INSERT INTO `student` VALUES
(NULL, 'Elma', '女'), (NULL, 'Ruth', '女');
在上述实例代码中,预处理sql模板中有两个“?”占位符,分别表示name字段和id字段,name字段为字符串类型,id字段为整型。因此,该函数的第2个参数为“si"。当代码执行后,$name和$id就已经通过引用传参的方式进行了参数绑定。
3. 执行预处理语句
实例代码如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。