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(1)
Oct 09 PHP
PHP实现异步调用方法研究与分享
Oct 27 PHP
php树型类实例
Dec 05 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
Aug 01 PHP
PHP生成word文档的三种实现方式
Nov 14 PHP
php实现的简单数据库操作Model类
Nov 16 PHP
php获取excel文件数据
Apr 21 PHP
php 处理png图片白色背景色改为透明色的实例代码
Dec 10 PHP
PHP如何防止XSS攻击与XSS攻击原理的讲解
Mar 22 PHP
在Laravel 的 Blade 模版中实现定义变量
Oct 14 PHP
Laravel 之url参数,获取路由参数的例子
Oct 21 PHP
PHP实现计算器小功能
Aug 28 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删除HTMl标签的三种解决方法
2013/06/30 PHP
PHP最常用的正则表达式
2017/02/13 PHP
PHP swoole和redis异步任务实现方法分析
2019/08/12 PHP
yii2.0框架使用 beforeAction 防非法登陆的方法分析
2019/09/11 PHP
laravel http 自定义公共验证和响应的方法
2019/09/29 PHP
PHP使用POP3读取邮箱接收邮件的示例代码
2020/07/08 PHP
php实现简易计算器
2020/08/28 PHP
基于Jquery的简单&amp;简陋Tabs插件代码
2010/02/09 Javascript
jquery向.ashx文件post中文乱码问题的解决方法
2011/03/28 Javascript
javasctipt如何显示几分钟前、几天前等
2014/04/30 Javascript
JQuery EasyUI 加载两次url的原因分析及解决方案
2014/08/18 Javascript
javascript中call和apply的用法示例分析
2015/04/02 Javascript
AngularJS监听路由的变化示例代码
2016/09/23 Javascript
完美解决jQuery fancybox ie 无法显示关闭按钮的问题
2016/11/29 Javascript
前端自动化开发之Node.js的环境搭建教程
2017/04/01 Javascript
jQuery树插件zTree使用方法详解
2017/05/02 jQuery
JavaScript实现省市县三级级联特效
2017/05/16 Javascript
利用JS hash制作单页Web应用的方法详解
2017/10/10 Javascript
javascript实现循环广告条效果
2017/12/12 Javascript
详解Angular5 服务端渲染实战
2018/01/04 Javascript
Vue-Quill-Editor富文本编辑器的使用教程
2018/09/21 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
2019/04/09 Javascript
用js简单提供增删改查接口
2019/05/12 Javascript
微信小程序页面间跳转传参方式总结
2019/06/13 Javascript
Python线程详解
2015/06/24 Python
Python中属性和描述符的正确使用
2016/08/23 Python
Python实现将doc转化pdf格式文档的方法
2018/01/19 Python
对Python使用mfcc的两种方式详解
2019/01/09 Python
Django框架中间件定义与使用方法案例分析
2019/11/28 Python
python读取图像矩阵文件并转换为向量实例
2020/06/18 Python
Big Green Smile德国网上商店:提供各种天然产品
2018/05/23 全球购物
本科毕业自我鉴定
2014/03/20 职场文书
《开国大典》教学反思
2014/04/19 职场文书
医院护士见习期自我鉴定
2014/09/15 职场文书
Win10系统下配置Java环境变量
2021/06/13 Java/Android
Python基础数据类型tuple元组的概念与用法
2021/08/02 Python