mysql 13.3.3結果セットからデータを解析(1)

45504 ワード

13.3.3結果セットからの解析データ(1)
クエリーを実行し、結果セットを準備すると、解析を開始できます.解析の内容は,結果セットから必要なレコード,フィールド情報,テーブル全体の属性などを取得する.データを解析する前に、MySQLデータベースサーバでdemoという名前のデータベースを作成する一連の関連例を提供します.データベースに連絡先情報テーブルcontactInfoを作成し、データテーブルを作成するSQL文を以下に示します.

  
  
  
  
  1. CREATE TABLE contactInfo (          # contact  
  2.     uid mediumint(8) unsigned NOT NULL AUTO_INCREMENT,      # ID  
  3.     name varchar(50) NOT NULL,          #  
  4.     departmentId char(3) NOT NULL,              #  
  5.     address varchar(80) NOT NULL,           #  
  6.     phone varchar(20),          #  
  7.     email varchar(100),         #  
  8.     PRIMARY KEY(uid)        # ID  
  9. ); 

データテーブルcontactInfoが作成された後、テーブルに複数行のレコードを挿入し、本例で挿入したデータを表13-5に示す.
表13-5データ表contactInfoにおけるデータ情報
UID
姓名
部門番号
連絡先
連絡先電話
電子メール
1
高某某
D01
海淀区
15801688338
[email protected]
2
ロ某某
D02
朝陽区
15801681234
[email protected]
3
峰某某
D03
東城区
15801689876
[email protected]
4
李某某
D04
西城区
15801681357
[email protected]
5
陳某某
D01
昌平区
15801682468
[email protected]
mysql機能拡張モジュールと同様に、mysqliインタフェースは結果セットオブジェクトにfetch_を提供します.row()、fetch_array()、fetch_assoc()とfetch_object()は、結果データ行を順次読み出すための4つの類似の方法である.この4つの方法は、呼び出しのたびに次の結果レコードが自動的に返され、結果データテーブルの最後に達した場合はFALSEが返されるという共通点で、フィールドを参照する方法にのみ違いがあります.以下では、この4つの方法を比較して紹介します.
1.$result->fetch_row()
このメソッドは、結果セットから結果レコードを取得し、値をインデックス配列に格納し、他の3つのメソッドに比べて最も便利な方法です.各フィールドには$row[$n]でアクセスする必要があります.$rowは結果セットから取得された1行のレコードから返される配列であり、$nは連続する整数の下付きです.インデックス配列を返すのでlist()関数と組み合わせて使用することもできます.コードは次のとおりです.

  
  
  
  
  1. <?php  
  2.     $mysqli = new mysqli("localhost""mysql_user", "mysql_pwd""demo");  // demo  
  3.     if (mysqli_connect_errno()) {  
  4.         printf(" : %s<br>", mysqli_connect_error());  
  5.         exit();  
  6.     }  
  7.     $mysqli->query("set names gb2312");         // 2312  
  8.      /*  D01  */ 
  9.     $result = $mysqli->query("SELECT name, email  FROM contactInfo WHERE departmentId='D01'");  
  10.     echo 'D01 :';  
  11.     echo '<ol>';  
  12.     while(list($name$email)=$result->fetch_row()){    //  
  13.         echo '<li>'.$name.' : '.$email.'</li>';        //  
  14.     }     
  15.     echo '</ol>';  
  16.     $result->close();           //  
  17.     $mysqli->close();       //  
  18. ?> 

出力結果は次のとおりです.

  
  
  
  
  1. D01 :   
  2.     1.  : [email protected]   
  3.     2.  : [email protected] 

上記の例では、配列を巡回することによって同様の出力結果を取得することもできる.しかしlist()関数とwhileループを組み合わせて使用すると、各レコードに遭遇したときにフィールドを変数に割り当てることで、いくつかのステップを簡略化できます.
2.$result->fetch_assoc()
このメソッドは、データ・テーブルのフィールド名がキーを表し、フィールドの内容が値を表す関連配列として結果レコードを返します.使用コードは次のとおりです.

  
  
  
  
  1. <?php  
  2.     $mysqli = new mysqli("localhost""mysql_user""mysql_pwd""demo");   // MySQL  
  3.     if (mysqli_connect_errno()) {   //  
  4.         printf(" : %s<br>", mysqli_connect_error());  
  5.         exit();  
  6.     }  
  7.     $mysqli->query("set names gb2312");         //  
  8.     $result = $mysqli->query("SELECT * FROM contactInfo");   //  
  9.  
  10.     echo '<table width="90%" border="1" align="center">';      // HTML  
  11.     echo '<caption><h1> </h1></caption>';     //  
  12.     echo '<th> ID</th><th> </th><th> </th>';     //  
  13.     echo '<th> </th><th> </th><th> </th>';      
  14.     while($row=$result->fetch_assoc()){         //  
  15.         echo '<tr align="center">';             //  
  16.         echo '<td>'.$row["uid"].'</td>';        // ID  
  17.         echo '<td>'.$row["name"].'</td>';               //  
  18.         echo '<td>'.$row["departmentId"].'</td>';           //  
  19.         echo '<td>'.$row["address"].'</td>';                //  
  20.         echo '<td>'.$row["phone"].'</td>';                  //  
  21.         echo '<td>'.$row["email"].'</td>';      //  
  22.         echo '</tr>';  
  23.     }     
  24.     echo '</table>';  
  25.      $result->close();              //  
  26.     $mysqli->close();           //  
  27. ?> 

