【问题标题】:PHP MySQLi fetch "array push" overrides dataPHP MySQLi 获取“数组推送”覆盖数据
【发布时间】: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;
        }
    }

【问题讨论】:

标签: php mysql arrays mysqli


【解决方案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 类的代码吗?
  • 刚刚查看了手册页,发现您的代码和我的代码完全相同,我的只是开销较低
  • 我已经在上面的问题中添加了我的课程:)
  • 对不起,伙计。这超出了我的知识范围。我不确定如何处理所有这些绑定、执行和存储。我以前没有使用过这些命令。我使用完全不同的方法
猜你喜欢
  • 1970-01-01
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 2018-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多