【问题标题】:mysqli statement: fetch() an array of resultsmysqli 语句:fetch() 一个结果数组
【发布时间】:2011-03-23 18:23:31
【问题描述】:

我使用 mysqli 扩展并将结果绑定到一个对象:

class Item {
    public $id, $name;
    }
$Item = new Item;
$stmt->bind_result($Item->id, $Item->name);

每次调用$stmt->fetch() 都会覆盖$Item 的属性,这些属性成为引用。如果我只是克隆对象——这些引用仍然存在,并且两个实例同时更改:

object(Item)#1 (2) {
  ["id"]=>
  &int(1)
  ["name"]=>
  &string(4) "name"
}

所以应该有一种方法可以取消引用它们,所以clone 确实会创建一个副本,而不是一组引用的数据。是否有一种简单、灵活的方法来检索所有数据,以便将其存储为对象数组?主要问题是如何删除引用:&string

我看到的唯一解决方案是实例化另一个对象并手动复制所有属性:

$Item2 = new Item;
foreach ($Item as $prop => $val)
    $Item2->$prop = $val;

但这似乎有点过头了:它会复制所有不必要的属性(包括一些实际上没有被引用的额外属性),而且 - 是对性能的惩罚。

【问题讨论】:

  • 实际上,我编写了一个类,它自动将结果字段绑定到对象。它唯一缺少的是存储行的选项,而不仅仅是迭代和忘记。

标签: php arrays mysqli resultset dereference


【解决方案1】:

您可以实现自己的 __clone() 魔术函数,以便创建对象的未引用副本。我认为它应该有效。

http://www.php.net/manual/en/language.oop5.cloning.php

<?php

class Item {
  public $id, $name;

  public function __clone() {
    $id = $this->id;
    unset($this->id);
    $this->id = $id;
    $name = $this->name;
    unset($this->name);
    $this->name = $name;
  }
}

$id = 1;
$name = 'o_0 Tync';

$i1 = new Item();
$i1->id = &$id;
$i1->name = &$name;

$i2 = clone $i1;

$id = 2;
$name = 'Mchl';
var_dump($i1,$i2);

输出

object(Item)#1 (2) {
  ["id"]=>
  &int(2)
  ["name"]=>
  &string(4) "Mchl"
}
object(Item)#2 (2) {
  ["id"]=>
  int(1)
  ["name"]=>
  string(8) "o_0 Tync"
}

丑得要命,但有效...

【讨论】:

  • 那么,没有已知的魔法可以取消引用属性吗? :)
【解决方案2】:

如果我理解正确,您想将数据提取到对象中吗? Mysql我有一个fetch_object方法/函数:http://www.php.net/manual/en/mysqli-result.fetch-object.php这样使用:

$foobar = $conn->escape_string($foobar);
$stmt = $conn->query("SELECT * FROM foo WHERE bar = '$foobar'");
while ($item = $stmt->fetch_object("Item")) {
    $items[] = $item;
}
$stmt->close();

【讨论】:

  • 它有,但我想为此使用准备好的语句:)
  • fetch_object() 是 mysqli_result 的一个方法,不幸的是它与 mysqli_stmt 无关
  • 哦,是的。所以你必须使用mysqli_query或者你自己的克隆解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-06
  • 2018-10-03
  • 1970-01-01
  • 2016-04-15
相关资源
最近更新 更多