Php PDO将数据提取到对象问题
我使用以下代码从表中获取数据并将其提取到名为Question的对象:Php PDO将数据提取到对象问题,php,mysql,sql,pdo,Php,Mysql,Sql,Pdo,我使用以下代码从表中获取数据并将其提取到名为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 'questio
$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)
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)
但是,var_dump($this->allQA)代码>输出:
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)
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)
为什么会这样?为什么“第一个问题第一个答案”根本不出现而“第二个问题第二个答案”出现两次
提前感谢。将对象推送到数组时,默认情况下会通过引用传递对象,因此当您修改原始对象时,您放入数组中的所有实例也会被修改
这里是错误的地方:
array_push($this->allQA, $qa);
对于每个循环,变量$qa
接收$stmt
的下一个元素的值。由于先前推送到数组中的值已作为引用推送到数组中,这意味着对$qa
的任何修改也将影响先前的值。这导致所有值都等于您对$qa
所做的上一次修改,这是第二个答案
要修复它,您需要将对象的副本推送到数组,而不是引用。这可以通过使用克隆
-关键字来实现:
array_push($this->allQA, clone $qa);
您设置了获取模式,但我没有看到您实际获取数据:
$qas = stmt->fetchAll();
foreach($qas as $qa){
var_dump($qa);
array_push($this->allQA,$qa);
}
因为您正在推送同一个object实例(类似)。@hjpotter92,谢谢您的回答。我如何解决它并推送ojbect的不同实例?谢谢