0

0

利用PHP实现mysql数据库连接的操作详解

巴扎黑

巴扎黑

发布时间:2017-08-10 15:43:53

|

2575人浏览过

|

来源于php中文网

原创

虽然PHP4都已经实现了部分面向对象的方法,但是也仅仅是一部分,使用率如此高的一门语言居然不是面向对象的,可能新上战场的Fresh Man会觉得简直不可思议,但事实确实如此,在PHP5以后才把最重要的MySQL操作OOP化,并且做了性能、安全等方面的优化,可以说PHP5的发布挽回了逐渐离去的粉丝,让写出伟大的PHP项目变得更加的容易。OOP过后越来越多的优秀的框架也随之诞生,为企业生产线提供了高效的设备。本篇我们就一起来看下PHP-MySQL的操作。

PHP为什么会如此风靡全球,至今都占着WEB网站的首把交椅?原因是多方面的,我个人觉得众多原因中必然有这2个原因:

  • 1、一个是PHP既支持面向过程又支持面向对象,说白了就是老少通吃,小朋友也可以用,成年人也可以玩,小朋友可以在PHP中玩着玩着就长大了。

  • 2、另外一个是PHP是一门脚本语言,即解析性语言,不需要编译就能直接在Apache等WEB服务器下运行,这也为VPS的爆发埋下了伏笔。

在开始之前我们先一起来看一下一个数据库操作的生命周期: > 连接数据库->CRUD->释放资源->关闭连接

这么一个逻辑其实放在哪里都是这样,只是每一个逻辑步骤中的处理抽象程度不一样而以。 好了,回了正题上来,我们先看小学生会如何编写php-mysql.

一、方式一:小学生

这种数据库操作的方式是最开始PHP与MySQL的搭配,但是这种方式一方面并不支持参数绑定,而且容易遭受到SQL注入攻击,比如为$sex赋值为一些恶意或者并不是我们想要的SQL语句,后果将很严重,将会直接操作到数据库。

说到数据库操作的安全问题,一般的操作:

1、过滤输入的前后空白字符
2、过滤控制字符
3、执行SQL

使用trim可以去除前后的空白字符,然后使用addslashes进行控制符转义,addslashes可以转义单双引号、反斜杠(\)和NULL字符。 其实PHP可以帮助我们自动转义控制符,可使用get_magic_quotes_gpc判断PHP是否自动帮我们转义了控制符。

上面这个是最原始的PHP操作MySQL的做法,确实跟C很像,纯粹是面向过程的。下面我们来看一下MySQL的进步。

二、方式二:初中生

PHP5中对MySQL操作也进行了优化升级,也就是mysqli函数库。 这一节我们还是按面向过程的方式(Procedural style)来看一下mysqli的操作。

到目前为止,好像mysqli和之前的mysql并没有什么区别,其实以上的操作mysqli都进行了大量的优化,但是给我们印象最深的可能还是Prepared语句。 Prepared语句的操作我们放在高中课程来讲,虽然Prepared也支持面向过程,但是操作流程都一样,只是调用方式不一样,所以后面一起讨论。

三、方式三:高中生

其中这一节的操作我们还是使用mysqli,不过,我们使用它面向对象的形式(Object oriented style).

select_db($dbName);$result = $link->query($sql);//行数$numResults = $result->num_rows;//$row = $result->fetch_assoc();//或者将结果取出到列表数组中,然后可以使用row[0],row[1]...的形式进行取值$row = $result->fetch_row();//或者可以将结果中的一行取回给一个对象$row = $result->fetch_object();$result->free();$link->close();?>

上面就是我们进行MySQL操作最常用的面向对象形式的。接下来我们来讨论下Prepared语句。Prepared语句的基本思想就是向MySQL发送一个查询模板,然后再单独发送对应的数据,所以模板可以是同一个,但是发送的数据可以是大量的,这样一来对于批量数据插入操作非常有用。我们来看一个例子:

prepare($query);$stmt->bind_param("sssi",$name,$email,$password,$sex);$stmt->execute();echo $stmt->affected_rows. 'user inserted into db';$stmt->close();?>

需要注意的地方是bind_param方法中第一个参数”sssd”代表后面每个字段的格式,i代表integer,d代表double,s代表string,b代表blog.

