当前位置: 首页 > 后端技术 > PHP

PHP之MySQLi扩展学习(六)MySQLI_result对象操作

时间:2023-03-29 15:26:22 PHP

在之前的文章中,我们已经接触到了MYSQLI_result相关的内容。它的作用实际上是一个查询的结果集。而在PDO中,通常是直接通过query()或PDOStatement对象查询后返回结果。但是在MySQLi中,查询的结果也会被放入一个对象中,这个对象就是MySQLI_result对象。MySQLI_result对象属性首先,我们需要通过查询得到一个MySQLI_result对象。$stmt=$mysqli->prepare("select*fromzyblog_test_userwhereusername='kkk'");$stmt->execute();//执行语句$result=$stmt->get_result();var_dump($result);//object(mysqli_result)#3(5){//["current_field"]=>//int(0)//["field_count"]=>//int(4)//["lengths"]=>//NULL//["num_rows"]=>//int(7)//["type"]=>//int(0)//}如果使用MYSQLI_STMT,直接在execute()方法执行完查询语句后,可以通过get_result()方法得到一个MySQLI_result对象。在这个对象中,我们可以看到有current_field当前字段,field_count字段数,lengths字段长度,num_rows行数,type这些属性内容。很多同学会发现current_field和lengths好像没有什么实际内容。其实这两个属性只会在特定的操作下显示内容。例如,长度只有在fetch()结果集之后才会有信息。$result->fetch_array();var_dump($result);//...//...//["lengths"]=>//array(4){//[0]=>//int(0)//[1]=>//int(3)//[2]=>//int(3)//[3]=>//int(2)//}//...//......还有current_field属性的内容,我们在下面遍历查看字段信息的时候会显示它的内容。在获取MySQLI_result对象的查询结果集的可见属性中,我们只能看到上面的信息。对我们的业务发展用处不大。num_rows除了可以根据行数来判断查询是否有结果外,更重要的是我们需要获取结果集中的数据信息。这时候我们就需要使用其他的函数来获取数据了。获取所有结果集var_dump($result->fetch_all());//array(7){//[0]=>//array(4){//[0]=>//int(42)//[1]=>//字符串(3)"kkk"//[2]=>//字符串(3)"666"//[3]=>//字符串(2)"k6"//}//...//...$result->data_seek(0);var_dump($result->fetch_all(MYSQLI_ASSOC));//array(7){//[0]=>//array(4){//["id"]=>//int(42)//["username"]=>//string(3)"kkk"//["password"]=>//string(3)"666"//["salt"]=>//string(2)"k6"//}//...//...fetch_all()方法用于获取数据集中的所有数据,并以数组格式返回,可以指定返回的格式,默认为数组下标的形式MYSQLI_NUM,和PDO类似,我们直接指定MySQLI_ASSOC就可以以键名的形式返回数据内容。data_seek()方法是移动结果集的索引。我们获取或者使用后面要介绍的方法循环一次结果集后,如果再遍历,它的游标已经在最后一个位置了,所以获取不到数据。在上面的代码中,我们两次将游标返回到下标0的位置,也就是初始位置,这样我们就可以重复操作这个结果集。获取普通结果集如果想逐行获取数据,我们可以使用各种形式的结果集数据获取方式。var_dump($result->fetch_array());//array(8){//[0]=>//int(42)//["id"]=>//int(42)//[1]=>//string(3)"kkk"//["username"]=>//string(3)"kkk"//[2]=>//string(3)"666"//["password"]=>//string(3)"666"//[3]=>//string(2)"k6"//["salt"]=>//string(2)"k6"//}var_dump($result->fetch_array(MYSQLI_ASSOC));//array(4){//["id"]=>//int(43)//["username"]=>//string(3)"kkk"//["password"]=>//string(3)"666"//["salt"]=>//string(2)"k6"//}使用fetch_array()获取下一个line结果数据以数组的形式返回,也可以指定返回结果集的格式,与fetch_all()类似,只是只取下一行而不是整个数据集,以及它的参数默认为返回的MYSQLI_BOTH,即数字下标和键名下标同时返回结果。另外还有一个fetch_assoc()方法,直接返回MYSQLI_ASSOC格式的数据。该方法不需要任何参数,可以看作是对fetch_array(MYSQLI_ASSOC)的封装。var_dump($result->fetch_assoc());//array(4){//["id"]=>//int(42)//["username"]=>//string(3)"kkk"//["password"]=>//string(3)"666"//["salt"]=>//string(2)"k6"//}还有一个方法fetch_row(),你可以想想将其作为类似于fetch_array(MYSQLI_NUM)的方法。其实就是默认指定为MySQLI_NUM的结构体返回方式。var_dump($result->fetch_row());//array(4){//[0]=>//int(43)//[1]=>//string(3)"kkk"//[2]=>//string(3)"666"//[3]=>//string(2)"k6"//}获取对象结果集获取对象结果集其实和PDO中的相关函数类似,它将结果直接放入一个类中并实例化返回一个对象。ar_dump($result->fetch_object());//object(stdClass)#4(4){//["id"]=>//int(42)//["username"]=>//字符串(3)"kkk"//["password"]=>//string(3)"666"//["salt"]=>//string(2)"k6"//}这里我们不指定类,所以它使用stdClass返回对象结构。我们也可以指定一个类,将参数传递给这个类的构造函数,这和PDO中的相关函数是一样的。类User{公共函数__construct(){print_r(func_get_args());}}var_dump($result->fetch_object('User',[1,2,3]));//数组//(//[0]=>1//[1]=>2//[2]=>3//)//object(User)#4(4){//["id"]=>//int(42)//["用户名"]=>//字符串(3)"kkk"//["密码"]=>//字符串(3)"666"//["salt"]=>//string(2)"k6"//}获取查询结果集的字段信息接下来我们看一下MySQLI_result对象中字段相关信息的获取。我们可以直接获取当前查询的结果集中的所有字段信息。while($finfo=$result->fetch_field()){var_dump($result->current_field);var_dump($finfo);}//int(1)//object(stdClass)#4(13){//["name"]=>//string(2)"id"//["orgname"]=>//string(2)"id"//["table"]=>//string(16)"zyblog_test_user"//["orgtable"]=>//string(16)"zyblog_test_user"//["def"]=>//string(0)""//["db"]=>//string(9)"blog_test"//["catalog"]=>//string(3)"def"//["max_length"]=>//int(0)//["length"]=>//int(11)//["charsetnr"]=>//int(63)//["flags"]=>//int(49667)//["type"]=>//int(3)//["decimals"]=>//int(0)//}//int(2)//object(stdClass)#5(13){//["name"]=>//string(8)"username"//["orgname"]=>//string(8)"username"//...//...这段代码中,我们查看了MySQLI_result对象的current_field属性信息,可以看到它指出的是当前所在字段的下标。字段信息很详细,这些属性的键名也很直观,这里就不做详细描述了。$result->field_seek(1);while($finfo=$result->fetch_field()){var_dump($finfo);}//object(stdClass)#5(13){//["name"]=>//string(8)"用户名"//["orgname"]=>//string(8)"username"我们也可以使用field_seek()方法移动光标进行字段遍历。这里我们将光标移动到1,从第二个用户名字段开始遍历。var_dump($result->fetch_fields());//array(4){//[0]=>//object(stdClass)#5(13){//["name"]=>//string(2)"id"//["orgname"]=>//string(2)"id"//["table"]=>//string(16)"zyblog_test_user"//["orgtable"]=>//string(16)"zyblog_test_user"//["def"]=>//string(0)""//["db"]=>//string(9)"blog_test"//["catalog"]=>//string(3)"def"//["max_length"]=>//int(0)//["length"]=>//int(11)//["charsetnr"]=>//int(63)//["flags"]=>//int(49667)//["type"]=>//int(3)//["decimals"]=>//int(0)//}//[1]=>//object(stdClass)#4(13){//["name"]=>//string(8)"username"var_dump($result->fetch_field_direct(2));//object(stdClass)#7(13){//["name"]=>//string(8)"password"//["orgname"]=>//string(8)"password"//["table"]=>//string(16)"zyblog_test_user"//["orgtable"]=>//string(16)"zyblog_test_user"//["def"]=>//string(0)""//["db"]=>//string(9)"blog_test"//["catalog"]=>//string(3)"def"//["max_length"]=>//int(3)//["length"]=>//int(765)//["charsetnr"]=>//int(33)//["flags"]=>//int(0)//["type"]=>//int(253)//["decimals"]=>//int(0)//}fetch_fields()方法类似于fetch_all(),fetch_field_direct()是获取所有字段信息,fetch_field_direct()是根据参数获取指定下标的字段信息。综上所述,MySQLi相关扩展的学习到此结束。其他如MySQLI_Driver、MySQLI_Exception等类和函数,可以自行查阅相关文档,内容不多。MySQLI_Driver对象可以帮助我们指定当前驱动的报错形式,我们在之前的文章中也有接触到。总的来说,我们已经学会了PHP中所有处理MySQL的官方扩展。掌握这两个扩展的区别和联系最重要的是PDO和MYSQLi。在实际业务开发中,PDO还是会用的比较多,但是MySQLi永远不能完全忽略,所以要多多学习。测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/9。PHP之MySQLi扩展学习(六)MySQLI_result对象操作。PHP参考文档:https://www.php.net/manual/zh/class.mysqli-result.php各媒体平台均可搜索【硬核项目经理】