代码之家  ›  专栏  ›  技术社区  ›  kolypto

mysqli语句:fetch()结果数组

  •  1
  • kolypto  · 技术社区  · 15 年前

    我使用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;
    

    但这似乎是一种过度杀戮:它会复制所有不必要的财产(包括一些未被实际引用的额外财产),而且_是对性能的惩罚。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Mchl    15 年前

    您可以实现自己的uuClone()魔术函数,这样它将创建一个未引用的对象副本。我认为它应该起作用。

    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
  •  0
  •   jmz    15 年前

    如果我正确理解您,您想将数据提取到对象中吗?mysqli有一个fetch对象方法/函数: 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();