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


Posted in PHP onSeptember 29, 2014

从这里开始

我的博客,后台数据库是什么?没错,就是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类。

<?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();

?>

一旦成功的选择了数据库,然后就可以对这个数据库执行数据库查询了。一旦脚本执行完毕,所有打开的数据库连接都会自动关闭,并释放资源。不过,有可能一个页面在执行期间需要多个数据库连接,各个连接都应当适当的加以关闭。即使只使用一个连接,也应该在脚本的最后将其关闭,这是一种很好的实践方法。在任何情况下,都由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可以用于修改这个方法的行为,它接受两个可取值。这篇文章总结了二者之间的区别。https://3water.com/article/55792.htm;下面是一个简单的使用例子:

<?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<br/>", $firstname, $lastname, $email);

    }

    

    // 关闭连接

    $mysqliConn->close();

?>

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

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

<?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<br/>", $firstname, $lastname, $email);

    }

    

    $query = "delete from tb_test where firstname = 'Yuan';";

    $result = $mysqliConn->query($query);

 

    // 告诉用户影响了多少行

    printf("%d row(s) have been deleted.<br/>", $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<br/>", $firstname, $lastname, $email);

    }

    // 关闭连接

    $mysqliConn->close();

?>

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<br/>", $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学习的开始,不会结束。再接再励。

PHP 相关文章推荐
隐藏你的.php文件的实现方法
Mar 19 PHP
dede全站URL静态化改造[070414更正]
Apr 17 PHP
Php获取金书网的书名的实现代码
Jun 11 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
Jun 09 PHP
ThinkPHP框架任意代码执行漏洞的利用及其修复方法
Jul 04 PHP
phpword插件导出word文件时中文乱码问题处理方案
Aug 19 PHP
php实现删除指定目录下相关文件的方法
Oct 20 PHP
Thinkphp中的curd应用实用要点
Jan 04 PHP
浅谈php的优缺点
Jul 14 PHP
PHP7导出Excel报ERR_EMPTY_RESPONSE解决方法
Apr 16 PHP
Yii框架参数配置文件params用法实例分析
Sep 11 PHP
PHP 扩展Memcached命令用法实例总结
Jun 04 PHP
PHP的mysqli_query参数MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT的区别
Sep 29 #PHP
PHP fastcgi模式上传大文件(大约有300多K)报错
Sep 28 #PHP
php中json_encode UTF-8中文乱码的更好解决方法
Sep 28 #PHP
初识PHP
Sep 28 #PHP
浅谈php和.net的区别
Sep 28 #PHP
PHP常用技术文之文件操作和目录操作总结
Sep 27 #PHP
Drupal简体中文语言包安装教程
Sep 27 #PHP
You might like
php表单转换textarea换行符的方法
2010/09/10 PHP
php实现监听事件
2013/11/06 PHP
php解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题
2014/06/19 PHP
php分享朋友圈的实现代码
2019/02/18 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
jQuery 追加元素的方法如append、prepend、before
2014/01/16 Javascript
JavaScript自定义数组排序方法
2015/02/12 Javascript
jQuery验证插件validation使用指南
2015/04/21 Javascript
JavaScript中setMonth()方法的使用详解
2015/06/11 Javascript
nodejs加密Crypto的实例代码
2016/07/07 NodeJs
如何选择jQuery版本 1.x? 2.x? 3.x?
2017/04/01 jQuery
探索webpack模块及webpack3新特性
2017/09/18 Javascript
vue-cli3配置与跨域处理方法
2019/08/17 Javascript
如何通过shell脚本自动生成vue文件详解
2019/09/10 Javascript
JS造成内存泄漏的几种情况实例分析
2020/03/02 Javascript
浅谈vue中resetFields()使用注意事项
2020/08/12 Javascript
jQuery实现本地存储
2020/12/22 jQuery
原生JavaScript实现留言板
2021/01/10 Javascript
Python中编写ORM框架的入门指引
2015/04/29 Python
Python MySQLdb Linux下安装笔记
2015/05/09 Python
用Python计算三角函数之atan()方法的使用
2015/05/15 Python
python网络编程调用recv函数完整接收数据的三种方法
2017/03/31 Python
python模拟事件触发机制详解
2018/01/19 Python
django 实现编写控制登录和访问权限控制的中间件方法
2019/01/15 Python
PyQt5 在label显示的图片中绘制矩形的方法
2019/06/17 Python
Python符号计算之实现函数极限的方法
2019/07/15 Python
基于Django静态资源部署404的解决方法
2019/07/28 Python
Python之关于类变量的两种赋值区别详解
2020/03/12 Python
Python实现一个简单的毕业生信息管理系统的示例代码
2020/06/08 Python
pycharm如何使用anaconda中的各种包(操作步骤)
2020/07/31 Python
日本PLST在线商店:日本时尚杂志刊载的人气服装
2016/12/10 全球购物
美国台面电器和厨具品牌:KitchenAid
2019/04/12 全球购物
2013年学期结束动员演讲稿
2014/01/07 职场文书
投标诚信承诺书
2014/05/26 职场文书
项目负责人任命书
2014/06/04 职场文书
MySql分区类型及创建分区的方法
2022/04/13 MySQL