PDO获取数据到对象问题

时间:2014-08-17 17:13:27

标签: 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 '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;第二个问题第二个答案"出现两次?

提前致谢。

2 个答案:

答案 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);
}