Nous avons déjà été en contact avec du contenu lié à MYSQLI_result auparavant. Il s'agit en fait du jeu de résultats d'une requête. Cependant, dans PDO, les résultats sont généralement renvoyés après une interrogation via l'objet query() ou PDOStatement. Mais dans MySQLi, les résultats de la requête sont également placés dans un objet, qui est l'objet MySQLI_result.
Tout d'abord, nous devons obtenir un objet MySQLI_result via une requête.
$stmt = $mysqli->prepare("select * from zyblog_test_user where username = '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) // }
Si vous utilisez MYSQLI_STMT, vous pouvez obtenir un objet MySQLI_result via la méthode get_result() directement après que la méthodeexecute() exécute l'instruction de requête.
Dans cet objet, nous pouvons voir le champ actuel current_field, le numéro de champ field_count, la longueur du champ lengths, le numéro de ligne num_rows, le type et d'autres attributs. De nombreux étudiants constateront que current_field et lengths ne semblent pas avoir de contenu réel. En fait, ces deux attributs doivent afficher du contenu dans le cadre d'opérations spécifiques. Par exemple, lengths n'aura d'informations qu'après le jeu de résultats fetch().
$result->fetch_array(); var_dump($result); // …… // …… // ["lengths"]=> // array(4) { // [0]=> // int(0) // [1]=> // int(3) // [2]=> // int(3) // [3]=> // int(2) // } // …… // ……
Le contenu de l'attribut current_field sera affiché lorsque nous parcourrons et visualiserons les informations du champ ci-dessous.
Parmi les attributs visibles de l'objet MySQLI_result, nous ne pouvons voir que les informations ci-dessus. Ce n'est pas très utile pour notre développement commercial. En plus de num_rows, qui peut être utilisé pour déterminer si la requête a des résultats en fonction du nombre de lignes, nous devons plus important encore obtenir les informations sur les données dans l'ensemble de résultats. Dans ce cas, nous devons utiliser d’autres fonctions. Récupérons les données. La méthode
var_dump($result->fetch_all()); // array(7) { // [0]=> // array(4) { // [0]=> // int(42) // [1]=> // string(3) "kkk" // [2]=> // string(3) "666" // [3]=> // string(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() est utilisée pour obtenir toutes les données de l'ensemble de données et les renvoyer sous la forme d'un tableau. Elle peut spécifier le format de retour par défaut. indice de tableau tel que MYSQLI_NUM , similaire à PDO, nous pouvons le spécifier directement comme MySQLI_ASSOC pour renvoyer le contenu des données sous forme de nom de clé. La méthode
data_seek() déplace l'indice du jeu de résultats. Lorsque nous obtenons ou utilisons la méthode qui sera introduite plus tard pour parcourir une fois l'ensemble de résultats, si nous le parcourons à nouveau, son curseur est déjà à la dernière position, nous ne pouvons donc pas obtenir les données. Dans le code ci-dessus, nous remettons le curseur deux fois à la position d'indice 0, qui est la position initiale, afin que nous puissions exploiter cet ensemble de résultats à plusieurs reprises.
Si vous souhaitez obtenir des données ligne par ligne, nous pouvons utiliser diverses formes de méthodes d'acquisition de données d'ensemble de résultats.
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" // }
Utiliser fetch_array() consiste à obtenir les données de résultat de la ligne suivante et à les renvoyer sous la forme d'un tableau. Il peut également spécifier le format de l'ensemble de résultats renvoyé. Il est similaire à fetch_all(), sauf qu'il est similaire à fetch_all(). récupère uniquement la ligne suivante au lieu de Tous les ensembles de données, et ses paramètres par défaut sont le MYSQLI_BOTH renvoyé, c'est-à-dire que l'indice numérique et l'indice du nom de clé renvoient les résultats en même temps.
Il existe également une méthode fetch_assoc(), qui renvoie directement les données au format MYSQLI_ASSOC. Cette méthode ne nécessite aucun paramètre. Elle peut être considérée comme une encapsulation de l'utilisation de 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" // }
L'autre méthode, fetch_row(), peut être considérée comme une méthode similaire à fetch_array(MYSQLI_NUM). Il s'agit en fait de la méthode de retour de structure spécifiée par défaut comme MySQLI_NUM.
var_dump($result->fetch_row()); // array(4) { // [0]=> // int(43) // [1]=> // string(3) "kkk" // [2]=> // string(3) "666" // [3]=> // string(2) "k6" // }
Obtenir le jeu de résultats de l'objet est en fait similaire aux fonctions associées dans PDO. Il place les résultats directement dans une classe et l'instancie pour renvoyer un objet.
ar_dump($result->fetch_object()); // object(stdClass)#4 (4) { // ["id"]=> // int(42) // ["username"]=> // string(3) "kkk" // ["password"]=> // string(3) "666" // ["salt"]=> // string(2) "k6" // }
Ici, nous ne spécifions pas de classe, il utilise donc stdClass pour renvoyer la structure de l'objet. Nous pouvons également spécifier une classe et transmettre des paramètres au constructeur de cette classe, ce qui est identique à la fonctionnalité associée dans PDO.
class User { public function __construct() { print_r(func_get_args()); } } var_dump($result->fetch_object('User', [1, 2, 3])); // Array // ( // [0] => 1 // [1] => 2 // [2] => 3 // ) // object(User)#4 (4) { // ["id"]=> // int(42) // ["username"]=> // string(3) "kkk" // ["password"]=> // string(3) "666" // ["salt"]=> // string(2) "k6" // }
Ensuite, regardons comment obtenir les informations relatives au champ dans l'objet MySQLI_result. Nous pouvons obtenir directement toutes les informations de champ dans l'ensemble de résultats de la requête en cours.
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" // …… // ……
Dans ce code, nous avons examiné les informations de l'attribut current_field de l'objet MySQLI_result, et nous pouvons voir qu'il indique l'indice du champ actuellement situé.
Les informations des champs sont très détaillées, et les noms clés de ces attributs sont également très intuitifs, je ne donnerai donc pas d'explication détaillée ici.
$result->field_seek(1); while ($finfo = $result->fetch_field()) { var_dump($finfo); } // object(stdClass)#5 (13) { // ["name"]=> // string(8) "username" // ["orgname"]=> // string(8) "username"
Nous pouvons également déplacer le curseur de traversée de champ via la méthode field_seek(). Ici, nous déplaçons le curseur sur 1 et nous commencerons à parcourir à partir du deuxième champ de nom d'utilisateur. La méthode
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() est similaire à fetch_all(), elle récupère simplement toutes les informations sur le champ. Et fetch_field_direct() obtient les informations de champ de l'indice spécifié en fonction des paramètres.
至此,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
推荐学习:php视频教程
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!