从这里开始
我的博客, 后台数据库是什么? 没错, 就是 MySQL, 服务器端使用的脚本就是 PHP, 整个框架使用的是 WordPressPHP 和 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 可以用于修改这个方法的行为, 它接受两个可取值这篇文章总结了二者之间的区别 http://www.jb51.net/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
- ", $firstname, $lastname, $email);
- }
- // 关闭连接
- $mysqliConn->close();
- ?>
2. 插入更新和删除数据
插入更新和删除使用的是 insertupdate 和 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
- ", $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();
- ?>
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 查询返回的行数, 或者受 insertupdate 或 delete 影响的行数
(1) 确定返回的行数
如果希望了解 select 查询语句返回了多少行, num_rows 属性很有用例如:
代码如下:
- // 与数据库交互
- $query = 'select firstname, lastname, email from tb_test;';
- // 发送查询给 MySQL
- $result = $mysqliConn->query($query);
- // 获取行数
- $result->num_rows;
记住, num_rows 只在确定 select 查询所获取的行数时有用, 如果要获得受 insertupdate 或 delete 影响的行数, 就要使用下面总结的 affected_rows 属性
(2) 确定受影响的行数
affected_rows 属性用来获取受 insertupdate 或 delete 影响的行数代码示例见上面的代码
执行数据库事务
有 3 个新方法增强了 PHP 执行 MySQL 事务的功能, 分别为:
1.autocommit 函数, 启用自动提交模式;
autocommit() 函数控制 MySQL 自动提交模式的行为, 由传入的参数决定启动还是禁用自动提交; 传入 TRUE, 则启动自动提交, 传入 false 则禁用自动提交无论启用还是禁用, 成功时都将返回 TRUE, 失败时返回 FALSE
2.commit 函数, 提交事务; 将当前事务提交给数据库, 成功时返回 TRUE, 否则返回 FALSE
3.rollback 函数, 回滚当前事务, 成功时返回 TRUE, 否则返回 FALSE
关于事务, 我后面还要继续总结, 这里就简要的总结了一下这三个 API
不会结束
这只是 MySQL 学习的开始, 不会结束再接再励
来源: https://www.php1.cn/detail/php-280b31e36d.html