2011-07-02 117 views
2
list()函數

我已經寫了下面的代碼:問題與PHP

$release_id = intval(filter_var($_GET["rid"],FILTER_SANITIZE_STRING)); 
$query = "select * from press_releases where id = {$release_id}"; 

$result = $db->query($query); 
$row = $result->fetch_assoc(); 

list($id, $short_description, $description, $created_date) = $row; 

$db->close(); 

,我使用諸如$description$short_description裏面的html標籤的變量,但沒有任何顯示。如果我使用下面的代碼,這是除了list()功能相同:

$release_id = intval(filter_var($_GET["rid"],FILTER_SANITIZE_STRING)); 
$query = "select * from press_releases where id = {$release_id}"; 

$result = $db->query($query); 
$row = $result->fetch_assoc(); 

$id = $row["id"]; 
$short_description = $row["short_description"]; 
$description = stripslashes(html_entity_decode($row["description"])); 
$created_date = $row["created_date"]; 

$db->close(); 

它完美的作品。基本上list()函數不能分配來自$row數組的值。

我不明白爲什麼?

回答

4

我不相信list()函數與關聯數組一起工作。嘗試通常提取查詢結果(數字索引),然後查看是否能爲您解決問題。

5

根據the PHP docslist()

list()僅適用於數字陣列 並假定數字索引 爲0

+0

現在有意義。它已經在文檔中說過了,但我看不到它:http://blog.csdn.net/manual/en/function.list.php – Tarik

+0

@Braveyard:另外,'list()'以相反的順序賦值(請參閱下面的警告)。 –

1

使用fetch_row而非fetch_assocsee the example啓動。 關聯散列數組沒有明確定義的元素順序!

+0

當然他們有一個明確的元素順序。 –

+0

@Felix:對不起,我的意思是「散列容器」。當然,像C++的'std :: set'這樣的有序關聯容器確實有順序 - 但順序並不是插入的順序,而不是鍵值。我不確定PHP,但我認爲關聯數組是基於散列的,比如'std :: unordered_map' ... –

+0

Uhm,我不知道C++。但在PHP中,實際上只有一種類型的數組,並且元素是有序的(插入順序),無論鍵是數字還是字符串。 –

1

我的猜測是list()需要一個數字索引數組。嘗試使用 $row = $result->fetch_row();而不是

1

list()需要一個索引數組,而不是關聯數組。嘗試使用fetch_row()

1

使用array_values這樣的:

list($id, $short_description, $description, $created_date) = array_values($row); 

閱讀由凱文評論中here上php.net。

+0

非常好,非常感謝.... – Tarik

2

一個相當簡單的解決辦法,這是如下:

list($id, $short_description, $description, $created_date) = array_values($row); 

或者乾脆不取爲assoc命令,但作爲一個正常的數組。

我必須說我並不真的建議這樣做。由於你的SQL查詢是用*獲取的,所以它會很容易中斷 - 比方說,無論出於何種原因,其中一列會被混洗,所以它出現在表中的其他位置。巴姆。

假設您要在查詢中分別定義每個列,那就沒問題。

+1

此外,你必須反轉變量列表,因爲'list'從右到左賦值。 –

1

list只能使用數字索引的數組。切換到FETCH_ASSOC或fetch_row轉讓之前,$行用array_values:

$row = $result->fetch_row(); 

list($id, $short_description, $description, $created_date) = array_values($row); 
3

你想用extract()而不是list()

這是適用於關聯結果的一個。你不應該使用SELECT *,而是使用SELECT varname1,varname2,varname3的具體列表,這樣你就不會得到意想不到的局部變量。

也可以使用extract(array_intersect_key(..))來獲取要提取的變量的過濾列表,但對於您可以控制的數據庫結果集來說,這是過度的。

+0

我真的很喜歡這個版本。非常感謝。 'extract'和'array_values'將是很好的解決方案... – Tarik

+0

+1不錯的選擇。 –