我使用以下代码从表中获取数据并将其提取到名为Question的对象:
$stmt = $conn->query("SELECT * FROM QA");
$stmt->setFetchMode(PDO::FETCH_INTO,new QA);
foreach($stmt as $qa){
var_dump($qa);
array_push($this->allQA,$qa);
}
上面的代码输出:
object(QA)[5]
public 'question' => string 'first question' (length=14)
public 'answer' => string 'first answer' (length=12)
object(QA)[5]
public 'question' => string 'second question' (length=15)
public 'answer' => string 'second answer' (length=13)
但是,var_dump($this->allQA);
输出:
array (size=2)
0 =>
object(QA)[5]
public 'question' => string 'second question' (length=15)
public 'answer' => string 'second answer' (length=13)
1 =>
object(QA)[5]
public 'question' => string 'second question' (length=15)
public 'answer' => string 'second answer' (length=13)
为什么会这样?为什么"第一个问题第一个答案"并不会出现#34;第二个问题第二个答案"出现两次?
提前致谢。
答案 0 :(得分:1)
默认情况下,将对象推送到数组时,对象通过引用传递,因此当您修改原始对象时,您放入数组的所有实例也将被修改。
这里出错了:
array_push($this->allQA, $qa);
对于每个循环,变量$qa
接收$stmt
的下一个元素的值。由于先前推送到数组的值已被推送为引用,这意味着对$qa
的任何修改也会影响先前的值。这导致所有值都等于您对$qa
所做的最后修改,这是第二个答案。
要修复它,您需要将对象的副本推送到数组,而不是引用。这可以使用clone
- 关键字:
array_push($this->allQA, clone $qa);
答案 1 :(得分:0)
您设置了获取模式,但我没有看到您实际获取数据:
$qas = stmt->fetchAll();
foreach($qas as $qa){
var_dump($qa);
array_push($this->allQA,$qa);
}