php中mysqli 處理查詢結果集總結
阿新 • • 發佈:2018-12-11
在PHP開發中,我們經常會與資料庫打交道。我們都知道,一般的資料處理操作流程為
- 接收表單資料
-
資料入庫
//連線資料庫 $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類處理結果集,主要有以下幾種方法:
- fetch_all() :抓取所有的結果行並且以關聯資料,數值索引陣列,或者兩者皆有的方式返回結果集。
- fetch_array() :以一個關聯陣列,數值索引陣列,或者兩者皆有的方式抓取一行結果。
- fetch_object() :以物件返回結果集的當前行。
- fetch_row() :以列舉陣列方式返回一行結果
- fetch_assoc(): 以一個關聯陣列方式抓取一行結果。
- fetch_field_direct(): 以物件返回結果集中單欄位的元資料。
- fetch_field() :以物件返回結果集中的列資訊。
- fetch_fields() :以物件陣列返回代表結果集中的列資訊。
fetch_all (從結果集中取得所有行作為關聯陣列)
$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 (以列舉陣列方式返回一行結果)
$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 (以物件返回結果集中單欄位的元資料既單列的資訊)
$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 (以物件返回結果集中的列資訊)
$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比較