Оператор mysqli: fetch () массив результатов - PullRequest
1 голос
/ 01 августа 2010

Я использую расширение 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 ]

1 голос
/ 02 августа 2010

Вы можете реализовать свою собственную магическую функцию __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"
}

Гадкий как черт, но работает ...

0 голосов
/ 02 августа 2010

Если я правильно вас понимаю, вы хотите извлечь данные в объекты? MysqlI имеет метод / функцию 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();
...