PHP MySQLi 获取“数组推送”覆盖数据

Posted

技术标签:

【中文标题】PHP MySQLi 获取“数组推送”覆盖数据【英文标题】:PHP MySQLi fetch "array push" overrides data 【发布时间】:2015-12-16 18:03:27 【问题描述】:

我有 2 个数组:

$arr = [];

$tempArray = [
    'val1' => "xxx",
    'val2' => 0,
    'val3' => 0
];

然后在我的 mysql 查询中,我用当前行中的值填充临时数组,最后将他推入 $arr:

$stmt->bind_result($tempArray["val1"], $tempArray["val2"], $tempArray["val3"]);

while ( $stmt->fetch () ) 
    array_push($arr, $tempArray);

问题是,在每个循环中,“array_push”都会覆盖$arr 中的数据。

例如我在$stmt->fetch()中循环了3次。

1.循环

$tempArray = [
    'val1' => "Hello",
    'val2' => 1,
    'val3' => 2
]

$arr = [
    0 = [
        'val1' => "Hello",
        'val2' => 1,
        'val3' => 2
    ];
]

2。循环

$tempArray = [
    'val1' => "Stack",
    'val2' => 3,
    'val3' => 4
]

$arr = [
    0 = [
        'val1' => "Stack",
        'val2' => 3,
        'val3' => 4
    ],
    1 = [
        'val1' => "Stack",
        'val2' => 3,
        'val3' => 4
    ];
]

3.循环

$tempArray = [
    'val1' => "Overflow",
    'val2' => 5,
    'val3' => 6
]

$arr = [
    0 = [
        'val1' => "Overflow",
        'val2' => 5,
        'val3' => 6
    ],
    1 = [
        'val1' => "Overflow",
        'val2' => 5,
        'val3' => 6
    ],
    2 = [
        'val1' => "Overflow",
        'val2' => 5,
        'val3' => 6
    ]
]

我以前从未见过这种行为,也不知道为什么会这样。

最后我想要的是:

$arr = [
    0 = [
        'val1' => "Hello",
        'val2' => 1,
        'val3' => 2
    ],
    1 = [
        'val1' => "Stack",
        'val2' => 3,
        'val3' => 4
    ],
    2 = [
        'val1' => "Overflow",
        'val2' => 5,
        'val3' => 6
    ]
]

$stmt 类(从@Stevish 请求)

$query = "...";
if ( $stmt = $this->db->prepare($query)) 
        $stmt->bind_param('i',  $xxx);
        $stmt->execute();
        $stmt->store_result();
        $$stmt->bind_result($tempArray["val1"], $tempArray["val2"], $tempArray["val3"]);
        while ( $stmt->fetch () ) 
            $arr[] = $tempArr;
        
    

【问题讨论】:

这能回答你的问题吗? bind_result into an array php mysqli prepared statement 【参考方案1】:

问题是您正在将对 $tempArray 的引用插入到 $arr 中。然后更改参考。通过第三个循环,您有 3 个对同一数组的引用。这就是为什么值以这种方式显示的原因......您可以用一种相当不直观的方式解决这个问题。

尝试:

$stmt->bind_result($tempArray["val1"], $tempArray["val2"],$tempArray["val3"]);
while ( $stmt->fetch () ) 
    $x = $tempArray; //This copies the values of $tempArray to $x and each loop will create a new x.
    array_push($arr, $x);

【讨论】:

这永远行不通。它不能解决引用问题。【参考方案2】:

试试:

while ( $stmt->fetch () ) 
    $arr[] = $tempArray;

变量后面的[] 只是让PHP 知道您正在向数组中添加一个新条目。它将根据您的需要被赋予一个数值 (0, 1, 2)。

【讨论】:

与以前相同的行为,数据被覆盖。 啊,我明白了。我认为这是在您的 $stmt->fetch() 函数中发生的。你能发布 $stmt 类的代码吗? 刚刚查看了手册页,发现您的代码和我的代码完全相同,我的只是开销较低 我已经在上面的问题中添加了我的课程:) 对不起,伙计。这超出了我的知识范围。我不确定如何处理所有这些绑定、执行和存储。我以前没有使用过这些命令。我使用完全不同的方法

以上是关于PHP MySQLi 获取“数组推送”覆盖数据的主要内容,如果未能解决你的问题,请参考以下文章

jQuery推送数组插入逗号

php 将元素添加到数组(推送)

php 数组推送会话

mysqli 和 php 代码无法将字段正确插入数据库

mysqli 用 php 中的备用变量覆盖空帖子

Laravel 中的数组推送