2012-12-30 119 views
0

我有一個函數可以將基於sql查詢的一些行提取到一個數組中。 該數組是從函數返回的,如何遍歷返回數組的所有元素? 我是一個初學者在Php。如何打印從PHP中的函數返回的數組的所有元素?

function get_user_wants($user_id) 
{ 
$query=mysql_query("select product_id from user_wishlist where user_id= $user_id"); 
return mysql_fetch_assoc($query); 
} 

$out=get_user_wants($user_id); 
print_r($out); 

它只打印第一個元素或第一個記錄!

+0

使用PDO代替,然後您可以輕鬆地迭代結果。此外,你的功能缺少數據庫連接,因此它不適用於多個連接。 – hakre

+0

不推薦使用mysql *系列函數。改爲使用[PDO](http://php.net/manual/en/intro.pdo.php)。 – nico

+0

您應該使用PDO或mysqli。 mysqli擴展名與舊的mysql擴展名幾乎相同。請閱讀PHP文檔中的[選擇API](http://www.php.net/manual/en/mysqlinfo.api.choosing.php)。 –

回答

1

嘗試

foreach ($out as $key=>$value) 
    echo "$key: $value<br>"; 

爲出發點。

+2

不會給你任何東西print_r沒有做過 –

+0

你的例子只會循環由'mysql_fetch_assoc'給出的第一行的列,因爲它返回一個與取出的行相對應的關聯數組,並將內部數據指針向前移動,一次只有一個魚子。 –

+0

是的,它不會給print_r做任何事情 - 但這是關鍵:我把OQ讀爲「如何看看print_r()'blackbox」 - 在大多數情況下,你不會只想要以迴應內容。這種解釋可能是錯誤的......在這種情況下,對OQ的編輯可能是好的 –

4

嘗試這樣:

$sql = "select product_id from user_wishlist where user_id= $user_id"; 
$res = mysql_query($sql) or die("FAIL: $sql BECAUSE: " . mysql_error());; 
while ($row = mysql_fetch_assoc($res)) 
{ 
    print_r($row); 
} 

而且在你還沒有已經注意到了它的情況下,有人會火焰你如何使用MySQL的,而不是像的mysqli或PDO不同的事情。不要讓他們打擾你。這裏的要點是,你的查詢返回可能有很多行,並且你需要某種迭代器來檢索所有的行,這樣你的腳本就可以處理它們。

在本例中,每個$ row數組中都會有一個product_id元素。一旦你看到print_r()函數的輸出,它可能會很明顯,你可能會改變代碼。這可能會變成你想要的(我認爲)。

function get_user_wants($user_id) 
{ 
    $sql = "select product_id from user_wishlist where user_id= $user_id"; 
    $res = mysql_query($sql) or die("FAIL: $sql BECAUSE: " . mysql_error());; 
    while ($row = mysql_fetch_assoc($res)) 
    { 
     $out[] = $row['product_id']; 
    } 
    return $out; 
} 
+0

請隨時糾正我的分析錯誤 - while()迭代器上的不平衡圓括號。 –

+0

謝謝你,在stackoverflow的人是非常好的web開發:) – Faizan

+0

其實我現在工作,基本上我想操縱接收數組之外的函數。無論如何它現在完成了。 – Faizan

2

要返回mysql_fetch_assoc()一個調用的結果,所以你將只得到的第一行。

遍歷它們來創建一個多維數組,然後返回:

function get_user_wants($user_id) 
{ 
    $query=mysql_query("select product_id from user_wishlist where user_id= $user_id"); 
    $rows = array(); 
    while($row = mysql_fetch_assoc($query)) 
    { 
     $rows[] = $row; 
    } 
    return $rows; 
} 

現在你可以用foreach環路他們:

$list = get_user_wants(99); 
foreach($list as $product) 
{ 
    print_r($product); 
} 

邊注:mysql_*庫已過時,建議升級到MySQLi或PDO。

+0

它爲每個或while循環使用有什麼不同? – Faizan

+0

使用while來獲取行,然後當你有一個標準的php數組時,你可以使用for each循環。 – MrCode

2

你不能。該函數僅返回第一個結果。並沒有更多的信息。

所以你需要返回不同的東西,例如,結果資源:

function get_user_wants($user_id) 
{ 
    $query = mysql_query("select product_id from user_wishlist where user_id= $user_id"); 

    return $query; 
} 

然後,您可以通過它遍歷:

$result = get_user_wants($user_id); 

while ($out = mysql_fetch_assoc($result)) 
{ 
    print_r($out): 
} 

一種更好的方式則是包裝的結果在迭代器:

function get_user_wants($user_id) 
{ 
    $query = mysql_query("select product_id from user_wishlist where user_id= $user_id"); 

    return new MySqlResult($query); 
} 

$result = get_user_wants($user_id); 

foreach ($result as $out) 
{ 
    print_r($out): 
} 

這樣的結果迭代器可能看起來像:

/** 
* MySql Result Set - Array Based 
*/ 
class MySqlResult implements Iterator, Countable 
{ 
    private $result; 
    private $index = 0; 
    private $current; 

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

    public function fetch($result_type = MYSQL_BOTH) 
    { 
     $this->current = mysql_fetch_array($this->result, $result_type); 
     return $this->current; 
    } 

    /** 
    * Return the current element 
    * @link http://php.net/manual/en/iterator.current.php 
    * @return array 
    */ 
    public function current() 
    { 
     return $this->current; 
    } 

    public function next() 
    { 
     $this->current && $this->fetch(); 
    } 

    /** 
    * Return the key of the current element 
    * @link http://php.net/manual/en/iterator.key.php 
    * @return mixed scalar on success, or null on failure. 
    */ 
    public function key() 
    { 
     return $this->current ? $this->index : null; 
    } 

    /** 
    * Checks if current position is valid 
    * @link http://php.net/manual/en/iterator.valid.php 
    * @return boolean The return value will be casted to boolean and then evaluated. 
    * Returns true on success or false on failure. 
    */ 
    public function valid() 
    { 
     return (bool)$this->current; 
    } 

    /** 
    * Rewind the Iterator to the first element 
    * @link http://php.net/manual/en/iterator.rewind.php 
    * @return void Any returned value is ignored. 
    */ 
    public function rewind() 
    { 
     $this->fetch(); 
    } 

    /** 
    * Count of rows. 
    * 
    * @link http://php.net/manual/en/countable.count.php 
    * @return int The count of rows as an integer. 
    */ 
    public function count() 
    { 
     return mysql_num_rows($this->result); 
    } 
} 
+0

謝謝,我通常會尋求最簡單的解決方案,我想這就是我想要的。 – Faizan

+0

@Faizan:對於一個非常簡單的解決方案,請繼續閱讀這裏:http://stackoverflow.com/a/11580420/367456 - 也看看PDO。它會讓你的生活更輕鬆。 – hakre

相關問題