PHP与MySQL的连接
一.PHP数据库的扩展分类。
1.MySQL 扩展是针对 MySQL 4.1.3 或更早版本设计的,是 PHP 与 MySQL数据库交互的早期扩展。由于其不支持 MySQL 数据库服务器的新特性,且安全性差,在项目开发中不建议使用,可用 MySQLi 扩展代替。
2.MySQLi 扩展是 MySQL 扩展的增强版,它不仅包含了所有 MySQL 扩展的功能函数,还可以使用 MySQL 新版本中的高级特性。例如,多语句执行和事务的支持,预处理方式完全解决了 SQL 注入问题等。MySQLi 扩展只支持MySQL 数据库,如果不考虑其他数据库,该扩展是一个非常好的选择。
3.PDO 是 PHP Data Objects(数据对象)的简称,它提供了一个统一的 API接口,只要修改其中的 DSN (数据源),就可以实现PHP应用与不同类型数据库服务器之间的交互。
需要注意的是,PHP 中的数据库扩展在使用之前需要开启。打开 PHP 的配置文件 php.ini,去掉前面的注释符号(;)
extension=php_mysql.dll
extension=php_mysqli.dll
Extension_dir=‘ext的文件路径’;
extension=php_pdo_mysql.dll
保存 php.ini 文件后,重新启动 Apache 服务器,通过 phpinfo() 函数即可查看扩展是否开启。以 MySQLi 扩展为例,具体如图所示。
4.验证mysqli扩展是否开启。
a.验证mysqli扩展是否开启
phpinfo();
b.检测扩展是否加载
var_dump(extension_loaded('mysqli')); var_dump(extension_loaded('curl'));
c.检测函数是否存在
var_dump(function_exists('mysqli_connect'));
d.得到当前已经开启的扩展
print_r(get_loaded_extensions());
二.连接数据库。
1.通过MySQL类库操作数据库的步骤
建立到MySQL的连接-打开指定的数据库-设置默认客户端的字符集-执行SQL查询-释放字符集-关闭连接
2.连接数据库,并通过$mysqli保存连接
$mysqli = new mysqli('localhost', 'root', '123456', 'itcast');
a.连接数据库,并屏蔽错误信息
$mysqli = @new mysqli('localhost', 'root', ‘1’,’test’);
b.设置字符集 $mysqli->set_charset('utf8') 成功返回frue,失败返回false 需要注意的是,只有保持 PHP 脚本文件、Web 服务器 返回的编码、网页的 <meta> 标记、PHP 访问 MySQL 使用的字符集都统一时,才能避免中文出现乱码问题。
三.执行SQL语句。
在完成数据库的连接后,就可以通过 SQL 语句操作数据库了。在 MySQLi扩展中,通常使用 mysqli_query() 函数发送 SQL 语句,获取执行结果。函数的声明方式如下:
mixed mysqli_query (
mysqli $link, //数据库连接
string $query, //SQL语句
int$resultmode = MYSQLI_STORE_RESULT //结果集模式
)
$link表示通过 mysqli_connect() 函数获取的数据库连接,$query 表示 SQL 语句。当函数执行 SELECT、SHOW、DESCRIBE 或EXPLAIN 查询时,返回值是查询结果集,而对于其他查询,成功返回 true,失败返回 false。在 mysqli_query() 函数中,可选参数 $resultmode 表示结果集模式,其值可以是 MYSQLI_USE_RESULT 或 MYSQLI_STORE_RESULT 两种常量。MYSQLI_STORE_RESULT 模式会将结果集全部读取到 PHP 端,而MYSQLI_USE_RESULT 模式仅初始化结果集检索,在处理结果集时进行数据读取。
四.处理结果集。
1.当通过 mysqli_query() 函数执行 SQL 语句后,返回的结果集并不能直接使用,需要使用函数从结果集中获取信息,保存为数组。MySQLi 扩展中常用的处理结果集的函数如表所示。
基本步骤 |
MySQL扩展 |
MySQLi扩展 |
---|---|---|
连接和选择数据库 |
mysql_connect() |
mysqli_connect() |
执行SQL语句 |
mysql_query() |
mysqli_query() |
处理结果集 |
mysql_fetch_array() |
mysqli_fetch_array() |
释放结果集 |
mysql_free_result() |
mysqli_free_result() |
关闭连接 |
mysql_close() |
mysqli_close() |
2.在表列举函数中,mysqli_fetch_all() 和 mysqli_fetch_array() 的返回值支持关联数组和索引数组两种形式,函数第 1 个参数表示结果集,第 2 个参数是可选参数,表示返回的数组形式,其值有 MYSQLI_ASSOC、MYSQLI_NUM、MYSQLI_BOTH 三种常量,分别表示关联数组、索引数组,或两者皆有,默认值为 MYSQLI_BOTH。
3.当需要一次查询出所有的记录时,可以通过 mysqli_fetch_all() 函数来实现
$data = mysqli_fetch_all($result, MYSQLI_ASSOC);
再通过var_dump($data);打印出来。
五.预处理语句。
1.什么是预处理。
MySQLi 扩展中有一种预处理语句的机制,其原理是预先编译 SQL 语句的模板,当执行时只传输有变化的数据。下图演示了预处理语句和传统方式的区别。
图中可以看出,当 PHP 需要执行 SQL 时,传统方式是将发送的数据和 SQL 写在一起,这种方式每条 SQL 都需要经过分析、编译和优化的周期;而预处理语句只需要编译一次用户提交的 SQL 模板,在操作时,发送相关数据即可完成更新操作,这极大地提高了运行效率,而且无需考虑数据中包含特殊字符(如单引号)导致的语法问题。
2.预处理相关函数。
a. mysqi_prepare()函数用于预处理一个待执行的 SQL 语句,函数声明如下:mysqli_stmt mysqli_prepare ( mysqli $link , string $query )参数 $link 表示数据库连接,$query 表示 SQL 语句模板。当函数执行后,成功返回预处理对象,失败返回 false。
b. 在编写SQL语句模板时,其语法是将数据部分使用“?”占位符代替。示例代码如下:
# SQL正常语法 UPDATE `user` SET `name`='aa' WHERE `id`=1
# SQL模板语法 UPDATE `user` SET `name`=? WHERE `id`=?
从以上示例可以看出,将 SQL 语句修改为模板语法时,对于字符串内容,“?”占位符的两边无需使用单引号包裹。
c. mysqli_stmt_bind_param() 函数用于将变量作为参数绑定到预处理语句中。函数的声明如下:
bool mysqli_stmt_bind_param (mysqli_stmt $stmt, //预处理对象string $types, //数据类型mixed &$var1, //绑定变量1(引用传参)[, mixed&$... ] //绑定变量n...(可选参数,可绑定多个,引用传参)
)
在上述代码中,参数 $stmt 表示由 mysqli_prepare() 返回的预处理对象;$types 用于指定被绑定变量的数据类型,它是由一个或多个字符组成的字符串;后面的 $var(可以是多个参数)表示需要绑定的变量,且其个数必须与 $types 字符串的长度一致。该函数执行成功时返回 true,失败时返回 false。
d. 参数绑定时的数据类型字符:
字符 |
描述 |
i |
描述变量的数据类型为MySQL中的integer类型 |
d |
描述变量的数据类型为MySQL中的double类型 |
s |
描述变量的数据类型为MySQL中的string类型 |
b |
描述变量的数据类型为MySQL中的blob类型 |
e.
//连接数据库、预处理SQL模板
$link = mysqli_connect('localhost', 'root', '123456', 'itcast');
$stmt = mysqli_prepare($link, 'UPDATE `user` SET `name`=? WHERE `id`=?');
//参数绑定(将变量$name、$id按顺序绑定到SQL语句“?”占位符上)
mysqli_stmt_bind_param($stmt, 'si', $name, $id);
在上述代码中,SQL语句中有两个“?”占位符,分别表示 name 字段和id 字段,name 字段是字符串类型,id 字段是整型,因此mysqli_stmt_bind_param() 的第二个参数为“si”。当代码执行后,变量$name 和 $id 就已经通过引用传参的方式进行了参数绑定。
f.在完成参数绑定后,接下来应该将数据内容发送给 MySQL 执行。mysqli_stmt_execute() 函数用于执行预处理,其声明如下。
bool mysqli_stmt_execute ( mysqli_stmt $stmt )
在上述声明中,$stmt 参数表示由 mysqli_prepare() 函数返回的预处理对象。当函数执行成功后,返回 true,执行失败返回 false。
//连接数据库、预处理SQL模板
$link = mysqli_connect('localhost', 'root', '123456', 'itcast');
$stmt = mysqli_prepare($link, 'UPDATE `user` SET `name`=? WHERE `id`=?');
//参数绑定,并为已经绑定的变量赋值
mysqli_stmt_bind_param($stmt, 'si', $name, $id);
$name = 'aa';
$id = 1;
g.接下来通过代码演示 mysqli_stmt_execute() 函数的使用,具体如下。
//执行预处理(第一次执行)
mysqli_stmt_execute($stmt);
//为第二次执行重新赋值
$name = 'bb';
$id = 2;
//执行预处理(第二次执行)
mysqli_stmt_execute($stmt);
通过上述代码可以看出,MySQLi 扩展提供的预处理方式,实现了数据与SQL 的分离。这种方式不仅提高了执行效率,也解决了直接用字符串拼接SQL 语句带来的安全问题。
六.其他操作。
1.MySQLi 扩展还提供了许多丰富的函数方便在开发中使用。下表列举了MySQLi 扩展的其他常用函数,也可以参考 PHP 手册了解更多内容。
函数 |
描述 |
mysqli_insert_id() |
获取上一次插入操作时产生的ID号 |
mysqli_affected_rows() |
获取上一次操作时受影响的行数 |
mysqli_real_escape_string() |
用于转义SQL语句字符串中的特殊字符 |
函数 |
描述 |
mysqli_free_result() |
释放结果集 |
mysqli_close() |
关闭先前打开的数据库连接 |
mysqli_error() |
返回最近函数调用的错误代码 |
2.mysqli_free_result() 和 mysqli_close() 函数用于释放资源、关闭连接,由于 PHP 访问 MySQL 使用了非持久连接,因此当 PHP 脚本执行结束时会自动释放。
3.示例。
1 //连接数据库、设置字符集2 $link = mysqli_connect('localhost', 'root', '123456', 'itcast');3 mysqli_set_charset($link, 'utf8');4 // ① 执行查询操作、处理结果集5 if(!$result = mysqli_query($link, 'SELECT * FROM `user`')){6 exit('执行失败。错误信息:'.mysqli_error($link)); //获取错误信息7 }8 $data = mysqli_fetch_all($result, MYSQLI_ASSOC);9 // ② 用完后,释放结果集
10 mysqli_free_result($result);
11 // ③ 执行插入操作,拼接SQL语句
12 //转义特殊符号$name = mysqli_real_escape_string($link, "单引号'测试'文本");
13 if(!mysqli_query($link, "INSERT INTO `user` (`name`) VALUES ('".$name."')")){
14 exit('执行失败。错误信息:'.mysqli_error($link));
15 }
16 // ④ 获取最后插入的ID
17 $id = mysqli_insert_id($link); //获取AUTO_INCREMENT字段的自增值
18 // ⑤ 执行修改操作
19 if(!mysqli_query($link, "UPDATE `user` SET `name`='aa' WHERE `id`>2")){
20 exit('执行失败。错误信息:'.mysqli_error($link));
21 }
22 // ⑥ 获取受影响的行数
23 $num = mysqli_affected_rows($link); //可获取UPDATE、//DELETE等操作影响的行数
24 // ⑦ 关闭连接
25 mysqli_close($link);
在上述代码中,第 4~10 行演示了 mysqli_error()、mysqli_free_result()函数的使用,第 12 行演示了 mysqli_real_escape_string() 函数的使用,第17~25行演示了 mysqli_insert_id()、mysqli_affected_rows()、mysqli_close()函数的使用。其中第 8 行 $data 保存了查询出的数据,因此在第 10 行释放了$result 结果集。第 25 行关闭 $link 连接后,$link 将不能继续使用。
以上就是今天的全部内容了,请大家多学益寿,靠着自己独特的思维去打造一个属于自己的代码世界,如果有不懂的地方可以在下方评论或者是私信我随时为您解惑。
PHP与MySQL的连接相关推荐
- mysql内连接运算量会增加多少_新年手打,40道经典MYSQL面试干货,速来收藏
MySQL 面试题 1.MySQL 中有哪几种锁? 1.表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最 高,并发度最低. 2.行级锁:开销大,加锁慢:会出现死锁:锁定粒度最小,发 ...
- 架构周报| 浅析MySQL JDBC连接配置上的两个误区
经典案例 \\ 浅析MySQL JDBC连接配置上的两个误区:相信使用MySQL的同学都配置过它的JDBC驱动,多数人会直接从哪里贴一段URL过来,然后稍作修改就上去了,对应的连接池配置也是一样的,很 ...
- mysql内连接和外连接的区别_Swoole4创建Mysql连接池
一 .什么是mysql连接池 场景:每秒同时有1000个并发,但是这个mysql同时只能处理400个连接,mysql会宕机. 解决方案:连接池,这个连接池建立了200个和mysql的连接,这1000个 ...
- centos mysql拒绝连接失败_CentOS下mysql远程连接的失败的解决方法
mysql远程连接失败的解决方法(CentOS版) (1)先将mysql服务停掉 # /etc/init.d/mysqld stop (2)查看mysql配置文件 # vi /etc/my.cnf 特 ...
- 轻量应用服务器MySQL远程连接踩坑
不算是给阿里云打广告吧,因为被阿里云的"云服务器ECS" 和 "轻量应用服务器"搞的很蛋疼.很多年前,阿里云的学生机"云翼计划"默认就只有& ...
- mysql 远程连接速度慢的解决方案
mysql 远程连接速度慢的解决方案 参考文章: (1)mysql 远程连接速度慢的解决方案 (2)https://www.cnblogs.com/myzhijie/archive/2012/12/1 ...
- mysql远程连接设置_MySQL远程连接设置
这只是一个简单MySQL设定.但很多图简单,却忽略了安全性.所以对设置中的细节和含义需要弄到清清楚楚才行. 这只是一个简单MySQL设定.但很多图简单,,却忽略了安全性.所以对设置中的细节和含义需要弄 ...
- mysql报196271错误_超过mysql最大连接的异常
超过mysql最大连接的错误 出现错误: com.mysql.jdbc.CommunicationsException: The driver was unable to create a conne ...
- apache php mysql是长连接吗_php关于mysql长连接问题
1.当 函数 mysql_connect 的前三个参数(server username password)相同,并且第四个参数(new_link)不传递时候,重复调用mysql_connect 是会返 ...
- php+sqlrelay+mysql实现连接池及读写负载均衡
本文主要介绍sqlrelay的配置安装.通过其性能和一些具体环境的测试来帮助开发者应用在相应的场合中去应付大并发的mysql数据库连接. 什么是sqlrelay? Sqlrelay是一个开源的数据库连 ...
最新文章
- Git 进阶之底层相关
- ECMASCript 2019可能会有哪些特性?
- 过年装X神器,快速获取 wifi 密码!
- Tensorflow Object detection API 在 Windows10 配置
- Apache和Nginx下禁止访问特定的目录或文件
- mysql修改字段结构_MySQL修改表结构及其添加删除修改字段功能
- Unity编辑器扩展工具Shader Forge和Behavior Designer(行为树)和 Cinema Director
- centos下安装CH341驱动
- html横线标记_html中横线怎么写代码
- sql insert
- 扎克伯格引领的硅谷“裸捐”风
- python event对象
- 6.3 Git 工具 - 交互式暂存
- StatsD与Graphite联合作战
- Model 3 FBCM
- table属于html标记吗,table标签是什么意思
- 百度ToB垂类账号权限平台的设计与实践
- 想成为职场达人就必须要读懂的职场生存法则
- java literals_Java8 中文教程
- C# TCP通讯客户端源码