出力結果を図13−2に示す.
 
(大図をクリックして表示)図13-2結果セットデータ出力を取得
13.3.3結果セットからの解析データ(2)
3.$result->fetch_array()
この方法はfetch_と言えるrow()とfetch_assoc()の2つのメソッドの結合バージョンでは、結果セットの各レコードを1つの関連配列または数値インデックス配列として取得したり、関連配列とインデックス配列として同時に取得したりすることができます.デフォルトでは、この2つの配列が同時に取得されます.このデフォルトの動作は、この方法のパラメータに次のような異なる値を入力することによって変更できます.
MYSQLI_ASSOC:レコードは関連配列として返され、フィールド名はキーであり、フィールド内容は値である.
MYSQLI_NUM:レコードはインデックス配列として返され、クエリーで指定したフィールド名順にソートされます.
MYSQLI_BOTH:これはデフォルト値で、レコードは関連配列として返され、インデックス配列として返されます.したがって、各フィールドはインデックスに基づいて参照をオフセットしたり、フィールド名に基づいて参照したりすることができます.
特別な要求がなければfetch_を使わないようにしてください.Array()メソッド.前に説明したfetch_を使用してrow()またはfetch_assoc()メソッドは同じ機能を実現し,より効率的になる.
4.$result->fetch_object()
このメソッドは、前の3つのメソッドとは異なり、配列ではなく結果レコードを1つのオブジェクトとして返します.各フィールドにはオブジェクトでアクセスする必要があり、データ列の名前はアルファベットの大文字と小文字を区別します.上記の例を修正し、同じデータを使用すると仮定します.この例は、前に説明したfetch_と同じです.assoc()メソッドが提供する結果は同じです.コードは次のとおりです.

  
  
  
  
  1. <?php  
  2.     $mysqli = new mysqli("localhost""mysql_user"
    "mysql_pwd""demo");   // MySQL  
  3.     if (mysqli_connect_errno()) {   //  
  4.         printf(" : %s<br>", mysqli_connect_error());  
  5.         exit();  
  6.     }  
  7.     $mysqli->query("set names gb2312");         //  
  8.     $result = $mysqli->query("SELECT * FROM contactInfo");  
    //  
  9.  
  10.     echo '<table width="90%" border="1" align="center">';   
    // HTML  
  11.     echo '<caption><h1> </h1></caption>';      //  
  12.     echo '<th> ID</th><th> </th><th> </th>';        
    //  
  13.     echo '<th> </th><th> </th><th> </th>';      
  14.     while($rowObj=$result->fetch_object()){                
    //  
  15.         echo '<tr align="center">';             //  
  16.         echo '<td>'.$rowObj->uid.'</td>';       // ID  
  17.         echo '<td>'.$rowObj->name.'</td>';              //  
  18.         echo '<td>'.$rowObj->departmentId.'</td>';          //  
  19.         echo '<td>'.$rowObj->address.'</td>';               //  
  20.         echo '<td>'.$rowObj->phone.'</td>';                 //  
  21.         echo '<td>'.$rowObj->email.'</td>';                 //  
  22.         echo '</tr>';  
  23.     }     
  24.     echo '</table>';  
  25.      $result->close();              //  
  26.     $mysqli->close();           //  
  27. ?> 

以上の4つの結果セットでデータを巡回する方法では、呼び出すたびに次の結果レコードが自動的に返されます.この読み取りの順序を変更するには、結果セットオブジェクトのdata_を使用します.seek()メソッドは、現在の記録位置を明確に変更する.結果セットオブジェクトのnum_を使用することもできます.rowsプロパティは、結果データテーブルのレコード数を与えます.また、結果オブジェクトのlengthsプロパティを使用して、上記の4つのメソッドを使用して最後に読み込まれた結果レコードの各フィールドの文字数であるグループを返すこともできます.