首页 后端开发 php教程 利用PHP实现mysql数据库连接的操作详解

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

Aug 10, 2017 pm 03:43 PM
mysql 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//连接$link = mysql_connect($dbHost, $dbUser, $dbPasswd);//选择数据库mysql_select_db($dbName);//数据库中的查询$result = mysql_query($sql);//从结果集中取值$row = mysql_fetch_array($result,MYSQL_ASSOC);//释放mysql_free_result($result);//关闭mysql_close($link);?>
登录后复制

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

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

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

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

<?phpif(!get_magic_quotes_gpc()){$param = addslashes($param);}?>
登录后复制

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

二、方式二:初中生

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

<?php$link = mysqli_connect($dbHost,$dbUser,$dbPasswd,$dbName);//如果上面没的指定数据库,这里还是可以选择//mysqli_select_db($link,$dbName);$result = mysqli_query($link,$sql);//行数$numResults = mysqli_num_rows($result);//$row = mysqli_fetch_assoc($result);//或者将结果取出到列表数组中,然后可以使用row[0],row[1]...的形式进行取值$row = mysqli_fetch_row($result);//或者可以将结果中的一行取回给一个对象$row = mysqli_fetch_object($result);mysqli_free_result($result);mysqli_close($result);?>
登录后复制

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

三、方式三:高中生

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

<?php$link = new mysqli($dbHost,$dbUser,$dbPasswd,$dbName);//如果上面没的指定数据库,这里还是可以选择//$link->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发送一个查询模板,然后再单独发送对应的数据,所以模板可以是同一个,但是发送的数据可以是大量的,这样一来对于批量数据插入操作非常有用。我们来看一个例子:

<?php$link = new mysqli($dbHost,$dbUser,$dbPasswd,$dbName);$query = "insert into User values(?,?,?,?)";$stmt = $link->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()那样绑定查询的结果:

<?php$link = new mysqli($dbHost,$dbUser,$dbPasswd,$dbName);$query = "select id,name,email,sex from User order by id limit 10";$stmt = $link->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支持的数据库。

<?php$dsn = "mysql:host=%dbHost;dbname=$dbName";$dbh = new PDO($dsn,$dbUser,$dbPassword);$sql = "select `id`,`name`,`teamId`,`email`,`sex` from User  where `sex`=?,`teamId`=?";$sth = $dbh->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种错误模式处理新建句柄时的错误。

<?php$dsn = "mysql:host=%dbHost;dbname=$dbName";$dbh = new PDO($dsn,$dbUser,$dbPassword);$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_SILENT);$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);?>
登录后复制

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

<?phptry{$dbh = new PDO(&#39;mysql:host=$host;dbname=$dbName&#39;,$user,$pass);$dbh = setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);//没有xx字段$dbh = prepare(&#39;select xx from User&#39;);}catch(PDOException $e){echo &#39;PDO Error:&#39;.$e->getMessage();}?>
登录后复制

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

Prepare -> Bind ->execute

<?php$sth = $link->prepare("insert into User(name) values('Grey')");$sth->execute();?>
登录后复制

prepare的占位符方式:

  • 无占位符:

<?php$sth = $link->prepare("insert into User(name,email,password,sex) values($name,$email,$password,$sex)");?>
登录后复制
  • 无名占位符:

<?phpsth = $link->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进行数据指定。

<?php$data = array(&#39;WeiFocus&#39;,&#39;weifocus@weifocus.com&#39;,&#39;111111&#39;,1);$sth = $link->prepare("insert into User(name,email,password,sex) values(?,?,?,?)");$sth->execute($data);?>
登录后复制

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

  • 命名占位符:

<?php$data = array(&#39;name&#39;=>'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、查询数据

<?php//设定数据获取方式$sth->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()调用的时候将会创建一个关联数组,然后可以通过列的名称索引数组。

<?php$sth = $link->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()将为返回的每一行创建一个标准对象。

<?php$sth = $link->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: 
    这种模式将返回的结果直接填充到设定的类中,与类成员建立一一对应的关系。 使用这种模式时需要注意的是,我们都知道构造函数在对象创建时是第一个被调用的,但是这里略有不同,对象的成员在构造函数被调用前都已经被赋值了,

<?phpclass User{public $name;public $email;public $sex;function __construct($nameMark = &#39;【WeiFocusIo】&#39;){$this->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模式为:

<?php$sth->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE,'User');?>
登录后复制

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

<?php> $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实现mysql数据库连接的操作详解的详细内容。更多信息请关注PHP中文网其他相关文章!

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

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

PHP的未来:改编和创新 PHP的未来:改编和创新 Apr 11, 2025 am 12:01 AM

PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。

phpmyadmin怎么打开 phpmyadmin怎么打开 Apr 10, 2025 pm 10:51 PM

可以通过以下步骤打开 phpMyAdmin:1. 登录网站控制面板;2. 找到并点击 phpMyAdmin 图标;3. 输入 MySQL 凭据;4. 点击 "登录"。

PHP与Python:了解差异 PHP与Python:了解差异 Apr 11, 2025 am 12:15 AM

PHP和Python各有优势,选择应基于项目需求。1.PHP适合web开发,语法简单,执行效率高。2.Python适用于数据科学和机器学习,语法简洁,库丰富。

MySQL:世界上最受欢迎的数据库的简介 MySQL:世界上最受欢迎的数据库的简介 Apr 12, 2025 am 12:18 AM

MySQL是一种开源的关系型数据库管理系统,主要用于快速、可靠地存储和检索数据。其工作原理包括客户端请求、查询解析、执行查询和返回结果。使用示例包括创建表、插入和查询数据,以及高级功能如JOIN操作。常见错误涉及SQL语法、数据类型和权限问题,优化建议包括使用索引、优化查询和分表分区。

为什么要使用mysql?利益和优势 为什么要使用mysql?利益和优势 Apr 12, 2025 am 12:17 AM

选择MySQL的原因是其性能、可靠性、易用性和社区支持。1.MySQL提供高效的数据存储和检索功能,支持多种数据类型和高级查询操作。2.采用客户端-服务器架构和多种存储引擎,支持事务和查询优化。3.易于使用,支持多种操作系统和编程语言。4.拥有强大的社区支持,提供丰富的资源和解决方案。

redis怎么使用单线程 redis怎么使用单线程 Apr 10, 2025 pm 07:12 PM

Redis 使用单线程架构,以提供高性能、简单性和一致性。它利用 I/O 多路复用、事件循环、非阻塞 I/O 和共享内存来提高并发性,但同时存在并发性受限、单点故障和不适合写密集型工作负载的局限性。

PHP的当前状态:查看网络开发趋势 PHP的当前状态:查看网络开发趋势 Apr 13, 2025 am 12:20 AM

PHP在现代Web开发中仍然重要,尤其在内容管理和电子商务平台。1)PHP拥有丰富的生态系统和强大框架支持,如Laravel和Symfony。2)性能优化可通过OPcache和Nginx实现。3)PHP8.0引入JIT编译器,提升性能。4)云原生应用通过Docker和Kubernetes部署,提高灵活性和可扩展性。

php:死亡还是简单地适应? php:死亡还是简单地适应? Apr 11, 2025 am 12:13 AM

PHP不是在消亡,而是在不断适应和进化。1)PHP从1994年起经历多次版本迭代,适应新技术趋势。2)目前广泛应用于电子商务、内容管理系统等领域。3)PHP8引入JIT编译器等功能,提升性能和现代化。4)使用OPcache和遵循PSR-12标准可优化性能和代码质量。

See all articles