2010-08-09 134 views
4

我想知道我們如何轉換下面的代碼用foreach工作使用mysql_fetch_array()用foreach()來代替,而()

$query_select = "SELECT * FROM shouts ORDER BY id DESC LIMIT 8;"; 

    $result_select = mysql_query($query_select) or die(mysql_error()); 

    while($row = mysql_fetch_array($result_select)) { 
     $ename = stripslashes($row['name']); 
     $eemail = stripcslashes($row['email']); 
     $epost = stripslashes($row['post']); 
     $eid = $row['id']; 

     $grav_url = "http://www.gravatar.com/avatar.php?gravatar_id=".md5(strtolower($eemail))."&size=70"; 

     echo ('<img src = "' . $grav_url . '" alt="Gravatar">'.'<br/>'); 

     echo $eid . '<br/>'; 

     echo $ename . '<br/>'; 

     echo $eemail . '<br/>'; 

     echo $epost . '<br/><br/><br/><br/>'; 
+1

爲什麼?我沒有看到任何更改代碼的理由。使用foreach只會使它更長,並使用更多的內存。 – 2010-08-09 18:20:37

+5

那麼,不要去學習會讓你的代碼變得更糟的東西。相反,學習這一點:不要使用mysql_fetch_array()的foreach循環。 – 2010-08-09 18:28:09

回答

8

你可以像這樣的代碼:

$query_select = "SELECT * FROM shouts ORDER BY id DESC LIMIT 8;"; 
$result_select = mysql_query($query_select) or die(mysql_error()); 
$rows = array(); 
while($row = mysql_fetch_array($result_select)) 
    $rows[] = $row; 
foreach($rows as $row){ 
    $ename = stripslashes($row['name']); 
    $eemail = stripcslashes($row['email']); 
    $epost = stripslashes($row['post']); 
    $eid = $row['id']; 

    $grav_url = "http://www.gravatar.com/avatar.php?gravatar_id=".md5(strtolower($eemail))."&size=70"; 

    echo ('<img src = "' . $grav_url . '" alt="Gravatar">'.'<br/>'); 

    echo $eid . '<br/>'; 

    echo $ename . '<br/>'; 

    echo $eemail . '<br/>'; 

    echo $epost . '<br/><br/><br/><br/>'; 
} 

正如你所看到的,它仍然需要一個循環,而從mysql_fetch_array

+0

無法使用while循環完成嗎?我的意思是根本無法從數據庫中獲取數據並使用foreach循環迭代它,而實際上並沒有使用while循環... – 2010-08-09 18:29:10

+3

你不能。 ** Foreach **是一個循環,用於存在數組,循環遍歷每個項目。要獲取數據,需要** while循環**(或** for循環**)。 http://php.net/manual/en/control-structures.foreach.php – 2010-08-09 18:38:54

+0

不,mysql函數一次檢索1行,而不是行數組。如果切換到PDO(http://nl3.php.net/manual/en/book.pdo.php),則可以使用fetchAll()將結果集作爲數組使用。 – Kwebble 2010-08-09 18:43:31

5

這裏沒有將它轉化成的foreach一個很好的方式獲取數據,因爲mysql_fetch_array()只是從$result_select獲取下一個結果。如果你真的想的foreach,你可以做把所有結果到一個數組首先,做一些這樣的:

$result_list = array(); 
while($row = mysql_fetch_array($result_select)) { 
    result_list[] = $row; 
} 

foreach($result_list as $row) { 
    ... 
} 

但目前還沒有很好的理由,我可以看到這樣做 - 你仍然有使用while循環,由於mysql_fetch_array()的工作原理,這是不可避免的。爲什麼使用foreach()這麼重要?

編輯:如果這僅用於學習目的:您不能將其轉換爲foreach。您必須有一個預先存在的陣列才能使用foreach()而不是while(),而mysql_fetch_array()每次調用都會獲取一個結果 - foreach()沒有預先存在的陣列來遍歷。

+0

我正在學習PHP,而我想要學習這種可能性,實際上我無法在互聯網上找到任何可以解釋我使用foreach()進行數據庫操作的過程的好東西,如果有人能指出我正確的方式(tut),數據庫查詢使用foreach循環的可能性。 – 2010-08-09 18:27:12

+0

正確的做法是:不要對數據庫查詢使用foreach循環。 – 2010-08-09 18:29:29

+0

你找不到教程,因爲你不能使用foreach()來使用標準PHP MySQL庫進行數據庫操作(並且你不想使用其他任何東西)。如果由於某種原因,你真的想使用一個foreach()並且一次將所有的行放在數組中,你必須按照上面的方法來完成。 – cincodenada 2010-08-09 18:31:59

0

要使用foreach將要求您有一個數組,包含查詢結果中的每一行。一些用於PHP的DB庫提供了一個fetch_all函數,該函數提供了一個合適的數組,但我找不到一個用於mysql(但是mysqli擴展名)。你當然可以自己寫,就像這樣

function mysql_fetch_all($result) { 
    $rows = array(); 
    while ($row = mysql_fetch_array($result)) { 
    $rows[] = $row; 
    } 
    return $rows; 
} 

但是我必須迴應「爲什麼?使用此函數可以創建兩個循環而不是一個循環,並且要求將整個結果集加載到內存中。對於足夠大的結果集,這可能會成爲嚴重的性能拖延。什麼?

foreach (mysql_fetch_all($result) as $row) 

VS

while ($row = mysql_fetch_array($result)) 

while是一樣簡潔和IMO更具有可讀性。

編輯還有一種選擇,但它很荒謬。您可以使用Iterator Interface

class MysqlResult implements Iterator { 
    private $rownum = 0; 
    private $numrows = 0; 
    private $result; 

    public function __construct($result) { 
    $this->result = $result; 
    $this->numrows = mysql_num_rows($result); 
    } 

    public function rewind() { 
    $this->rownum = 0; 
    } 

    public function current() { 
    mysql_data_seek($this->result, $this->rownum); 
    return mysql_fetch_array($this->result); 
    } 

    public function key() { 
    return $this->rownum; 
    } 

    public function next() { 
    $this->rownum++; 
    } 

    public function valid() { 
    return $this->rownum < $this->numrows ? true : false; 
    } 
} 

$rows = new MysqlResult(mysql_query($query_select)); 

foreach ($rows as $row) { 
    //code... 
} 

在這種情況下,MysqlResult實例只獲取要求,正如與while行,但把它包裝在一個不錯的foreach獲得的數據包。雖然你已經保存了一個循環,但你已經添加了類實例化的開銷和函數調用的小船加載,更不用說增加了很多代碼複雜度。

但你問是否可以不使用while(或for我想象)。那麼它可以就這樣完成。是否完成取決於你。

+0

我不習慣oop,但是感謝那冗長的代碼,我經歷了它,並且必須承認我從中學到了一些東西。感謝您的延長幫助:) – 2010-08-09 19:15:27

0

foreach成爲一種可能性的最明顯的方法包括將整個結果集實現成一個數組,這可能遲早會讓你記憶死亡。你需要轉向迭代器來避免這個問題。見http://www.php.net/~helly/php/ext/spl/