php中mysqli 處理查詢結果集總結

在PHP開發中,咱們常常會與數據庫打交道。咱們都知道,通常的數據處理操做流程爲php

  1. 接收表單數據
  2. 數據入庫html

    //鏈接數據庫
        $link = mysqli_connect("my_host", "my_user", "my_password", "my_db", "my_port");
    //設置字符編碼
        mysqli->query("SET NAME {$conf['charset']}");
    //設置時區
        date_default_timezone_set('PRC');  
    //拼接SQL語句
        $sql = "…………";
    //執行SQL語句
        $res = mysqli->query($sql);
    //根據執行後返回結果判斷是否操做成功
        if($res){
            //數據庫操做成功後的處理
        }else{
            //數據庫操做成功後的處理
        }

當在上面的$sql爲查詢語句時,在if($res)後,咱們通常會對獲得的結果集進行一系列的操做。
最基本的就是使用mysqli_result類處理結果集,主要有如下幾種方法:mysql

  1. fetch_all() :抓取全部的結果行而且以關聯數據,數值索引數組,或者二者皆有的方式返回結果集。
  2. fetch_array() :以一個關聯數組,數值索引數組,或者二者皆有的方式抓取一行結果。
  3. fetch_object() :以對象返回結果集的當前行。
  4. fetch_row() :以枚舉數組方式返回一行結果
  5. fetch_assoc(): 以一個關聯數組方式抓取一行結果。
  6. fetch_field_direct(): 以對象返回結果集中單字段的元數據。
  7. fetch_field() :以對象返回結果集中的列信息。
  8. fetch_fields() :以對象數組返回表明結果集中的列信息。

fetch_all (從結果集中取得全部行做爲關聯數組)sql

$sql="select * from user";
  $result=$link->query($sql);
  $row=$result->fetch_all(MYSQLI_BOTH);//參數MYSQL_ASSOC、MYSQLI_NUM、MYSQLI_BOTH規定產生數組類型
  $n=0;
  while($n<mysqli_num_rows($result)){
   echo "ID:".$row[$n]["id"]."用戶名:".$row[$n]["name"]."密碼:".$row[$n]["password"]."<br />";
   $n++;
  }

fetch_array (以一個關聯數組,數值索引數組,或者二者皆有的方式抓取一行結果)數據庫

$sql="select * from user";
$result=$link->query($sql);
while($row=$result->fetch_array()){
    echo "ID:".$row["id"]."用戶名:".$row[1]."密碼:".$row["password"]."<br />";
}
//fetch_array方法再也不有結果時返回返回NULL
//其返回結果能夠是關聯數組也能夠是數值數組索引,故$row["id"]、$row[1]均可以

fetch_object (以對象返回結果集的當前行)數組

$sql="select * from user";
$result=$link->query($sql);
while($row=$result->fetch_object()){
    echo "ID:".$row->id."用戶名:".$row->name."密碼:".$row->password."<br />";
}
//若是無更多的行則返回NULL
//返回的結果是對象,要以對象的方式調用

fetch_row (以枚舉數組方式返回一行結果)fetch

$sql="select * from user";
$result=$link->query($sql);
while($row=$result->fetch_row()){
    echo "ID:".$row[0]."用戶名:".$row[1]."密碼:".$row[2]."<br />";
}
//無更多行時返回NULL
//以數值下標調用數組,a[0]正確、a["id"]則不正確

fetch_assoc (以一個關聯數組方式抓取一行結果)編碼

$sql="select * from user";
$result=$link->query($sql);
while($row=$result->fetch_assoc()){
    echo "ID:".$row["id"]."用戶名:".$row["name"]."密碼:".$row["password"]."<br />";
}
//無更多行時返回NULL
//以關聯索引訪問數組,a["id"]正確、a[0]則不正確

fetch_field_direct (以對象返回結果集中單字段的元數據既單列的信息)code

$sql="select * from user";
$result=$link->query($sql);
$n=0;
while(1){
    if(!$row=$result->fetch_field_direct($n++)) break;
    echo "列名:".$row->name."所在表:".$row->table."數據類型:".$row->type."<br />";
}
//fetch_field_direct($n)只返回單個列,因此得不斷調用該方法,沒有該列時返回false

fetch_field (以對象返回結果集中的列信息)htm

$sql="select * from user";
$result=$link->query($sql);
while($row=$result->fetch_field()){
    echo "列名:".$row->name."所在表:".$row->table."數據類型:".$row->type."<br />";
}
//該方法檢索全部的列
//以對象方式返回列信息
//返回對象屬性如:name - 列名,table - 該列所在的表名,type - 該列的類型等

fetch_fields (以對象數組返回表明結果集中的列信息)

$sql="select * from user";
$result=$link->query($sql);
$row=$result->fetch_fields();
foreach($row as $val){
    echo "列名:".$val->name."所在表:".$val->table."數據類型:".$val->type."<br />";
}
//該方法功能與目的fetch_field同樣
//不同的是該方法返回一個對象數組(如:echo $row[0]->name;輸出第一列的名字),而不是一次檢索一列

以上的循環除了while皆可替代爲foreach,如:

$sql="select * from user";
$result=$link->query($sql);
$data=$result->fetch_assoc();
foreach($data as $row){
    echo "ID:".$row["id"]."用戶名:".$row["name"]."密碼:".$row["password"]."<br />";
}

其餘示例代碼皆可用foreach替代。


foreach和while二者的不一樣之處在於它們背後的運做方式:
在while循環裏,Perl會讀入一行輸入,把它存入某個變量而且執行循環主體。而後,它再回頭去找其餘的輸入行。
在foreach循環中,整行輸入操做符會在列表上下文中執行(由於foreach須要逐行處理列表的內容)。在循環開始執行以前,它必須先將輸入所有讀進來。
當輸入大容量的文件時,使用foreach會佔用大量的內存。二者的差別會十分明顯。所以,最好的作法,一般是儘可能使用while循環的簡寫,讓它每次處理一行。PHP中for、foreach和while比較

相關文章
相關標籤/搜索