2008-12-04 47 views
2

我有這個方法在我的DB類PHP mySQL - 你能返回一個帶有數字索引的關聯數組嗎?

public function query($queryString) 
    { 

     if (!$this->_connected) $this->_connectToDb(); //connect to database 

     $results = mysql_query($queryString, $this->_dbLink) or trigger_error(mysql_error()); 

     return mysql_num_rows($results) > 0 ? mysql_fetch_assoc($results) : false;    

    } 

這個偉大的工程中對返回1行查詢,但我怎麼能得到一個數組返回類似這樣的?

$array[0]['name'] = 'jim' 
$array[0]['id'] = 120 
$array[1]['name'] = 'judith' 
$array[1]['ID'] = 121 

現在我知道我可以使用while循環插入這個數據到數組像這樣,但我想知道如果PHP可以做到這一點與內部功能?我無法在文檔上找到我所追求的內容。

我不想在該方法中運行while的原因是因爲我將在返回數組時重新返回數組,並且我寧願不通過結果兩次(出於性能原因)。

有沒有辦法做到這一點?我的一般查詢方法設計有問題嗎?

非常感謝!

+0

FWIW,這是一種切,但你知道,如果你可以調用mysql_num_rows(),那麼你已經有了整個結果集,在你的PHP程序佔用的內存?在應用程序全部獲取之前,無法知道行數。 – 2008-12-04 01:54:04

回答

4
public function query($queryString) 
    { 

     if (!$this->_connected) $this->_connectToDb(); //connect to database 

     $results = mysql_query($queryString, $this->_dbLink) or trigger_error(mysql_error()); 

     $data = array(); 
     while($row = mysql_fetch_assoc($results)) 
     { 
       $data[] = $row; 
     } 
     return $data; 

    } 

這將始終返回一個數組。編輯: 我沒有讀好這個問題。 如果你真的不想使用循環話,我會做到這一點:

public function query($queryString) 
    { 

     if (!$this->_connected) $this->_connectToDb(); //connect to database 

     return mysql_query($queryString, $this->_dbLink) or trigger_error(mysql_error()); 

    } 

然後遍歷它,但是我只想用循環。

+0

我會第二個建議,堅持第一個代碼,它更乾淨,更容易使用。 – 2008-12-04 02:07:46

+0

看起來我必須這樣做。我一直在尋找方法來重構我的代碼,使其儘可能便宜。謝謝您的回答。 – alex 2008-12-04 02:13:29

1

大多數人在查詢中使用while()循環來完成您想要的操作,然後遍歷數組來處理它。

然而,你說得對:它浪費了內存,這可能是一個大數據集的問題。另一種方法是讓您的查詢方法返回結果集資源。然後你的while循環可以使用它來獲取每一行,因爲它需要它。

要抽象出來,我會建議另一個班級爲你做。然後,您的查詢調用將返回該類的新實例,該實例具有MySQL結果集資源作爲實例變量,並打包mysql_fetch_assoc()調用。

0

PEAR::MDB2Quickstart Cheatsheet)。它提供了許多不同的功能來完成這樣的事情。它也不會將您綁定到使用MySQL特定的函數,因爲它是一個數據庫抽象層。

$ result = $ db-> queryRow($ query,MDB2_FETCHMODE_ASSOC);

還有其他抽象層,例如ADO。

+0

對於不同的數據庫,SQL語言不同嗎? – alex 2008-12-04 13:08:18

+0

SQL是一個「標準」。然而,大多數數據庫僅實現標準的某些部分(例如SQL95)。通常,大多數基本查詢語法將在多個數據庫中可靠地工作。 – grepsedawk 2008-12-04 22:03:49

2

您可能還想看看PDO擴展名。您可以將整個結果集加載到數組中,也可以使用foreach循環。

​​
0

感謝您的想法。我有一個函數從sql返回一個關聯數組(在Moodle中使用)。

$ results = get_records_sql($ sql);

//to create a numerically indexed array: 
$data = array(); 
foreach ($results as $row) 
    { 
      $data[] = $row; 
    } 
return $data; 

}