私たちは以前に MYSQLI_result 関連のコンテンツにすでに触れています。これは実際にはクエリの結果セットです。ただし、PDO では、通常、query() または PDOStatement オブジェクトを介してクエリを実行した後に結果が返されます。しかし、MySQLi では、クエリ結果もオブジェクト (MySQLI_result オブジェクト) に入れられます。
$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) // }MYSQLI_STMT を使用する場合、execute() メソッドがクエリ ステートメントを実行した直後に、get_result() メソッドを通じて MySQLI_result オブジェクトを取得できます。 このオブジェクトでは、current_field 現在のフィールド、field_count フィールド番号、length フィールドの長さ、num_rows 行番号、type およびその他の属性を確認できます。多くの学生は、current_field と length には実際の内容がないようであることに気づくでしょう。実際、これら 2 つの属性は、特定の操作で内容を表示する必要があります。たとえば、length には、fetch() 結果セットが終わるまで情報がありません。
$result->fetch_array(); var_dump($result); // …… // …… // ["lengths"]=> // array(4) { // [0]=> // int(0) // [1]=> // int(3) // [2]=> // int(3) // [3]=> // int(2) // } // …… // ……current_field 属性の内容は、以下のフィールド情報をトラバースして表示すると表示されます。
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" // } // …… // ……
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() を使用すると、次の行の結果データを取得し、配列の形式で返します。返される結果セットの形式も指定できます。fetch_all() に似ています。ただし、データセット全体ではなく次の行のみをフェッチする点と、そのパラメータのデフォルトは返される MYSQLI_BOTH になります。つまり、数値添字とキー名の添字が同時に結果を返します。 データを MYSQLI_ASSOC 形式で直接返す fetch_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" // }もう 1 つのメソッド 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"]=> // string(3) "kkk" // ["password"]=> // string(3) "666" // ["salt"]=> // string(2) "k6" // }ここではクラスを指定していないため、stdClass を使用してオブジェクト構造を返します。クラスを指定して、このクラスのコンストラクターにパラメーターを渡すこともできます。これは、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" // }
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) "username" // ["orgname"]=> // string(8) "username"field_seek() メソッドを使用してフィールド トラバーサル カーソルを移動することもできます。ここではカーソルを 1 に移動し、2 番目のユーザー名フィールドから移動を開始します。
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() はパラメータに基づいて指定された添字のフィールド情報を取得します。
至此,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视频教程
以上がPHP を使用して MySQLi で MySQLI_result オブジェクト操作を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。