Оператор mysqli: fetch() массив результатов
Я использую расширение MySQL и связываю результат с объектом:
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 ответа
Вы можете реализовать свою собственную магическую функцию __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"
}
Гадкий как черт, но работает...
Если я вас правильно понимаю, вы хотите извлечь данные в объекты? 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();