PHP中的list()函数问题

时间:2011-07-02 21:00:13

标签: 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();

我正在使用html标记内的$description$short_description等变量,但没有显示。如果我使用下面的代码,除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数组的值。

我不明白为什么?

9 个答案:

答案 0 :(得分:5)

根据list()的{​​{1}}:

  

list()仅适用于数值数组   并假设数字指数   从0开始。

答案 1 :(得分:4)

我不相信list()函数适用于关联数组。尝试正常获取查询结果(数字索引),看看是否能解决问题。

答案 2 :(得分:3)

您想使用extract()代替list()

这是适合关联结果的那个。并且您不应该将它与SELECT *一起使用,而应该使用SELECT varname1,varname2,varname3的具体列表,这样您就不会得到意外的局部变量。

也可以使用extract(array_intersect_key(..))来获取要提取的过滤变量列表,但这对于您可以控制的数据库结果集来说是过度的。

答案 3 :(得分:2)

对此的一个相当简单的解决方案如下:

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

或者只是不作为assoc获取,而是作为普通数组。

我必须说我不建议这样做。由于您的SQL查询是使用*获取的,因此它很容易中断 - 让我们说无论出于何种原因,其中一列被改组,因此它出现在表中的某个其他位置。的Bam

假设您要在查询中单独定义每个列,那就没问题了。

答案 4 :(得分:1)

使用fetch_row而不是fetch_assocsee the example关联哈希数组没有明确定义的元素顺序!

答案 5 :(得分:1)

我的猜测是list()期望数字索引的数组。尝试使用 而是$row = $result->fetch_row();

答案 6 :(得分:1)

list()期望一个索引数组,而不是关联数组。尝试使用fetch_row()

答案 7 :(得分:1)

像这样使用array_values

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

阅读kevin在php.net上here的评论。

答案 8 :(得分:1)

list仅适用于数字索引数组。在分配之前将fetch_assoc切换到fetch_row或在$ row上使用array_values:

$row = $result->fetch_row();

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