2016-12-25 96 views
4

我寫的mysqli的孩子返回mysqli_result的子查詢方法。這個結果孩子將有其他獨特的方法,我的應用程序。擴展mysqli_result - 是否使用store_result()或use_result()

public MySQL extends mysqli 
{ 
    public function query($query) 
    { 
     if ($this->real_query($query)) { 
      if ($this->field_count > 0) { 
       return new MySQL_Result($this); 
      } 
      return true; 
     } 
     return false; 
    } 

} 

class MySQL_Result extends mysqli_result 
{ 
    public function fetch_objects() { 
     $rows = array(); 
     while($row = $this->fetch_object()) 
      $rows[$row->id] = $row; 
     return $rows; 
    } 
} 

我不明白是否fetch_object()使用緩衝或無緩衝的SQL數據。

mysqli_result的構造函數在mysqli.php中不可見,所以我看不到它是否調用$mysqli->store_result()$mysqli->use_result()

我嘗試添加這些方法MySQL但既不功能呼應。

public function store_result($option='a') { 
     echo "STORE RESULT<br/>"; 
    } 

    public function use_result($option='a') { 
     echo "USE RESULT<br/>"; 
    } 

這是否意味着mysqli_result構造不調用要麼?如果是這樣,它是如何訪問SQL數據時fetch_object叫?

................

我想緩衝的SQL數據。如果我不能找出孩子的構造函數是幹什麼的,我可能與調用$mysqli->store_result()一個裝飾來替代結果子類。

我是新來的PHP/OOP和非常感激反饋。謝謝。

回答

0

mysqli_resultuses buffered results from MySQL(重點煤礦)

查詢使用默認緩衝模式。這意味着,查詢結果立即從MySQL服務器PHP轉移,然後保存在PHP進程的內存。這允許額外的操作,如計算行數,移動(查找)當前結果指針。它還允許在處理結果集時在同一連接上發出進一步的查詢。緩衝模式的缺點是較大的結果集可能需要相當多的內存。內存將保持佔用,直到所有對結果集的引用都未被設置或者結果集被明確釋放,這將在請求結束時自動發生。術語「存儲結果」也用於緩衝模式,因爲整個結果集一次存儲。

的過程是這樣的

  1. 執行查詢。 MySQL的發回的結果
  2. mysqli_querymysqli_get_result(預處理語句)會加載該數據集爲mysqli_result對象

實際上,你必須走出自己的方式來執行異步查詢

+0

除了我重載了MySQL中的「查詢」方法並調用real_query()。所以沒有從SQL返回。返回必須發生在mysqli_result構造函數或fetch_object()中。 – Nick

0

看來, mysqli_result正在使用緩衝的SQL數據。

我寫了一個測試用例,它交替地訪問兩個查詢中的行。如果數據未經緩衝,則SQL服務器將忙於無法回答第二個查詢。

/* Open a connection */ 
$mysqli = new MysqlDB("127.0.0.1", "phpuser", "phpuserpw", "wishlist"); 
if (mysqli_connect_errno()) 
    return; 

if ($result = $mysqli->query("SELECT * FROM wishers")) { 

    $res2 = $mysqli->query("SELECT * FROM wishes"); 

    echo "Mem = ".memory_get_usage()."<br/>"; 

    while($row = $result->fetch_row()) { 
     $row2 = $res2->fetch_row(); 

     printf ("1: ID=%s, Name=%s, Pass=%s<br/>",$row[0],$row[1], $row[2]); 
     printf ("2: ID=%s, WisherID=%s<br/>", $row2[0], $row2[1]); 

     echo "Row Mem = ".memory_get_usage()."<br/>"; 
    } 

1:ID = 1,名稱=湯姆,通行證= Tomcat的

2:ID = 3,WisherID = 2

1:ID = 2,名稱=傑裏,通行證= jerrymouse

2:ID = 4,WisherID = 2

1:ID = 6,名稱=托米,通行證= Tomcat的

2:ID = 5,WisherID = 1

.........................

由於這兩個查詢都起作用,數據必須被緩衝。

相關問題