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 相关文章推荐
linux php mysql数据库备份实现代码
Mar 10 PHP
mayfish 数据入库验证代码
Apr 30 PHP
解析CodeIgniter自定义配置文件
Jun 18 PHP
深入解析PHP 5.3.x 的strtotime() 时区设定 警告信息修复
Aug 05 PHP
PHP小技巧之函数重载
Jun 02 PHP
PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
Jun 19 PHP
从零开始学YII2框架(五)快速生成代码工具 Gii 的使用
Aug 20 PHP
PHP多文件上传类实例
Mar 07 PHP
变量在 PHP7 内部的实现(二)
Dec 21 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
Dec 21 PHP
PHP多进程通信-消息队列使用
Mar 08 PHP
laravel框架语言包拓展实现方法分析
Nov 22 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中实现记住密码自动登录的代码
2011/03/02 PHP
Drupal7 form表单二次开发要点与实例
2014/03/02 PHP
PHP排序算法之堆排序(Heap Sort)实例详解
2018/04/21 PHP
贴一个在Mozilla中常用的Javascript代码
2007/01/09 Javascript
Display SQL Server Version Information
2007/06/21 Javascript
使用js+jquery实现无限极联动
2013/05/23 Javascript
jquery改变disabled的boolean状态的三种方法
2013/12/13 Javascript
node.js [superAgent] 请求使用示例
2015/03/13 Javascript
在Node.js中使用HTTP上传文件的方法
2015/06/23 Javascript
悬浮广告方法日常收集整理
2016/03/18 Javascript
基于jquery实现图片放大功能
2016/05/07 Javascript
深入理解JavaScript内置函数
2016/06/03 Javascript
原生JS实现首页进度加载动画
2016/09/14 Javascript
Vue中的Vux配置指南
2017/12/08 Javascript
vue中element组件样式修改无效的解决方法
2018/02/03 Javascript
Vue resource三种请求格式和万能测试地址
2018/09/26 Javascript
使用axios请求接口,几种content-type的区别详解
2019/10/29 Javascript
JS图片懒加载技术实现过程解析
2020/07/27 Javascript
Vant Weapp组件踩坑:picker的初始赋值解决
2020/11/12 Javascript
Vue中使用JsonView来展示Json树的实例代码
2020/11/16 Javascript
在服务器端实现无间断部署Python应用的教程
2015/04/16 Python
Python中list列表的一些进阶使用方法介绍
2015/08/15 Python
浅谈pyqt5中信号与槽的认识
2019/02/17 Python
python多进程下实现日志记录按时间分割
2019/07/22 Python
Python使用PyQt5/PySide2编写一个极简的音乐播放器功能
2020/02/07 Python
详解Python IO编程
2020/07/24 Python
CSS 3.0文字悬停跳动特效代码
2020/10/26 HTML / CSS
使用Html5、CSS实现文字阴影效果
2018/01/17 HTML / CSS
北美领先的智能产品购物网站:Wellbots
2018/06/11 全球购物
银行出纳岗位职责
2013/11/25 职场文书
制药工程专业毕业生推荐信
2013/12/24 职场文书
校园主题婚礼活动策划方案
2014/09/15 职场文书
网络新闻该怎么写?这些写作技巧你都知道吗?
2019/08/26 职场文书
开发一个封装iframe的vue组件
2021/03/29 Vue.js
mysql事务对效率的影响分析总结
2021/10/24 MySQL
vue使用refs获取嵌套组件中的值过程
2022/03/31 Vue.js