我们同样可以使用bind_result()像bind_param()那样绑定查询的结果:

prepare($query);if ($stmt) {$stmt->execute();$stmt->bind_result($id,$name,$email,$sex);while ($stmt->fetch()) {echo $id . ','.$name.','.$email.','$sex;}$stmt->close();}$link->close();?>

四、方式四:大学生

大学生意味着就成年了,也就是说看待问题就更加的宏观了,我们可以看到上面的这些mysql或者mysqli方法都是针对mysql的,如果我们更换了数据库,那这些都将无法使用,于是我们可以像数据库的操作更加的抽象化,将数据库的操作透明化,用户对数据库的操作不应该限定为某一个数据库。市面上有很多的数据抽象层,如PDO、ADODC、PHPLib、DBA、dbx、ODBC等等,我们这里选择PDO。PDO支持众多数据库,可以使用

PDO::getAvailableDrivers()查询系统中PDO支持的数据库。

prepare($sql);$sth->setFetchMode(PDO::FETCH_OBJ);while ($row = $sth->fetch()) {echo $row->id.','$row->name.','.$row->email;}$dbh = NULL;?>

OK,上面是一个最基本的PDO操作示例,我们一起来好好研究下PDO如何使用。

1、异常处理

PDO可以使用异常处理,所以所有的PDO操作我们都应该放在try,catch块中,PDO可以使用3种错误模式处理新建句柄时的错误。

setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_SILENT);$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);?>

根据参数名称,我们就可以想到几个模式的意思,静默、警告、抛异常。

getMessage();}?>

2、insert与update操作
我们看一下基本的操作流程:

Prepare -> Bind ->execute

prepare("insert into User(name) values('Grey')");$sth->execute();?>

prepare的占位符方式:

  • 无占位符:

prepare("insert into User(name,email,password,sex) values($name,$email,$password,$sex)");?>
  • 无名占位符:

prepare("insert into User(name,email,password,sex) values(?,?,?,?)");$sth->bindParam(1,$name);$sth->bindParam(2,$email);$sth->bindParam(3,$password);$sth->bindParam(4,$sex);//$name = 'Grey';$email = 'guohui.great@gmail.com';$password = '123456';$sex = 1;$sth->execute();//$name = 'Joseph';$email = 'joseph@gmail.com';$password = '654321';$sex = 0;$sth->execute();?>

每插入一条数据都要这样进行参数绑定,然后指定数据执行,效率确实有点低,数据也可以直接通过Array进行数据指定。

prepare("insert into User(name,email,password,sex) values(?,?,?,?)");$sth->execute($data);?>

$data数组的数据将按顺序依次填充占位符。

  • 命名占位符:

'Paul','email'=>'paul@gmail.com','password'=>'123456','sex'=>1);$sth = $link->prepare('insert into User(name,email,password,sex) value(:name,:email,:password,:sex)');$sth->execute($data);?>

3、查询数据

setFetchMode(PDO::FETCH_ASSOC);$sth->fetch();?>

我们看一下PHP文档中关于此处数据获取方式的说明:

缺省为 PDO::ATTR_DEFAULT_FETCH_MODE 的值 (默认为 PDO::FETCH_BOTH )。
PDO::FETCH_ASSOC:返回一个索引为结果集列名的数组
PDO::FETCH_BOTH(默认):返回一个索引为结果集列名和以0开始的列号的数组
PDO::FETCH_BOUND:返回 TRUE ,并分配结果集中的列值给 PDOStatement::bindColumn() 方法绑定的 PHP 变量。
PDO::FETCH_CLASS:返回一个请求类的新实例,映射结果集中的列名到类中对应的属性名。如果 fetch_style 包含 PDO::FETCH_CLASSTYPE(例如:PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE),则类名由第一列的值决定
PDO::FETCH_INTO:更新一个被请求类已存在的实例,映射结果集中的列到类中命名的属性
PDO::FETCH_LAZY:结合使用 PDO::FETCH_BOTH 和 PDO::FETCH_OBJ,创建供用来访问的对象变量名
PDO::FETCH_NUM:返回一个索引为以0开始的结果集列号的数组
PDO::FETCH_OBJ:返回一个属性名对应结果集列名的匿名对象

