PHP 获取查询结果

本期要点:

了解 mysqli_result 类是如何从数据库查询中获取结果集的

通过 mysqli::query 的返回值得到 mysqli_result 对象

通过调用 fetch_array() 方法从结果集获取出数据

如何依次获取多条数据

while 循环

将查询结果保存到数组

mysqli_result 类

header("Content-type: text/html; charset=utf-8"); //如果浏览器输出乱码就加上这一句

//预先定义数据库连接参数

$host = '127.0.0.1';

$user = 'root';

$pwd = 'root';

$dbname = 'php';

//连接到数据库

$db = new mysqli($host, $user, $pwd, $dbname);

//检查连接是否成功

if ( $db->connect_errno 0 ) {

echo "链接失败";

echo $db->connect_error;

}

//编写SQL

//$sql = "INSERT INTO msg (content,user,intime) VALUES ('aaa','bbb',123456)";注释掉原来的语句

$sql = "SELECT * FROM msg ORDER BY id DESC";

//执行SQL

$is = $db->query( $sql ); //获取返回值

var_dump( $is );

//判断执行是否成功

if ( $is == true) {

echo "插入成功";

}else {

echo "插入失败";

}

然后在浏览器输出,看到返回值不是布尔值,而变成了一个对象:

我们可以看到对象来自 mysqli_result 个类(类的实例化就是对象)。

mysqli_result 类是一个系统类,代表从一个数据库查询中获取的结果集。

语法参考:【PHP 手册】-【函数参考】-【数据库扩展】-【针对各数据库系统对应的扩展】-【MySQL】-【Mysqli】-【Mysqli_result】

mysqli::query 的返回值

从上面的内容我们可以看到 SQL 的执行语句($is = $db->query( $sql );)在更改之前跟更改之后所得到的结果是不一样的(一个是布尔值,一个是对象)。

这就源于 mysqli::query 的返回值。

mysqli::query 的返回值语法:

失败时返回 FALSE

通过 mysqli_query() 成功执行 SELECT,SHOW,DESCRIBE 或 EXPLAIN 查询会返回一个 mysqli_result 对象

其他查询则返回 TRUE

PS:因为我们上面的内容所执行的是一个 SELECT 语句,所以输出的是对象。

语法参考:【PHP 手册】-【函数参考】-【数据库扩展】-【针对各数据库系统对应的扩展】-【MySQL】-【Mysqli】-【Mysqli】-【mysqli::query】

mysql_fetch_array() 函数

mysql_fetch_array() 函数(方法)的作用是从结果集中取得一行作为关联数组,或数字数组,或二者兼有;

返回根据从结果集取得的行生成的数组,如果没有更多行则返回 false。

语法参考:【PHP 手册】-【函数参考】-【数据库扩展】-【针对各数据库系统对应的扩展】-【MySQL】-【Mysqli】-【Mysqli_result】

针对 mysqli::query 的返回值可能会出现两种数据的可能性,我们需要对它的返回值进行一个判断:

如果返回的是对象 mysqli_result 对象

则调用 fetch_array() 方法(取出数据库中的一条数据)

header("Content-type: text/html; charset=utf-8"); //如果浏览器输出乱码就加上这一句

//预先定义数据库连接参数

$host = '127.0.0.1';

$user = 'root';

$pwd = 'root';

$dbname = 'php';

//连接到数据库

$db = new mysqli($host, $user, $pwd, $dbname);

//检查连接是否成功

if ( $db->connect_errno 0 ) {

echo "链接失败";

echo $db->connect_error;

}

//编写SQL

//$sql = "INSERT INTO msg (content,user,intime) VALUES ('aaa','bbb',123456)"; 注释掉原来的语句

$sql = "SELECT * FROM msg ORDER BY id DESC";

//执行SQL

$is = $db->query( $sql ); //获取返回值

//对返回值进行判断

if ( $is === false) {

echo "SQL错误";

exit;

}

//得到mysqli_result对象后调用fetch_array()方法

var_dump($is->fetch_array());

浏览器输出与数据库对比:

我们可以看到浏览器输出的是一个数组,其中的键值对都可以跟数据库中的内容一一对应上。

但好像重复了一次:其中一组是关联数组,一组是索引数组。

这里我们可以用一个常量MYSQLI_ASSOC把索引数组去掉。

我们把上面fetch_array()方法加一个参数:

//得到mysqli_result对象后调用fetch_array()方法

var_dump( $is->fetch_array( MYSQLI_ASSOC ));

然后在浏览器再次输出:

获取多条数据

如果我们需要输出多条数据:

