Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO将数据提取到对象问题_Php_Mysql_Sql_Pdo - Fatal编程技术网

Php PDO将数据提取到对象问题

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

我使用以下代码从表中获取数据并将其提取到名为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)
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的不同实例?谢谢