热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP连接和操作MySQL数据库基础教程_php实例

这篇文章主要介绍了PHP连接和操作MySQL数据库基础教程,本文讲解了mysql扩展、连接数据库、与数据库交互等内容,需要的朋友可以参考下
从这里开始

我的博客,后台数据库是什么?没错,就是MySQL,服务器端使用的脚本就是PHP,整个框架使用的是WordPress。PHP和MySQL就像夫妻一样,总是在一起干活。现在这里,就集合PHP,总结一下MySQL的实际使用,也算作是MySQL开发的入门。关于PHP与MySQL的合作,不外乎以下三种方法:

1.mysql扩展;但是目前已经不推荐使用;

2.mysqli扩展;同时提供面向对象风格和面向过程的风格;要求MySQL版本是4.1及以上的;

3.PDO扩展为PHP访问数据库定义了一种轻量级的一致接口;PDO_MYSQL是对其的具体实现。这里暂时只关心开发。由于mysql扩展已经不推荐使用了,我也会与时俱进,不做总结;而mysqli和PDO方式用的比较多,所以这篇将会总结如何使用mysqli扩展来连接数据库服务器,如何查询和获取数据,以及如何执行其它重要任务。下一篇博文将会总结PDO的相关内容。

使用mysqli扩展

先看以下测试数据库db_test中的测试数据:

代码如下:


mysql> select * from tb_test;
+----+-----------+----------+------------+------------+
| id | firstname | lastname | email | phone |
+----+-----------+----------+------------+------------+
| 1 | Young | Jelly | 123@qq.com | 1384532120 |
| 3 | Fang | Jone | 456@qq.com | 1385138913 |
| 4 | Yuan | Su | 789@qq.com | 1385138913 |
+----+-----------+----------+------------+------------+
3 rows in set (0.00 sec)

1.建立和断开连接

与MySQL数据库交互时,首先要建立连接,最后要断开连接;这包括与服务器连接并选择一个数据库,以及最后关闭连接,释放资源。选择使用面向对象接口与MySQL服务器交互,首先需要通过其构造函数实例化mysqli类。

代码如下:


<&#63;php
// 实例化mysqli类
$mysqliCOnn= new mysqli();
// 连接服务器,并选择一个数据库
$mysqliConn->connect('127.0.0.1', 'root', 'root', 'db_test');
printf("MySQL error number:%d", $mysqliConn->errno);
// 或者
// $mysqliConn->connect("http://127.0.0.1", 'root', 'root');
// $mysqliConn->select_db('db_test');

// 与数据库交互

// 关闭连接
$mysqliConn->close();
&#63;>

一旦成功的选择了数据库,然后就可以对这个数据库执行数据库查询了。一旦脚本执行完毕,所有打开的数据库连接都会自动关闭,并释放资源。不过,有可能一个页面在执行期间需要多个数据库连接,各个连接都应当适当的加以关闭。即使只使用一个连接,也应该在脚本的最后将其关闭,这是一种很好的实践方法。在任何情况下,都由close()负责关闭连接。

2.处理连接错误

当然,如果无法连接MySQL数据库,那么不大可能在这个页面继续完成预期的工作了。因此,一定要注意监视连接错误并相应地做出反应。mysqli扩展包包含很多可以用来捕获错误消息的特性,另外也可以使用异常来做到这一点。例如,可以使用mysqli_connect_errno()和mysqli_connect_error()方法诊断并显示一个MySQL连接错误的有关信息。

关于mysqli的具体信息可以在这里查看:http://php.net/manual/zh/book.mysqli.php

与数据库交互

绝大多数查询都与创建、获取、更新和删除任务有关,这些任务统称为CRUD。这里就开始总结CRUD相关的内容。

1.向数据库发送查询

方法query()负责将query发送给数据库。它的定义如下:

代码如下:


mixed mysqli::query ( string $query [, int $resultmode = MYSQLI_STORE_RESULT ] )

可选参数resultmode可以用于修改这个方法的行为,它接受两个可取值。这篇文章总结了二者之间的区别。http://www.jb51.net/article/55792.htm;下面是一个简单的使用例子:

代码如下:


<&#63;php
// 实例化mysqli类
$mysqliCOnn= new mysqli();

// 连接服务器,并选择一个数据库
// 错误的密码
$mysqliConn->connect('127.0.0.1', 'root', 'root', 'db_test');
if ($mysqliConn->connect_error)
{
printf("Unable to connect to the database:%s", $mysqliConn->connect_error);
exit();
}

// 与数据库交互
$query = 'select firstname, lastname, email from tb_test;';

// 发送查询给MySQL
$result = $mysqliConn->query($query);

