一、mysqli_query()的概述
在PHP中,數據庫操作是開發最常用的部分之一。mysqli_query()函數是PHP中一個重要的函數,它用於執行MySQL數據庫的查詢(Query)。mysqli_query()函數使用MySQLi擴展庫中的函數來執行查詢操作。
mysqli_query()語法如下:
mysqli_query(connection,query,resultmode);
其中,
- mysqli_query():函數名
- connection:必需。規定要使用的MySQL連接。
- query:必需。規定查詢字符串。
- resultmode:可選。常量,默認MYSQLI_STORE_RESULT。如果指定MYSQLI_USE_RESULT,則返回結果集將不會被緩存,這對處理大量數據非常有用。
二、mysqli_query()的用法及示例
用mysqli_query()函數執行SELECT語句並返回結果集,然後再通過一遍遍歷把結果集中的數據取出來,示例代碼如下:
$conn = mysqli_connect('localhost', 'root', '','test');
if (!$conn){
die("連接數據庫失敗:" . mysqli_connect_error());
}
$sql = "SELECT * FROM user";
$result = mysqli_query($conn,$sql);
if(mysqli_num_rows($result)>0){
while($row = mysqli_fetch_assoc($result)){
echo "name: " . $row['name']. " - pwd:" . $row['pwd']. "
";
}
}else{
echo '沒有數據';
}
mysqli_close($conn);
該示例代碼用mysqli_query()函數執行一條SELECT語句,在結果集中取出全部數據並輸出。其中,mysqli_fetch_assoc()函數用於從結果集中取出數據行並將其封裝成一個關聯數組(key=>value),方便開發者使用。
三、mysqli_query()函數的常見問題
1. mysqli_query()函數返回值的問題
當執行SELECT語句時,mysqli_query()函數會返回一個結果集。當執行非SELECT語句時,mysqli_query()函數會返回一個boolean類型值,關於mysqli_query()函數返回值的問題,下面是一些需要關注的問題:
當查詢遇到錯誤時,mysqli_query()函數返回false值,
$sql = "SELECT * FROM user"; $result = mysqli_query($conn,$sql); if(!$result){ die('Invalid query: ' . mysqli_error($conn)); }
在使用INSERT、UPDATE、或DELETE語句時,mysqli_query()返回的是影響的行數:
$sql = "UPDATE user SET pwd=456 WHERE pwd=123"; $result = mysqli_query($conn,$sql); if($result){ echo "數據更新成功"; }else{ echo "數據更新失敗"; }
當mysql_query()函數執行的是不合規的語句時,返回false值。如果出現語法錯誤,則會報告一個 1064 錯誤,請檢查拼寫錯誤和語法錯誤:
$sql = "select * from user wherr username='aaa'"; $result = mysqli_query($conn,$sql); if(!$result){ die('Invalid query: ' . mysqli_error($conn)); }
2. mysqli_query()函數的性能問題
對於非SELECT語句的執行,可以選擇加入mysqli_use_result()或mysqli_store_result()參數,避免在執行語句時將結果全部存儲在客戶端內存中。
mysqli_store_result()存儲結果集在客戶端用於處理。該函數適合於返回非常大的數據量的查詢。
mysqli_use_result()會立即返回查詢結果,避免在查詢時將所有數據載入PHP內存。下面我們來對比一下這兩個PHP函數在獲取較大數據量的SELECT查詢結果中的時間性能表現。
require_once "config.php";
require_once "common.php";
$conn = mysqli_connect(DB_HOST,DB_USER,DB_PASSWORD,DB_DATABASE);
if (!$conn){
die("連接數據庫失敗:" . mysqli_connect_error());
}
$sql = "SELECT * FROM user_letter";
$start_time = get_millisecond();//獲取當前毫秒時間戳
$result = mysqli_query($conn,$sql,MYSQLI_STORE_RESULT);
if(mysqli_num_rows($result)>0){
//遍歷每個記錄並輸出
while($row = mysqli_fetch_assoc($result)){
//echo "id: ".$row["id"]." - content:".$row["content"]." - create_time:".$row["create_time"]."
";
}
}else{
echo '沒有數據';
}
$end_time = get_millisecond();//獲取當前毫秒時間戳
echo "Get result from DB using mysqli_store_result() costs ".($end_time-$start_time)."ms.";
mysqli_free_result($result);
$start_time = get_millisecond();
$result = mysqli_query($conn,$sql,MYSQLI_USE_RESULT);
if(mysqli_num_rows($result)>0){
while($row = mysqli_fetch_assoc($result)){
//echo "id: ".$row["id"]." - content:".$row["content"]." - create_time:".$row["create_time"]."
";
}
}else{
echo '沒有數據';
}
$end_time = get_millisecond();
echo "
Get result from DB using mysqli_use_result() costs ".($end_time-$start_time)."ms.";
mysqli_free_result($result);
mysqli_close($conn);
該示例代碼中,首先我們連接數據庫,接着,我們在所連接的數據庫中執行一條SELECT語句,並使用mysqli_query()函數在結果集中取出全部記錄。我們在遍歷每個記錄時可以看到注釋掉的輸出動作。
時間測試結果表明使用mysqli_use_result()明顯優於使用mysqli_store_result()。這是因為resultset一旦被關閉,系統會立即將其從服務器內存中刪除。
四、結尾
以上是使用mysqli_query()執行MySQL查詢的相關內容,我們可以看到mysqli_query()是PHP中常用的函數之一,我們可以針對不同的查詢進行優化,在開發過程中,還需注意到查詢字符串時需要對單引號和雙引號的使用,安全問題和數據庫連接的釋放等問題,這些也是不可忽視的。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/291246.html