【问题标题】:$var[] and array_push() overwrites what mysqli_stmt_fetch() returned$var[] 和 array_push() 覆盖 mysqli_stmt_fetch() 返回的内容
【发布时间】:2013-06-07 22:14:00
【问题描述】:

我正在通过 mysqli 准备好的语句从数据库中获取多行。这是在一个单独的函数中发生的,它应该返回一个数组,而数组的每个键都将保存一个 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] => 2 [name] => 罗伯特 ...)

返回数组:数组 ( [0] => 数组 ( [employee_ID] => 2 [name] => 罗伯特...))

去 2

行:数组 Array ([employee_ID] => 3 [name] => john ...)

返回数组:数组 ( [0] => 数组 ( [employee_ID] => 3 [name] => john ... ) [1] => 数组 ([employee_ID] => 3 [name] => john ...) )

因此,即使 $row 每次都包含我想要的内容,并且我将它作为新索引推送到数组中,它实际上会用 $row 覆盖所有现有索引/索引。

为什么不保留现有索引?

【问题讨论】:

    标签: php arrays mysqli


    【解决方案1】:

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

    // loop through all result rows
    while ($stmt->fetch()) {
    
        foreach( $row as $key=>$value )
        {
            $row_tmb[ $key ] = $value;
        }
        $array[] = $row_tmb;
    
    }
    

    【讨论】:

    • 谢谢哥们,在过去的一个半小时里这让我发疯了...... -.-
    • 过去 4 小时我也疯了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    相关资源
    最近更新 更多