// 迭代处理结果集
while (list($firstname, $lastname, $email) = $result->fetch_row())
{
printf("%s %s's email:%s
", $firstname, $lastname, $email);
}

// 关闭连接
$mysqliConn->close();
&#63;>

2.插入、更新和删除数据

插入、更新和删除使用的是insert、update和delete查询完成的,其做法实际上与select查询相同。示例代码如下:

代码如下:


<&#63;php
// 实例化mysqli类
$mysqliCOnn= new mysqli();

// 连接服务器,并选择一个数据库
// 错误的密码
$mysqliConn->connect('127.0.0.1', 'root', 'root', 'db_test');
if ($mysqliConn->connect_error)
{
printf("Unable to connect to the database:%s", $mysqliConn->connect_error);
exit();
}

// 与数据库交互
$query = 'select firstname, lastname, email from tb_test;';
// 发送查询给MySQL
$result = $mysqliConn->query($query);

// 迭代处理结果集
while (list($firstname, $lastname, $email) = $result->fetch_row())
{
printf("%s %s's email:%s
", $firstname, $lastname, $email);
}

$query = "delete from tb_test where firstname = 'Yuan';";
$result = $mysqliConn->query($query);

// 告诉用户影响了多少行
printf("%d row(s) have been deleted.
", $mysqliConn->affected_rows);
// 重新查询结果集
$query = 'select firstname, lastname, email from tb_test;';

// 发送查询给MySQL
$result = $mysqliConn->query($query);

// 迭代处理结果集
while (list($firstname, $lastname, $email) = $result->fetch_row())
{
printf("%s %s's email:%s
", $firstname, $lastname, $email);
}
// 关闭连接
$mysqliConn->close();
&#63;>

3.释放查询内存

有时可能会获取一个特别庞大的结果集,此时一旦完成处理,很有必要释放该结果集所请求的内存。free()方法可以为我们完成这个任务。例如:

代码如下:


// 与数据库交互
$query = 'select firstname, lastname, email from tb_test;';

// 发送查询给MySQL
$result = $mysqliConn->query($query);

// 迭代处理结果集
while (list($firstname, $lastname, $email) = $result->fetch_row())
{
printf("%s %s's email:%s
", $firstname, $lastname, $email);
}
$result->free();

4.解析查询结果

一旦执行了查询并准备好结果集,下面就可以解析获取到的结果行了。你可以使用多个方法来获取各行中的字段,具体选择哪一个方法主要取决于个人喜好,因为只是引用字段的方法有所不同。

(1)将结果放到对象中

使用fetch_object()方法来完成。fetch_object()方法通常在一个循环中调用,每次调用都使得返回结果集中的下一行被填入一个对象,然后可以按照PHP典型的对象访问语法来访问这个对象。例如:

代码如下:


// 与数据库交互
$query = 'select firstname, lastname, email from tb_test;';

// 发送查询给MySQL
$result = $mysqliConn->query($query);

// 迭代处理结果集
while ($row = $result->fetch_object())
{
$firstname = $row->firstname;
$lastname = $row->lastname;
$email = $row->email;
}
$result->free();

(2)使用索引数组和关联数组获取结果

mysqli扩展包还允许通过fetch_array()方法和fetch_row()方法分别使用关联数组和索引数组来管理结果集。fetch_array()方法实际上能够将结果集的各行获取为一个关联数组、一个数字索引数组,或者同时包括二者,可以说,fetch_row()是fetch_array的一个子集。默认地,fetch_array()会同时获取关联数组和索引数组,可以在fetch_array中传入参数来修改这个默认行为。

MYSQLI_ASSOC,将行作为一个关联数组返回,键由字段名表示,值由字段内容表示;
MYSQLI_NUM,将行作为一个数字索引数组返回,其元素顺序由查询中指定的字段名顺序决定;
MYSQLI_BOTH,就是默认的选项。

确定所选择的行和受影响的行

通常希望能够确定select查询返回的行数,或者受insert、update或delete影响的行数。

(1)确定返回的行数

如果希望了解select查询语句返回了多少行,num_rows属性很有用。例如:

代码如下:


// 与数据库交互
$query = 'select firstname, lastname, email from tb_test;';

// 发送查询给MySQL
$result = $mysqliConn->query($query);

// 获取行数
$result->num_rows;

记住,num_rows只在确定select查询所获取的行数时有用,如果要获得受insert、update或delete影响的行数,就要使用下面总结的affected_rows属性。

(2)确定受影响的行数

affected_rows属性用来获取受insert、update或delete影响的行数。代码示例见上面的代码。

执行数据库事务

有3个新方法增强了PHP执行MySQL事务的功能,分别为:

1.autocommit函数,启用自动提交模式;

autocommit()函数控制MySQL自动提交模式的行为,由传入的参数决定启动还是禁用自动提交;传入TRUE,则启动自动提交,传入false则禁用自动提交。无论启用还是禁用,成功时都将返回TRUE,失败时返回FALSE。

2.commit函数,提交事务;将当前事务提交给数据库,成功时返回TRUE,否则返回FALSE。

3.rollback函数,回滚当前事务,成功时返回TRUE,否则返回FALSE。

关于事务,我后面还要继续总结,这里就简要的总结了一下这三个API。

不会结束

这只是MySQL学习的开始,不会结束。再接再励。

推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
author-avatar
赵以书的话_256
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有