$ var []和array_push()会覆盖mysqli_stmt_fetch()返回的内容

时间:2013-06-11 22:07:21

标签: php arrays mysqli

我通过mysqli prepared语句从数据库中获取多行。这发生在一个单独的函数中,它应该返回一个数组,而数组的每个键都将包含一个assoc。具有一个DB行的数组。有道理,对吧?

所以我谈到了这一点:

mysqli_stmt_bind_result($stmt,$row['employee_ID'],$row['name'],...);

$returnedarray = array();

while (mysqli_stmt_fetch($stmt))
{
    $returnedarray[] = $row;
}

期待我将每一行都推进并返回到返回的阵列中。

但是一旦返回数组 - 如果结果集中有5行,它将保持最后一行5次......

所以我尝试了这个:

$counter = 1;
while (mysqli_stmt_fetch($stmt))
{
    echo '<br><b>GOING '. $counter++ .'</b><br>';

    echo '<br>ROW: ';
    print_r($row);
    echo '<br>';

    $returnedarray[] = $row;

    echo '<br>RETURNED ARRAY: ';
    print_r($returnedarray);
}

所回应的内容看起来有点像这样:

  

前进1

     

行:数组([employee_ID] =&gt; 2 [名称] =&gt;罗伯特......)

     

返回阵列:数组([0] =&gt;数组([employee_ID] =&gt; 2 [名称] =&gt;   罗伯特......))

     

前进2

     

ROW:数组数组([employee_ID] =&gt; 3 [name] =&gt; john ...)

     

返回阵列:数组([0] =&gt;数组([employee_ID] =&gt; 3 [名称] =&gt;   约翰......)[1] =&gt;数组([employee_ID] =&gt; 3 [名称] =&gt;约翰......))

所以即使$ row完全保留了我想要的次数,并且我将它作为新索引推送到数组中,它实际上会用$ row覆盖所有现有索引/索引。

为什么不单独留下现有指数?

1 个答案:

答案 0 :(得分:4)

mysqli_stmt::fetch manual page的评论解决了这个问题: “问题是返回的$行是引用而不是数据。因此,当你编写$ array [] = $ row时,$ array将填充数据集的最后一个元素。” 那里也有另一种解决方案。

// loop through all result rows
while ($stmt->fetch()) {

    foreach( $row as $key=>$value )
    {
        $row_tmb[ $key ] = $value;
    }
    $array[] = $row_tmb;

}