PHP操作数据库

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

strSQL = "SELECT * FROM users WHERE (name = '" + userName + "') and (pw = '"passWord +"');" 

恶意填入

1

userName = "1' OR '1'='1";

1

passWord "1' OR '1'='1";

时,将导致原本的SQL字符串被填为

1

strSQL = "SELECT * FROM users WHERE (name = '1' OR '1'='1') and (pw = '1' OR '1'='1');"

也就是实际上运行的SQL命令会变成下面这样的

1

strSQL = "SELECT * FROM users;"

因此达到无账号密码,亦可登录网站。所以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. 执行预处理语句

实例代码如下:

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值