header("Content-type: text/html; charset=utf-8"); //如果浏览器输出乱码就加上这一句

//预先定义数据库连接参数

$host = '127.0.0.1';

$user = 'root';

$pwd = 'root';

$dbname = 'php';

//连接到数据库

$db = new mysqli($host, $user, $pwd, $dbname);

//检查连接是否成功

if ( $db->connect_errno 0 ) {

echo "链接失败";

echo $db->connect_error;

}

//编写SQL

//$sql = "INSERT INTO msg (content,user,intime) VALUES ('aaa','bbb',123456)"; 注释掉原来的语句

$sql = "SELECT * FROM msg ORDER BY id DESC";

//执行SQL

$is = $db->query( $sql ); //获取返回值

//对返回值进行判断

if ( $is === false) {

echo "SQL错误";

exit;

}

//得到mysqli_result对象后调用fetch_array()方法

var_dump( $row = $is->fetch_array( MYSQLI_ASSOC ) ) ;

var_dump( $row = $is->fetch_array( MYSQLI_ASSOC ) ) ;

var_dump( $row = $is->fetch_array( MYSQLI_ASSOC ) ) ;

var_dump( $row = $is->fetch_array( MYSQLI_ASSOC ) ) ;

...

只要我们连续调用,浏览器就会依次输出:

首次调用显示最新的一条记录

重复调用,依次显示后面的记录

如果没有数据了就会显示 NULL

浏览器输出:

while 循环

这个应该是属于

《PHP丨流程控制》

中的内容,因为之前没讲就插播一下。

while 循环是 PHP 中最简单的循环类型:

值为 true 执行循环

如果值是 false 就停止循环

所以,根据 while 循环的原理我们上面的代码也可以这样写:

header("Content-type: text/html; charset=utf-8"); //如果浏览器输出乱码就加上这一句

//预先定义数据库连接参数

$host = '127.0.0.1';

$user = 'root';

$pwd = 'root';

$dbname = 'php';

//连接到数据库

$db = new mysqli($host, $user, $pwd, $dbname);

//检查连接是否成功

if ( $db->connect_errno 0 ) {

echo "链接失败";

echo $db->connect_error;

}

//编写SQL

//$sql = "INSERT INTO msg (content,user,intime) VALUES ('aaa','bbb',123456)"; 注释掉原来的语句

$sql = "SELECT * FROM msg ORDER BY id DESC";

//执行SQL

$is = $db->query( $sql ); //获取返回值

//对返回值进行判断

if ( $is === false) {

echo "SQL错误";

exit;

}

//得到mysqli_result对象后调用fetch_array()方法

while ( $row = $is->fetch_array( MYSQLI_ASSOC )) {

var_dump( $row );

}

浏览器输出:

可以看到那些 NULL 也都没了,因为当 while 的值为 false 时它就停止循环了。

将查询结果保存到数组

//预先定义数据库连接参数

$host = '127.0.0.1';

$user = 'root';

$pwd = 'root';

$dbname = 'php';

//连接到数据库

$db = new mysqli($host, $user, $pwd, $dbname);

//检查连接是否成功

if ( $db->connect_errno 0 ) {

echo "链接失败";

echo $db->connect_error;

}

//编写SQL

//$sql = "INSERT INTO msg (content,user,intime) VALUES ('aaa','bbb',123456)"; 注释掉原来的语句

$sql = "SELECT * FROM msg ORDER BY id DESC";

//执行SQL

$is = $db->query( $sql ); //获取返回值

//对返回值进行判断

if ( $is === false) {

echo "SQL错误";

exit;

}

//得到mysqli_result对象后调用fetch_array()方法

$rows = [];

while ( $row = $is->fetch_array( MYSQLI_ASSOC )) {

$rows[] = $row;

}

var_dump( $rows );

浏览器输出:

可以看到上面已经成为了一个二维数组。

因为fetch_array() 只能调用一次数据库中的数据(如果进行第二次调用同一条数据就会显示 NULL),而如果我们需要在网页中重复显示数据就需要把所调出的数据保存在一个二维数组中,以供重复调用。

如果我们需要把数组的键名改为它们的 id 的话,只需要在 $rows[] =$row; 中加上 $rows[ $row['id'] 即是:$rows[ $rows[ $row['id'] ] = $row;

然后再次在浏览器输出:

——END——

This is not the end.

It is not even the beginning of the end.

But it is,

perhaps,the end of the beginning.

更多分享

三小时学会 HTML 网页编辑

三小时学会 CSS 网页美化

PHP 网站开发

数据库基础

效率工具

小众电影

小程序开发

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180610A048L400?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券