php通过mysqli扩展查询数据有哪些方案?mysqli_fetch_系列
发布于 作者:苏南大叔 来源:程序如此灵动~不想使用笨重的各种php
框架,又想连接mysql
数据库拿数据。那么,使用原生支持的mysqli
系列函数就是最好的选择。本文里面苏南大叔就php
的mysqli
的五个类似函数mysqli_fetch_(.*)
做个对比试验。看看,这几个mysqli_fetch_(.*)
都有什么样的区别,日常编程中,最常用的是哪个函数?
苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程故事。本文测试环境:测试环境:win10
,nginx@1.15.11
,php@8.2.10-nts
,mysql@5.7.26
。
前文回顾
下面的两篇文章,讲述了在php
下,使用mysqli
扩展的基本姿势。
本文也是在上述两篇文章的基础上,做的扩展描述总结。开展叙述之前,先看一下基础部分。
首先,记得开启mysqli
扩展。类似编辑php.ini
文件:
extension = mysqli
然后准备好测试数据库表结构:
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `test` VALUES (1,'sunan大叔'),(2,'苏南大叔');
查询语句预览
php
连接数据库:
$conn = mysqli_connect('127.0.0.1','root','root'); //连接数据库
mysqli_select_db($conn,'coin'); //选择数据库
mysqli_set_charset($conn,'utf-8'); //设置字符集
准备好查询代码骨架:
$res = mysqli_query($conn,'SELECT * from test order by id desc');
// ############################
// 主体测试代码放这里!
// ############################
mysql_free_result($res);
mysqli_close($conn);
多条数据查询,是这样的:
while ($row = mysqli_fetch_【.*】($res)) {
var_dump($row);
}
单条数据查询,是这样的:
$row = mysqli_fetch_【.*】($res);
var_dump($row);
还可以写成:
$row = $res->fetch_【.*】();
var_dump($row);
mysqli_fetch_array(),数字加字段
mysqli_fetch_array()
返回的是【数字索引】加【字段名索引】
while ($row = mysqli_fetch_array($res)) { // 数字索引 加 字段名索引
var_dump($row);
/*
array(4) {
[0]=>
string(1) "2"
["id"]=>
string(1) "2"
[1]=>
string(12) "苏南大叔"
["name"]=>
string(12) "苏南大叔"
}
*/
var_dump($row[0],$row["id"]);
/*
string(1) "2"
string(1) "2"
*/
}
mysqli_fetch_row(),数字索引
mysqli_fetch_row()
返回的是【数字索引】
while ($row = mysqli_fetch_row($res)) { // 数字索引
var_dump($row);
/*
array(2) {
[0]=>
string(1) "2"
[1]=>
string(12) "苏南大叔"
}
*/
var_dump($row["1"]);
// string(12) "苏南大叔"
}
mysqli_fetch_assoc(),字段索引【数组】【推荐】
mysqli_fetch_assoc()
返回的是【字段索引】的数组,苏南大叔推荐使用这个函数,效果比较好。
while ($row = mysqli_fetch_assoc($res)) { // 字段名索引
var_dump($row);
/*
array(2) {
["id"]=>
string(1) "2"
["name"]=>
string(12) "苏南大叔"
}
*/
var_dump($row["id"]); // string(1) "2"
}
mysqli_fetch_object(),字段索引【对象】
mysqli_fetch_object()
返回的是【字段索引】的对象
while ($row = mysqli_fetch_object($res)) { // 字段名索引
var_dump($row);
/*
object(stdClass)#3 (2) {
["id"]=>
string(1) "2"
["name"]=>
string(12) "苏南大叔"
}
*/
var_dump($row->name); // string(12) "苏南大叔"
}
mysqli_fetch_field(),字段属性详情
mysqli_fetch_field()
返回的是字段的属性详情,并不是表里面的数据,和前几个函数区分特别大。
while ($row = mysqli_fetch_field($res)) { // 对每个字段的解释
var_dump($row);
/*
object(stdClass)#4 (13) {
["name"]=>
string(2) "id"
["orgname"]=>
string(2) "id"
["table"]=>
string(4) "test"
["orgtable"]=>
string(4) "test"
["def"]=>
string(0) ""
["db"]=>
string(4) "coin"
["catalog"]=>
string(3) "def"
["max_length"]=>
int(1)
["length"]=>
int(11)
["charsetnr"]=>
int(63)
["flags"]=>
int(49667)
["type"]=>
int(3)
["decimals"]=>
int(0)
}
*/
var_dump($row->name,$row->table,$row->db);
/*
string(2) "id"
string(4) "test"
string(4) "coin"
*/
}
表格总结
这几个取数据的函数,都属于游标类型的,while
循环到末尾后,就需要再次query
。而mysqli_fetch_field()
则不属于这其中。
函数 | 返回值 | 返回值类型 | 索引类型 | 游标影响 |
---|---|---|---|---|
mysqli_fetch_array | 表里的数据 | 数组 | 数字、字段 | 是 |
mysqli_fetch_row | 表里的数据 | 数组 | 数字 | 是 |
mysqli_fetch_assoc | 表里的数据 | 数组 | 字段 | 是 |
mysqli_fetch_object | 表里的数据 | 对象 | 字段 | 是 |
mysqli_fetch_field | 字段的属性 | 对象 | 字段 | 否 |
变种写法
除了while
循环这种写法外,这里有几个变种的写法,很简单的。
核心点就是:
mysqli_fetch_【.*】($res);
变成了:
$res->fetch_【.*】();
示例代码:
$res = mysqli_query($conn, 'SELECT * from test order by id desc');
$row = mysqli_fetch_array($res);
var_dump($row[1],$row["name"]); // 苏南大叔 苏南大叔
$res = mysqli_query($conn,'SELECT * from test order by id desc');
$row = mysqli_fetch_row($res);
var_dump($row["1"]); // 苏南大叔
$res = mysqli_query($conn,'SELECT * from test order by id desc');
$row = mysqli_fetch_assoc($res);
var_dump($row["id"]); // 2
$res = mysqli_query($conn,'SELECT * from test order by id desc');
$row = mysqli_fetch_object($res);
var_dump($row->name); // 苏南大叔
$row = mysqli_fetch_field($res);
var_dump($row->name,$row->table,$row->db); // id test coin
开始变形:
$res = mysqli_query($conn, 'SELECT * from test order by id desc');
$row = $res -> fetch_array();
var_dump($row[1],$row["name"]); // 苏南大哥 苏南大哥
$res = mysqli_query($conn,'SELECT * from test order by id desc');
$row = $res -> fetch_row();
var_dump($row["1"]); // 苏南大哥
$res = mysqli_query($conn,'SELECT * from test order by id desc');
$row = $res -> fetch_assoc();
var_dump($row["id"]); // 2
$res = mysqli_query($conn,'SELECT * from test order by id desc');
$row = $res -> fetch_object();
var_dump($row->name); // 苏南大哥
$row = $res -> fetch_field();
var_dump($row->name,$row->table,$row->db); // id test coin
结语
说实话,写这种编程细节,必须通过能赚钱的产品,才能取得最好的效果。更多php
文章,请参考:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。