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 和 HTML
Oct 09 PHP
php SQL之where语句生成器
Mar 24 PHP
解决FastCGI 进程超过了配置的活动超时时限的问题
Jul 03 PHP
PHP中的Memcache详解
Apr 05 PHP
PHP has encountered a Stack overflow问题解决方法
Nov 03 PHP
Yii2框架数据库简单的增删改查语法小结
Aug 31 PHP
php将html转为图片的实现方法
May 19 PHP
Yii2.0多文件上传实例说明
Jul 24 PHP
详细解读php的命名空间(二)
Feb 21 PHP
PHP实现微信商户支付企业付款到零钱功能
Sep 30 PHP
实例介绍PHP中zip_open()函数用法
Feb 15 PHP
Yii框架日志操作图文与实例详解
Sep 09 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 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
2014/06/12 PHP
php中函数前加&amp;符号的作用分解
2014/07/08 PHP
PHP自定义函数格式化json数据示例
2016/09/14 PHP
PHPCMS V9 添加二级导航的思路详解
2016/10/20 PHP
jquery 最简单的属性菜单
2009/10/08 Javascript
基于JQuery的列表拖动排序实现代码
2013/10/01 Javascript
javascript unicode与GBK2312(中文)编码转换方法
2013/11/14 Javascript
js简单实现表单中点击按钮动态增加输入框数量的方法
2015/08/18 Javascript
javascript巧用eval函数组装表单输入项为json对象的方法
2015/11/25 Javascript
jQuery获取父元素及父节点的方法小结
2016/04/14 Javascript
JS基于MSClass和setInterval实现ajax定时采集信息并滚动显示的方法
2016/04/18 Javascript
微信小程序 向左滑动删除功能的实现
2017/03/10 Javascript
js使用i18n实现页面国际化的方法
2017/05/09 Javascript
简单谈谈React中的路由系统
2017/07/25 Javascript
利用javascript如何随机生成一定位数的密码
2017/09/22 Javascript
在vue组件中使用axios的方法
2018/03/16 Javascript
vue axios登录请求拦截器
2018/04/02 Javascript
VUE子组件向父组件传值详解(含传多值及添加额外参数场景)
2020/09/01 Javascript
python实现生命游戏的示例代码(Game of Life)
2018/01/24 Python
pandas删除指定行详解
2019/04/04 Python
Python3利用print输出带颜色的彩色字体示例代码
2019/04/08 Python
django2.2安装错误最全的解决方案(小结)
2019/09/24 Python
Python 类,property属性(简化属性的操作),@property,property()用法示例
2019/10/12 Python
Python实现平行坐标图的绘制(plotly)方式
2019/11/22 Python
Web前端绘制0.5像素的几种方法
2017/08/11 HTML / CSS
CSS3实现瀑布流布局与无限加载图片相册的实例代码
2016/12/22 HTML / CSS
The North Face意大利官网:服装、背包和鞋子
2020/06/17 全球购物
什么是反射?如何实现反射?
2016/07/25 面试题
建材业务员岗位职责
2013/12/08 职场文书
退休感言
2014/01/28 职场文书
询价采购方案
2014/06/09 职场文书
未婚证明范本
2015/06/15 职场文书
休假证明书
2015/06/24 职场文书
关于实现中国梦的心得体会
2016/01/05 职场文书
2019年学校消防安全责任书(2篇)
2019/10/09 职场文书
C3 线性化算法与 MRO之Python中的多继承
2021/10/05 Python