其中最常用的就是PDO::FETCH_ASSOC、PDO::FETCH_OBJ、PDO::FETCH_CLASS三种取值模式。

  • PDO::FETCH_ASSOC:
    这种模式的时候,fetch()调用的时候将会创建一个关联数组,然后可以通过列的名称索引数组。

query("select name,email,sex from User");$sth->setFetchMode(PDO::FETCH_ASSOC);while($row=$sth->fetch()){echo $row['name'].','.$row['email'].','.$row['sex'];}?>
  • PDO::FETCH_OBJ:
    这种模式,fetch()将为返回的每一行创建一个标准对象。

    黄城网络办公系统
    黄城网络办公系统

    具有功能全面实用、安全性稳定性高、易操作、管理维护简单的特点,采用独创的智能型技术,web服务器、数据库和应用程序全部自动傻瓜安装配置,用户可在一分钟内自行安装完毕,无需专业人员即可自行维护,B/S结构,适用于Intranet/Internet应用,客户端只需浏览器便可连接办公系统,无论出差旅行,还是居家办公,工作都能得心应手,实现无地域限制的全球办公,具有邮件管理、业务管理、网络硬盘、智能工作流

    下载

    立即学习PHP免费学习笔记(深入)”;

query("select name,email,sex from User");$sth->setFetchMode(PDO::FETCH_OBJ);while($row=$sth->fetch()){echo $row->name.','.$row->email.','.$row->sex;}?>
  • PDO::FETCH_CLASS: 
    这种模式将返回的结果直接填充到设定的类中,与类成员建立一一对应的关系。 使用这种模式时需要注意的是,我们都知道构造函数在对象创建时是第一个被调用的,但是这里略有不同,对象的成员在构造函数被调用前都已经被赋值了,

name .= $nameMark;}} $sth = $link->query('select name,email,sex from User');$sth->setFetchMode(PDO::FETCH_CLASS,'User');while($obj = $sth->fetch()){echo $obj->name;}?>

当需要构造函数在数据填充之前就被调用,可以设置fetch模式为:

setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE,'User');?>

咱们对比一下这两种模式的结果会发现前者的name会添加后缀,而后者并没有后缀。
到目前为止,我们还没有看到如何给构造函数传值,其实fetch可以在后面添加参数:

 $sth->setFetchMode(PDO::FETCH_CLASS,'User',array($nameMark));?>

需要注意的是fetch设置的是取值模式是针对其下一组值的。

在结束PDO这一节之前,我们再来看一些常见的操作方法:

$link->lastInsertId();将返回该连接插入的最后一条数据的自增ID值。

$link->exec($sql);用于执行那些无返回值或影响行数据的命令,

$link->quote($unsafe);过滤字符串引号,在不使用prepare预处理时使用。

$sth->rowCount();返回一个操作影响数据行的数量。

五、方式五:公司实战

以上的方法,都是学院派学习时的内容,但是在我们实际的生产环境中,我们面对一个大型项目,如此来操作数据库未免有太多冗余的操作,我们会把大量的时间浪费在数据库SQL语句编写中,而且代码中大量位置充斥着SQL,也并没有体现出面向对象的思想,是一个糟糕的零散的局面,这个时候我们就需要ORM,PHP的世界里有大量的ORM框架可以使用如:PHP ORM/持久层框架,

什么是ORM,在任何一种现代语言的任何一个全栈框架都必然会有一个ORM功能,即Object-Relational Mapping。说白了就是对数据库表建立一个与对象的映射关系。对对象成员的操作直接就可以与数据库进行同步。对用户来讲看到的就是对对象的成员的修改,实则ORM帮助用户完成了数据库层的操作。这里我就不详细展开讲了,大家根据自己的喜好来选择适合自己的ORM框架。

参考:
本文主要用于一个知识的归纳总结,本文内容仅是个人的理解,如有错误欢迎指正,文章撰写过程中可能会引用到其它地方的文字或代码,如有侵权请及时联系我,在此对写作过程中参考了的文章作者表示感谢!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

9

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

9

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

8

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

3

2026.01.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

20

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

17

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

19

2026.01.29

Java字符串处理使用教程合集
Java字符串处理使用教程合集

本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。

3

2026.01.29

Java空对象相关教程合集
Java空对象相关教程合集

本专题整合了Java空对象相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 812人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号